matlab k-均值聚类评估

matlab k-means clustering evaluation

如何有效地评估标准 matlab k-means 实现的性能。

例如我有一个矩阵 X

X = [1  2;
     3  4;
     2  5;
     83 76;
     97 89] 

对于每个点,我都有一个黄金标准聚类。假设 (83,76)、(97,89) 是第一个集群,(1,2)、(3,4)、(2,5) 是第二个集群。然后我们运行 matlab

idx = kmeans(X,2)

并得到如下结果

idx = [1; 1; 2; 2; 2]

根据 NOMINAL 值,这是非常糟糕的聚类,因为只有 (2,5) 是正确的,但我们不关心标称值,我们只关心聚集在一起的点。因此,我们必须以某种方式确定只有 (2,5) 到达了错误的集群。

对于我这个 matlab 新手来说,评估聚类的性能并不是一项微不足道的任务。如果您能与我们分享您对如何评估绩效的想法,我将不胜感激。

评估 "best clustering" 有点模棱两可,尤其是当您在两个不同的组中有点可能最终会在其特征方面交叉时。当您遇到这种情况时,您如何准确定义这些点合并到哪个集群?这是来自 Fisher Iris dataset 的示例,您可以使用 MATLAB 对其进行预加载。让我们具体取萼片宽度和萼片长度,即数据矩阵的第三列和第四列,并绘制 setosavirginica 类:

load fisheriris;
plot(meas(101:150,3), meas(101:150,4), 'b.', meas(51:100,3), meas(51:100,4), 'r.', 'MarkerSize', 24)

这是我们得到的:

你可以看到在中间,有一些重叠。你很幸运,因为你事先知道集群是什么,所以你可以测量准确度是多少,但是如果我们要获得上述数据,我们 不知道每个点属于什么标签to,你怎么知道中间点属于哪个簇?


相反,您应该做的是通过多次 运行ning kmeans 尝试尽量减少这些分类错误。具体来说,您可以通过执行以下操作来覆盖 kmeans 的行为:

idx = kmeans(X, 2, 'Replicates', num);

'Replicates' 标志告诉 kmeans 到 运行 总共 num 次。在 运行ning kmeans num 次之后,输出成员资格是算法认为在所有这些时间 kmeans 运行 中最好的成员资格。我不会深入探讨,但他们确定了所有成员输出中的 "best" 平均值,并为您提供了这些值。

不设置 Replicates 标志显然默认为 运行ning 一次。因此,请尝试增加 kmeans 运行 的总次数,以便您更有可能获得更高质量的集群成员资格。通过设置 num = 10,这就是我们从您的数据中得到的:

X = [1  2;
     3  4;
     2  5;
     83 76;
     97 89];
num = 10;
idx = kmeans(X, 2, 'Replicates', num)

idx =

     2
     2
     2
     1
     1

您会看到前三个点属于一个聚类,而后两个点属于另一个聚类。即使 ID 被翻转了,也没关系,因为我们要确保组之间有明确的分隔。

关于 运行dom 算法的小说明

如果您查看上面的评论,您会注意到有几个人在您的数据上尝试了 运行ning kmeans 算法,并且他们收到了不同的聚类结果。原因是因为当 kmeans 为您的聚类中心选择初始点时,这些是 以 运行dom 方式选择的 。因此,根据他们的 运行dom 数字生成器处于什么状态,不能保证运行为一个人选择的初始点数与另一个人相同。

因此,如果您想要可重现的结果,您应该将 运行dom 种子生成器的 运行dom 种子设置为与 运行ning kmeans 之前相同.请注意,尝试将 rng 与一个事先已知的整数一起使用,例如 123。如果我们在上面的代码之前这样做,运行编写代码的每个人都能够重现相同的结果。

因此:

rng(123);
X = [1  2;
     3  4;
     2  5;
     83 76;
     97 89]; 
num = 10;
idx = kmeans(X, 2, 'Replicates', num)

idx = 

    1
    1
    1
    2
    2

这里的标签是颠倒的,但我保证运行如果上面的代码还有其他运行,它们将得到与上面每次生成的标签相同的标签。