【问题标题】:matlab k-means clustering evaluation [duplicate]matlab k-means聚类评估
【发布时间】:2015-03-06 20:12:00
【问题描述】:

如何有效地评估标准 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]

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

对我来说,matlab 中的新手评估聚类性能并不是一项简单的任务。如果您能与我们分享您对如何评估性能的想法,我们将不胜感激。

【问题讨论】:

  • 我在 MATLAB 2013a 上运行了你的代码,得到了 idx = [1; 1个; 1个; 2; 2],看起来不错。
  • 我在 MATLAB R2012b 中得到与@lanpa 相同的结果。你用的是哪个版本?
  • 只是为了比较,使用 R2014a 我得到 [2;2;2;1;1]。
  • 结果不是问题的重点,重点是在给定金标准聚类的情况下如何评估matlab k-means的性能。

标签: matlab k-means


【解决方案1】:

评估“最佳聚类”有点模棱两可,尤其是当您在两个不同组中的点可能最终在其特征方面交叉时。当您遇到这种情况时,您如何准确定义这些点合并到哪个集群?这是来自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)

这是我们得到的:

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


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

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

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

不设置Replicates 标志显然默认运行一次。因此,尝试增加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 被翻转了,也没关系,因为我们希望确保组之间有明确的分隔。

关于随机算法的小提示

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

因此,如果您想要可重现的结果,您应该在运行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

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

【讨论】:

  • “你很幸运,因为你事先知道集群是什么,所以你可以测量准确度是多少”这正是问题的重点,如何在给定金标准的情况下测量准确度,正如我在示例中所展示的,这并非微不足道
  • @fog - 这又是模棱两可的。集群 ID 的排列是随机的。例如,kmeans 的理想输出将是 [1 1 1 2 2][2 2 2 1 1]。我们不知道这些 ID 将如何分配,因此尝试计算分类准确度并不容易......所以我在那里没有答案!最后,我可以建议增加重复次数以减少错误分类的可能性。祝你好运!
猜你喜欢
  • 2018-06-07
  • 2013-02-14
  • 2023-03-21
  • 2015-04-11
  • 2015-03-07
  • 2011-08-13
  • 2013-08-08
  • 2018-01-14
  • 2016-05-23
相关资源
最近更新 更多