【问题标题】:Find partial membership with KMeans clustering algorithm使用 KMeans 聚类算法查找部分成员
【发布时间】:2017-05-06 00:19:12
【问题描述】:

我可以很容易地用KMeans 计算集群成员:

open System
open System.IO
open Utils
open Accord
open Accord.Math 
open Accord.MachineLearning

let vals = [|
    [|1.0; 2.0; 3.0; 2.0|]
    [|1.1; 1.9; 3.1; 4.0|]
    [|2.0; 3.0; 4.0; 4.0|]    
    [|3.0; 3.1; 2.0; 3.0|]
    [|2.0; 4.0; 3.0; 6.0|]
    [|1.0; 5.0; 5.0; 7.0|]
    [|4.0; 3.0; 6.0; 8.0|]
    [|5.0; 4.0; 3.0; 6.0|]
    [|6.0; 4.0; 8.0; 7.0|]
    [|5.0; 6.0; 5.0; 9.0|]
    [|4.0; 2.0; 7.0; 8.0|]
    [|8.0; 9.0; 3.1; 2.2|]
    [|8.0; 9.0; 2.0; 2.0|]
    [|10.0; 2.0; 3.0; 2.0|]
    [|10.1; 1.9; 3.1; 4.0|]
    [|20.0; 3.0; 4.0; 4.0|]
    [|22.0; 7.0; 2.0; 3.0|]
    [|21.0; 4.0; 3.0; 6.0|]
|]

let kmeans = new KMeans 5
let clusterModel = kmeans.Learn vals
let clusters = clusterModel.Decide vals

我可以使用标准KMeans 算法计算部分成员吗?一位同事建议使用集群成员的均值和方差来确定比例成员资格,今天我一直在研究模糊集及其对F# 的实现。例如,here is some documentation for the Accord.net implementation for fuzzy sets. 我可以翻译/运行F# 的示例,但乍一看,我没有看到从上面运行的Kmeans 获取数据以适应分配部分成员资格的格式的简单方法。

问题:

  1. 如何使用集群成员的均值/方差来计算部分成员?

  2. 是否有一种简单的方法可以通过 Accord.net 库的 KMeans 聚类计算部分成员资格?

  3. Accord.net 中的 KMeans 算法实现简单;我应该花一些时间尝试学习这种聚类/成员关系方法以适应我的问题,而不是尝试强制 Kmeans 聚类以满足我的需要吗?

【问题讨论】:

    标签: c# f# hierarchical-clustering accord.net


    【解决方案1】:

    正如 Tomas 所述,Accord.NET 已经为您提供了许多构建块。特别是,调用 clusterModel.Scores 会为您提供到集群质心的(负)距离,see source code

    根据负距离,您可以通过指数计算近似的类成员分数,类似于计算高斯 PDF 的方法。在 F# 中,这看起来像:

    // Scores returns the negative distances between each point
    // and the cluster centroid
    let negDistances = clusterModel.Scores vals
    // Compute an estimated cluster assigment score
    let clusterMembership =
        negDistances
        |> Array.map (fun distances ->
            // Take the Exponential of the (negative) distances,
            // as in computing a Gaussian pdf
            let expDist = distances |> Array.map Math.Exp
            let total = Array.sum expDist
            expDist
            |> Array.map (fun d -> d/total)
        )
    

    这里有几个注意事项:

    • Accord 中的标准 KMeans 使用欧几里得距离,这意味着每个方向具有相同的权重。根据您数据的性质,这可能不会产生合理的结果(图 2 中的集群,每个集群的形状都像一根长雪茄)
    • 上述类成员计算也没有考虑集群协方差。为了更接近真相,您必须计算 Bhattacharyya 距离,取幂,然后按协方差矩阵的逆 det 进行缩放。对于单例集群,这将失败。

    关于你的第三个问题:我不会重新实现。一开始可能看起来很容易,但通常会遇到很多极端情况和稳定性问题,这些问题只是在一段时间后才会遇到。

    【讨论】:

      【解决方案2】:

      您应该能够使用accipt.net来获取K-Means算法发现的集群的“质心”。那些基本上是各种集群的中心。然后,您应该能够计算新数据点与每个质心之间的距离,以查看哪些质心靠近您的观点。 (Decide方法只返回第一个。)

      我还没有尝试过这个,但似乎KMeans公开Clusters,它是KMeansClusterCollection 987654327 @ property(请参阅the docs)。它还公开Distanceprythity返回数据点之间计算距离的函数。

      使用这些,您应该能够将数据点与所有集群的质心进行比较,并决定点对单个群集的近距离。

      从头开始实现k均值不是那么难(在这个问题上有一个@ 987654322),但似乎符合您在这个特殊情况下需要所有的信息 - 所以也许这就是你所需要的所有信息(在自定义实施中获取所有细节始终是最难的部分......)。

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 2019-07-14
        • 2014-11-29
        • 1970-01-01
        • 2018-01-21
        • 2015-02-05
        • 2019-11-27
        • 1970-01-01
        • 2013-11-18
        相关资源
        最近更新 更多