如何有效评估标准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中的新手并不是评估聚类性能的一项微不足道的任务。如果您能与我们分享您对如何评估绩效的想法,我将不胜感激。
答案 0 :(得分:2)
评估"最佳聚类"有点含糊不清,特别是如果你有两个不同组的分数,最终可能会相对于他们的特征。当您遇到这种情况时,您究竟如何定义这些点合并到哪个集群?以下是Fisher Iris dataset中您可以预先加载MATLAB的示例。让我们专门取萼片宽度和萼片长度,即数据矩阵的第三和第四列,并绘制setosa
和virginica
类:
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
次。运行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
这里的标签是相反的,但我保证如果其他任何人运行上面的代码,他们将获得与每次上面生成的标签相同的标签。