Matlab:kmeans聚类给出了意料之外的聚类

3

例子:

load kmeansdata %provides X variable
Y=bsxfun(@minus,X,mean(X,2))'/sqrt(size(X,2)-1); %normalized and means adjusted
[~,~,PC] = svd(Y); %
plot(PC(:,1),PC(:,2),'m.','markersize',15)

绘制前两列,您将得到看起来像3个聚类的图形。我想使用kmeans识别这些聚类,并以不同颜色绘制聚类作为证明。我尝试过:

[idx,cntrd] = kmeans(PC(:,1:2),3,'Distance','sqEuclidean');%,'Distance','correlation');

cluster=3;
Col = {'.b','.r','.g','.y','.m','.c','.k'}; % Cell array of colours.
figure;
hold on
for clus=1:cluster
  plot(PC(idx==clus,1),PC(idx==clus,2),Col{clus},'MarkerSize',12)  
end
plot(cntrd(:,1),cntrd(:,2),'kx','MarkerSize',15,'LineWidth',3) %plotting the centroids of the clusters

集群中心点偏离了,颜色也不如预期。有人能帮忙吗?

编辑:有些问题已经得到解答:

我从mathworks网站复制了这段代码,并替换了我的kmeans命令:

opts = statset('Display','final');
[idx,C] = kmeans(PC(:,1:2),3,'Distance','cityblock',...
    'Replicates',5,'Options',opts);

看起来它能工作,但我不太理解opts的作用。我假设复制只是重复kmeans五次,并为质心选择某种平均值。我还重新启动了matlab,以防出现某种故障。

编辑:忽略上面:

我以为问题已经解决了,所以我尝试着寻找合适的k值。我输入了k=1,运行了一切,然后k=2,然后k=3,我注意到我再次犯了同样的错误。


请查看http://www.mathworks.com/help/stats/statset.html,了解`opts`的作用。似乎`Display`属性只影响函数的控制台输出,即它提供的反馈信息。顺便说一句,我认为你关于`replicate`是正确的:http://www.mathworks.com/help/stats/kmeans.html#bueftl4-1 - Dan
你尝试将复制参数数字增加到5以上了吗? - Dan
@Dan,我把复制次数改成了10(同样没有距离名称/对),但结果更糟了。之前至少最后(右侧)的聚类中心是正确的,并且全部标为绿色,现在所有3个聚类都是错误的。需要图片吗? - CaptainObv
在拍摄变化重复和重复/距离名称对的照片时,似乎现在使用城市街区方法是有效的,无论是5次还是10次。我不太确定为什么以前它不起作用。如果我多次使用城市街区和5次重复运行代码,我是否总会得到相同的结果?或者我在运行时意外犯了一个错误。 - CaptainObv
没有看到你所看到的,很难判断你图片上的问题。 - Has QUIT--Anony-Mousse
显示剩余2条评论
1个回答

0
kmeans 对于初始质心的位置比较敏感。问题似乎出在选择起始点的算法上。例如,可以通过运行以下代码获得预期答案:
[idx,cntrd] = kmeans(PC(:,1:2),3, 'start', [-0.05 0; 0 0; 0.05  0]);

外表有时也会欺骗人。在这种情况下,数据的分散在x和y维度上并不相等。因此,对于某些点对来说,欧几里得距离在视觉聚类之间并不像在聚类内部那样远。

您可以考虑使用高斯分布模型来处理这些数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接