-2

我有 10 个矩阵,如下所示:

c1 = [1 428; 2 465; 3 513; 4 540];

c2 = [1 15292; 2 15438; 3 12201; 4 12321];

c3 = [1 5054; 2 2582; 3 2507];

c4 = [1 26602; 2 26708; 3 27178];

c5 = [1 191874; 2 191985; 3 192210; 4 192405];

c6 = [1 185704; 2 186012; 3 186964; 4 186820; 5 187446];

c7 = [1 65666; 2 65728; 3 65877; 4 65972; 5 66215; 6 66162];

c8 = [1 22427; 2 22524; 3 26163; 4 22720];

c9 = [1 26351; 2 26364; 3 26406; 4 26388];

c10 = [1 120188; 2 120256; 3 120411];

我必须编写一个代码,将这 10 个矩阵3根据它们的第 2 列使用kmeans.
我怎样才能做到这一点?

4

1 回答 1

1

这是一种方法:

  1. 把你所有的第二列变成一个自己的向量:

    C = [c1(:,2);c2(:,2);c3(:,2);c4(:,2);c5(:,2);...
         c6(:,2);c7(:,2);c8(:,2);c9(:,2);c10(:,2)];
    

    如果您希望拥有超过这 10 个矩阵,请考虑不存储单个数组,而是存储多维矩阵。

  2. kmeans使用新向量作为输入调用C并告诉它您想要3集群:

    [idx,~] = kmeans(C,3);  
    
  3. 如果你绘制你的结果,你会得到下图:

    plot(C(idx==1,1),'r.','MarkerSize',12)
    hold on
    plot(C(idx==2,1),'b.','MarkerSize',12)
    plot(C(idx==3,1),'g.','MarkerSize',12)
    

kmeans_vector

编辑

如果要弄清楚哪个矩阵属于哪个组,可以尝试以下方法。但是,它基于第一个矩阵元素是该矩阵的特征值的假设。如果所有矩阵元素最终都在同一个组中,它将起作用。一旦你的矩阵元素覆盖了很大的范围,这个假设就失效了。

  1. 将向量设置C为仅包含每个矩阵第二列的一个(此处为第一个)元素:

    C = [c1(1,2);c2(1,2);c3(1,2);c4(1,2);c5(1,2);...
         c6(1,2);c7(1,2);c8(1,2);c9(1,2);c10(1,2)];  
    
  2. 再次调用kmeans确定组:

    [idx,~] = kmeans(C,3);  
    
  3. 现在,用于find获取与组关联的索引值的索引。将这些存储在 a 中很重要,cell因为每组可能有不同数量的矩阵:

    CLUSTER{1} = find(idx==1);
    CLUSTER{2} = find(idx==2);
    CLUSTER{3} = find(idx==3);  
    

    存储的值CLUSTER告诉您哪个矩阵编号属于哪个组。CLUSTER{1}包含属于第一组的矩阵的数量。

  4. 最后,您可以通过绘图来可视化哪个矩阵属于哪个组:

    plot(CLUSTER{1},C(idx==1,1),'r.','MarkerSize',12)
    hold on
    plot(CLUSTER{2},C(idx==2,1),'b.','MarkerSize',12)
    plot(CLUSTER{3},C(idx==3,1),'g.','MarkerSize',12)  
    

    这会给你一个这样的情节:

    在此处输入图像描述

    - 轴上的值x对应于矩阵编号。例如,矩阵710属于中等组。

于 2013-08-20T17:17:00.160 回答