评估 K-means 准确性

Evaluating K-means accuracy

我在 MATLAB 中创建了一个定义了 4 个 patterns/classes 的 3 维随机数据集。我对数据应用了 K 均值算法,以查看 K 均值算法如何根据创建的 4 patterns/classes.

对我的样本进行分类

我需要以下方面的帮助;

  1. 我可以使用什么 function/code 来评估 K-means 算法正确识别样本 类 的程度?假设我设置 K=4 如下图所示:

  1. 如何自动识别类(K)个数?假设我的数据中的 类 未知?

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

衡量 "good" 聚类与已知 class 标签相比如何的基本指标称为纯度。现在这是一个监督学习的例子,你对外部指标有一些了解,它是基于真实世界数据的实例标签。

纯度的数学定义如下:

这句话的意思是,引用斯坦福大学一位教授的话here

To compute purity , each cluster is assigned to the class which is most frequent in the cluster, and then the accuracy of this assignment is measured by counting the number of correctly assigned documents and dividing by 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,则该簇被认为是 "pure",因为这表明该簇中的所有实例都具有相同的标签。这意味着您的原始标签 classification 非常好并且您的 Kmeans 做得很好。整个数据集的 "best" 纯度分数将等于原始的 K 聚类数,因为这意味着每个聚类的纯度分数均为 1。

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

回答你的第二个问题...在没有任何数据先验知识的情况下,选择你的 K 个聚类是 Kmeans 最困难的部分。有一些技术可以通过选择初始 K 数的簇和质心来减轻所出现的问题。最常见的可能是一种称为 Kmeans++ 的算法。我建议调查一下以获取更多信息。

除了纯度分数外,考虑使用以下聚类指标:归一化互信息 (NMI),信息变异 (VI ) 和 调整后的兰特指数 (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 and code