Matlab 评价K-均值精度

Matlab 评价K-均值精度,matlab,cluster-analysis,k-means,Matlab,Cluster Analysis,K Means,我在MATLAB中创建了一个包含4个定义模式/类的三维随机数据集。我在数据上应用了K-means算法,以查看K-means如何根据创建的4个模式/类对我的样本进行分类 我需要以下方面的帮助 我可以使用什么函数/代码来评估K-means算法正确识别样本类的程度?假设我设置K=4,如下图所示: 如何自动识别类别数(K)?假设我的数据中的类未知 我的目标是评估K-mean的准确性,以及数据的变化(通过预处理)如何影响算法识别类的能力。带有MATLAB代码的示例将很有帮助 与已知的类标签相比,衡量集

我在MATLAB中创建了一个包含4个定义模式/类的三维随机数据集。我在数据上应用了K-means算法,以查看K-means如何根据创建的4个模式/类对我的样本进行分类

我需要以下方面的帮助

  • 我可以使用什么函数/代码来评估K-means算法正确识别样本类的程度?假设我设置K=4,如下图所示:
  • 如何自动识别类别数(K)?假设我的数据中的类未知

    我的目标是评估K-mean的准确性,以及数据的变化(通过预处理)如何影响算法识别类的能力。带有MATLAB代码的示例将很有帮助

    与已知的类标签相比,衡量集群“良好”程度的一个基本指标称为纯度。现在,这是一个监督学习的例子,您对外部度量有了一些想法,它是基于真实世界数据的实例标记

    纯度的数学定义如下:

    换句话说,这意味着引用斯坦福大学一位教授的话

    为了计算纯度,将每个簇分配给簇中最频繁的类,然后通过计算正确分配的文档数并除以N来测量该分配的准确性。 一个简单的例子是,如果您有一个非常简单的集群,它是通过k=2的Kmeans生成的,看起来像:

    Cluster1    Label
      1           A         
      5           B
      7           B
      3           B
      2           B
    
    Cluster2    Label
      4           A
      6           A
      8           A
      9           B
    
    在Cluster1中有4个标签B的实例和1个标签A的实例,Cluster2有3个标签A的实例和1个簇B的实例。现在,您正在寻找总纯度,这将是每个簇的纯度之和,在这种情况下,k=2。因此,Cluster1的纯度是相对于给定标签的最大实例数除以Cluster1中的实例总数

    因此,Cluster1的纯度为:

    4/5 = 0.80
    
    这四个原因是出现次数最多的标签(
    B
    )出现了4次,集群中总共有5个实例

    因此,这表明Cluster2的纯度为:

    3/4 = 0.75
    
    现在总纯度就是纯度的总和,即
    1.55
    。那么这告诉我们什么呢?如果集群的纯度为1,则认为该集群为“纯”,因为这表示该集群中的所有实例都具有相同的标签。这意味着您的原始标签分类非常好,并且您的Kmeans做得非常好。整个数据集的“最佳”纯度分数将等于原始K个簇,因为这意味着每个簇的单个纯度分数为1

    然而,你需要意识到纯度并不总是最好或最能说明问题的指标。例如,如果你有10个点,并且你选择了k=10,那么每个簇的纯度为1,因此总纯度为10,等于k。在这种情况下,最好使用不同的外部指标,如精度、召回率和F-measure。如果可以的话,我建议你调查一下。再次重申,这只在有监督的学习中有用,因为你对标签系统有预先了解,我相信你的问题就是这样


    要回答你的第二个问题。。。对于Kmeans来说,在没有任何数据先验知识的情况下,选择K个集群是最困难的部分。有一些技术可以通过选择簇和质心的初始K个数来缓解出现的问题。可能最常见的是一种称为Kmeans++的算法。我建议进一步了解这一点

    >P>除了纯度得分外,还考虑使用以下聚类指标:归一化互信息(NMI)、信息变化(VI)和调整后的兰德指数(ARI)。给定预测的标签分配X和地面真值标签Y,NMI定义为:

    NMI(X;Y) = I(X;Y) / ((H(X)+H(Y))/2
    
    VI(X;Y) = H(X)+H(Y)-2I(X;Y) = H(X|Y) + H(Y|X)
    
    ARI = RI-E[RI] / (max RI - E[RI])
    RI = TP + TN / (TP + FP + FN + TN)
    
    其中H(X)是熵,I(X;Y)是互信息。当X和Y之间的重叠增加时,NMI接近1。参见Matlab实现。信息的变化定义为:

    NMI(X;Y) = I(X;Y) / ((H(X)+H(Y))/2
    
    VI(X;Y) = H(X)+H(Y)-2I(X;Y) = H(X|Y) + H(Y|X)
    
    ARI = RI-E[RI] / (max RI - E[RI])
    RI = TP + TN / (TP + FP + FN + TN)
    
    因此,VI随着标签指定X和Y之间重叠的增加而减少。参见Matlab实现。最后,调整后的兰德指数定义为:

    NMI(X;Y) = I(X;Y) / ((H(X)+H(Y))/2
    
    VI(X;Y) = H(X)+H(Y)-2I(X;Y) = H(X|Y) + H(Y|X)
    
    ARI = RI-E[RI] / (max RI - E[RI])
    RI = TP + TN / (TP + FP + FN + TN)
    
    因此,对于彼此相似的集群分配,ARI接近1。请参阅Python实现


    <>如果你有兴趣根据数据自动选择聚类数K,考虑使用Dirichlet过程(DP)k-均值。有关更多信息,请参阅和。

    在k-means中选择k是出了名的困难。一个常见的“经验法则”是sqrt(N)可能是一个很好的起点。我不完全清楚你在问什么——如果你有一些先验知识,你想根据算法正确识别的组成员数对算法进行评分,还是你只是要求它对随机数据进行分区?谢谢Landak!是的,我想根据正确识别的组成员数对算法进行评分,因此我需要为我的样本指定类号,以便与Kmeans分配的数字进行比较。回答得好。我一直想知道如何计算准确度,因为在
    k
    中指定给集群的标签是任意的,所以如果有先验已知的标签,我不知道如果已知的标签不可避免地与
    k
    means给出的标签不同,你如何准确地确定某个东西是否被准确分类。谢谢你的回答+1.