2015-01-08 63 views
0

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

根据标称值,这是非常糟糕的群集,因为只有(2,5)是正确的,但我们不关心标称值,我们只关心聚集在一起的点。因此,我们不得不确定只有(2,5)得到不正确的群集。

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

+0

我在MATLAB 2013a上运行了你的代码,并得到了idx = [1; 1; 1; 2; 2],看起来不错。 – lanpa

+0

我得到了与MATLAB R2012b中的@lanpa相同的结果。你正在使用哪个版本? – VHarisop

+0

只是为了比较,与R2014a我得到[2; 2; 2; 1; 1]。 –

回答

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时间运行。在运行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 

你会看到,前三站属于一个集群,而最后两个点属于另一个。即使身份证被翻转,也无所谓,因为我们希望确保各组之间有明确的分离。

与问候小纸条随机算法

如果你看看上面的评论,你会发现,有几个人试图对数据运行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 

这里的标签被逆转,但我保证,如果任何其他运行在上面的代码,他们会得到相同的标记作为发生了什么,每次上面生产的。

+0

“你很幸运,因为你事先知道集群是什么样的,所以你可以测量准确度是什么”这正是问题的要点,如何以我的例子显示的金标准衡量准确度,这不是微不足道的 – com

+0

@雾 - 这又是含糊不清的。群集ID的排列是随机的。例如,“kmeans”的理想输出可以是“[1 1 1 2 2]”或“[2 2 2 1 1]”。我们不知道如何分配这些ID,因此尝试计算分类准确性并不容易......所以我在那里没有答案!最后,我可以建议增加重复次数以减少错误分类的概率。祝你好运! – rayryeng