使用KMeans聚类算法查找部分成员资格

Ste*_*ven 9 c# f# hierarchical-clustering accord.net

我可以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
Run Code Online (Sandbox Code Playgroud)

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

问题:

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

  2. 有没有一种简单的方法来计算KMeans使用Accord.net库进行聚类的部分成员资格?

  3. Accord.net中的KMeans算法易于实现; 我是否应该花一些时间尝试学习这种聚类/成员资格的方法以适应我的问题,而不是试图强迫Kmeans聚类以满足我的需求?

Ant*_*fer 3

正如 Tomas 所提到的,Accord.NET 已经为您提供了许多构建块。特别是,调用clusterModel.Scores可以为您提供到簇质心的(负)距离,请参阅源代码

根据负距离,您可以通过指数计算近似的类别成员分数,类似于计算高斯 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)
    )
Run Code Online (Sandbox Code Playgroud)

这里有一些注意事项:

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

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