matlab k-means聚类评估

时间:2015-01-08 16:21:21

标签: matlab k-means

如何有效评估标准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中的新手并不是评估聚类性能的一项微不足道的任务。如果您能与我们分享您对如何评估绩效的想法,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

评估"最佳聚类"有点含糊不清,特别是如果你有两个不同组的分数,最终可能会相对于他们的特征。当您遇到这种情况时,您究竟如何定义这些点合并到哪个集群?以下是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)

这就是我们得到的:

enter image description here

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


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

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

'Replicates'标记告诉kmeans共运行num次。运行kmeans num次后,输出成员资格是算法认为在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被翻转,但它并不重要,因为我们希望确保组之间存在明显的分离。

关于随机算法的次要说明

如果您查看上面的评论,您会注意到有几个人尝试在您的数据上运行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

这里的标签是相反的,但我保证如果其他任何人运行上面的代码,他们将获得与每次上面生成的标签相同的标签。