要评估“最佳聚类”有点含糊不清,特别是如果您有两个不同的组中的点,最终可能会跨越其功能。当你得到这种情况时,你究竟如何定义这些点合并到哪个群集?这里有一个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
你会看到,前三站属于一个集群,而最后两个点属于另一个。即使身份证被翻转,也无所谓,因为我们希望确保各组之间有明确的分离。
与问候小纸条随机算法
如果你看看上面的评论,你会发现,有几个人试图对数据运行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
这里的标签被逆转,但我保证,如果任何其他运行在上面的代码,他们会得到相同的标记作为发生了什么,每次上面生产的。
我在MATLAB 2013a上运行了你的代码,并得到了idx = [1; 1; 1; 2; 2],看起来不错。 – lanpa
我得到了与MATLAB R2012b中的@lanpa相同的结果。你正在使用哪个版本? – VHarisop
只是为了比较,与R2014a我得到[2; 2; 2; 1; 1]。 –