【问题标题】:Evaluating K-means accuracy评估 K-means 精度
【发布时间】:2023-03-21 14:39:01
【问题描述】:

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

我需要以下帮助;

  1. 我可以使用什么函数/代码来评估 K-means 算法正确识别样本类别的能力?假设我如下图所示设置 K=4:

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

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

【问题讨论】:

  • k 中选择 k 是出了名的困难。一个常见的“经验法则”是 sqrt(N) 可能是一个很好的起点。我不完全清楚你在问什么——你是想根据它正确识别的组成员数量对算法进行评分,给定你拥有的一些先验知识,还是只是要求它对随机数据进行分区?
  • 谢谢兰达克!是的,我想根据它正确识别的组成员数对算法进行评分,因此我需要为我的样本指定类别编号,以便与 Kmeans 分配的编号进行比较。

标签: matlab cluster-analysis k-means


【解决方案1】:

衡量您的聚类与已知类别标签相比有多“好”的一个基本指标称为纯度。现在,这是一个监督学习的示例,您对外部指标有所了解,该指标是基于真实世界数据的实例标签。

纯度的数学定义如下:

言下之意,引用斯坦福大学教授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-measure。如果可以的话,我建议调查一下。再次重申,这仅对监督学习有用,您预先了解标签系统,我相信您的问题就是这种情况。

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

【讨论】:

  • 不错的答案。我一直想知道您将如何计算准确度,因为k 中分配给集群的标签是任意的,因此如果您有已知的标签先验,我不知道究竟如何如果已知的标签 aprii 不可避免地与k 给出的标签不同,则您可以确定某物是否被准确分类。感谢这个精彩的答案! +1。
【解决方案2】:

除了纯度分数,考虑使用以下聚类指标:归一化互信息 (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)

因此,VI 会随着标签分配 X 和 Y 之间重叠的增加而减小。请参阅 Matlab 实现 here。最后,调整后的兰德指数定义为:

ARI = RI-E[RI] / (max RI - E[RI])
RI = TP + TN / (TP + FP + FN + TN)

因此,对于彼此相似的集群分配,ARI 接近 1。请参阅 Python 实现 here

如果您有兴趣根据数据自动选择聚类数 K,请考虑使用狄利克雷过程 (DP) K-means。请参阅papercode 了解更多信息。

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2015-03-06
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2014-07-04
    • 2020-05-28
    相关资源
    最近更新 更多