matlab - 评估 K-means 准确性

标签 matlab cluster-analysis k-means

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

我需要以下方面的帮助;

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

enter image description here

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

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

最佳答案

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

纯度的数学定义如下:

enter image description here

这句话的意思是,引用斯坦福大学教授的话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.

一个简单的例子是,如果您有一个非常简单的聚类,它是通过 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。如果可以的话,我建议您调查一下。再次重申,这仅对监督学习有用,在这种情况下,您对标签系统有预先了解,我相信您的问题就是这种情况。

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

关于matlab - 评估 K-means 准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28800447/

相关文章:

python - 是否有相当于 MATLAB 的 conv2(h1,h2,A ,'same' ) 的 python ?

algorithm - 聚类+回归——正确与否?

machine-learning - 在 Spark 中使用 Silhouette 聚类

matlab - 在 MATLAB 中将大型邻接矩阵转换为边列表的有效方法?

matlab - 如何为 Matlab 提供它想要的旧 gcc 版本?

python - scipy 中的层次聚类 - 内存错误

python - 当混合有分类数据和数值数据时,如何在 k 均值中找到 k?

python-2.7 - 使用杰卡德相似度对分类数据进行聚类

c++ - Matlab中的USRPs并行控制

algorithm - 嘈杂数据集中的二维模式匹配