【问题标题】:Clustering 3d scatter data using k-means clustering in matlab在matlab中使用k-means聚类对3d散点数据进行聚类
【发布时间】:2017-07-17 20:12:51
【问题描述】:

我有一个以数组形式组织的 3d 散点图。当我将数据绘制为 3d 散点图时,我获得了 2 个清晰的集群 - 左侧一个较小的一个,右侧一个大的。

我已经尝试过 k-means 聚类,但我获得了这 2 个聚类,而不是我想要的两个:

这是我的代码:

opts = statset('Display','final');
[idx,C] = kmeans(data,2,'Distance','cityblock',...'Replicates',5,'Options',opts);
figure;
plot3(data(idx==1,1),data(idx==1,2),data(idx==1,3),'r.','MarkerSize',12)
plot3(data(idx==2,1),data(idx==2,2),data(idx==2,3),'b.','MarkerSize',12)
plot3(C(:,1),C(:,2),C(:,3),'cx',...'MarkerSize',15,'LineWidth',3)
legend('Cluster 1','Cluster 2','Centroids',...'Location','NW')
title 'Cluster Assignments and Centroids'
hold off

如何更改我的代码以便获得 2 个集群(左侧一小块,右侧一大块),而不是我现在拥有的上下集群?非常感谢!

【问题讨论】:

  • 在绘制质心时是否有拼写错误,plotplot3
  • 不,我不这么认为..因为 plot3 用于 3 个参数,但只有 2 个质心参数。
  • 那么你应该得到 2 个质心,每个质心都是 3 维的,否则会出现非常错误的情况。
  • 是的,如上图所示,我确实得到了 2 个质心。然而,它并没有像我希望的那样聚集,从左到右分裂。相反,它上下分裂。我想知道如何修复我的代码,以便按照我想要的方式对其进行聚类?
  • 我理解这个问题。你能说明你的质心的值吗?我问的原因是它们可能根本没有被正确绘制。

标签: matlab plot 3d k-means scatter


【解决方案1】:

变换左右数据 *10 为变量添加权重,这应该会导致你想要的集群分裂

【讨论】:

    【解决方案2】:

    更改为 plot3 并添加 C(:,3),这对我有用:

    data=rand(100,3);
    data=[data;2+rand(50,3)];
    
    opts = statset('Display','final');
    [idx,C] = kmeans(data,2,'Distance','cityblock','Replicates',5,'Options',opts);
    figure(1);cla;gca;hold on;
    plot3(data(idx==1,1),data(idx==1,2),data(idx==1,3),'r.','MarkerSize',12)
    plot3(data(idx==2,1),data(idx==2,2),data(idx==2,3),'b.','MarkerSize',12)
    plot3(C(:,1),C(:,2),C(:,3),'cx','MarkerSize',15,'LineWidth',3)
    legend('Cluster 1','Cluster 2','Centroids','Location','NW')
    title('Cluster Assignments and Centroids');
    hold off
    

    【讨论】:

    • 嗨,非常感谢您对质心绘图的帮助 - 这使质心绘图变得更好。但是,它仍然会上下聚类(它将散点图上下拆分),而不是将左侧聚类聚类为一种颜色,将右侧聚类聚类为另一种颜色。我想知道我是否可以将集群从上/下更改为左/右,如果这有意义的话。谢谢!
    • 该算法不知道“向上”“向下”,它只知道 N 维中点之间的距离(在您的情况下为 3)。如前所述,您可以尝试不同的距离度量,或者如果您可以尝试不同的起始位置'Start','sample'。如果您知道大致的位置,您甚至可以指定这些位置。您可以在文档k-means 中阅读更多相关信息。
    • 我明白你的意思......你对我应该如何改变我的 k-means 以获得我想要的左/右集群有什么建议吗?再次感谢您。
    • 尝试其他距离函数:('Distance','cityblock')
    猜你喜欢
    • 2013-02-14
    • 2016-07-28
    • 2015-06-22
    • 2015-03-06
    • 2012-03-24
    • 1970-01-01
    • 2011-06-06
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多