我在MATLAB中创建了一个包含4个定义模式/类的三维随机数据集。我在数据上应用K-means算法,看看K-means如何根据创建的4个模式/类对我的样本进行分类。
我需要以下帮助;
我的目标是评估K-mean的准确性以及数据的变化(通过预处理)如何影响算法识别类的能力。 MATLAB代码的示例会很有用!
答案 0 :(得分:9)
衡量"好"的一个基本指标与已知类标签相比,您的聚类称为纯度。现在,这是一个监督学习的例子,您可以根据现实世界数据了解实例标签的外部指标。
纯度的数学定义如下:
用语言来说,这意味着,引自斯坦福大学教授here,
要计算纯度,将每个群集分配给群集中最常见的类,然后通过计算正确分配的文档数并除以N来测量此分配的准确性。
一个简单的例子就是如果你有一个非常幼稚的聚类,它是通过Kmeans生成的,k = 2看起来像:
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度量。如果可以,我建议调查一下。再次重申一下,这只适用于有监督的学习,在这种情况下,您可以预先了解标签系统,我认为这是您提出的问题。
回答你的第二个问题......如果没有任何先前的数据知识,选择你的K个群集对于Kmeans来说是最困难的部分。有一些技术可以通过选择初始K数量的聚类和质心来缓解所提出的问题。可能最常见的是一种名为Kmeans ++的算法。我建议调查一下以获取更多信息。
答案 1 :(得分:3)
除纯度分数外,请考虑使用以下聚类指标:规范化互信息(NMI),信息变异(VI)和调整后的Rand指数(ARI)。给定预测的标签分配X和地面实况标签Y,NMI定义为:
NMI(X;Y) = I(X;Y) / ((H(X)+H(Y))/2
其中H(X)是熵而I(X; Y)是互信息。随着X和Y之间的重叠增加,NMI接近1.参见Matlab实现here。信息的变化定义为:
VI(X;Y) = H(X)+H(Y)-2I(X;Y) = H(X|Y) + H(Y|X)
因此,随着标签分配X和Y之间的重叠增加,VI减小。请参阅Matlab实现here。最后,调整后的兰德指数定义为:
ARI = RI-E[RI] / (max RI - E[RI])
RI = TP + TN / (TP + FP + FN + TN)
因此,对于彼此相似的群集分配,ARI接近1。请参阅Python实现here。
如果您有兴趣根据数据自动选择簇数K,请考虑使用Dirichlet Process(DP)K-means。有关详细信息,请参阅paper和code。