识别矩阵中的“簇”或“组”

数据挖掘 r 聚类
2021-10-13 16:04:47

我有一个填充了离散元素的矩阵,我需要将它们(使用 R)聚类到完整的组中。因此,例如,采用这个矩阵:

[A B B C A]  
[A A B A A]  
[A B B C C]  
[A A A A A]  

A 有两个独立的集群,C 有两个独立的集群,B 有一个集群。

我正在寻找的输出理想情况下会为每个集群分配一个唯一的 ID,如下所示:

[1 2 2 3 4]  
[1 1 2 4 4]  
[1 2 2 5 5]  
[1 1 1 1 1]

现在我编写了一个代码,它只通过迭代检查最近的邻居来递归地执行此操作,但是当矩阵变大(即100x100)时它会迅速溢出。

R中是否有内置函数可以做到这一点?我研究了光栅和图像处理,但没有运气。我确信它一定在外面。

2个回答

你认为在你的情况下距离测量是什么?

我假设这里有三个维度:

  • RowN (行号)
  • ColN (列号)
  • Value (值:A、B 或 C)

这意味着您从4x5矩阵中获得的数据如下所示:

Sample1 -> (1, 1, A)
Sample2 -> (1, 2, B)
...
Sample5 -> (1, 5, A)
Sample6 -> (2, 1, A)
...
Sample15 -> (3, 5, C)
...
Sample20 -> (4, 5, A)

是否value缩放?换句话说,是A < B < C

如果是,那么

在这种情况下,两者之间的距离将是:

Sqrt( (RowN1-RowN2)^2 + (ColN1-ColN2)^2 + (Value1-Value2)^2 )

如果value未缩放(常规分类变量),请使用适用于分类数据的 K-Means 的一些修改

因此,在 100x100 矩阵的情况下,您有 10000 个观察值和三个变量,这是非常微不足道的样本量。

我不确定您的问题是否属于聚类问题。在聚类中,您试图使用未标记的数据发现相似示例的聚类。在这里,您似乎希望枚举附近节点的现有“集群”。

老实说,我不知道 R 中有这样的函数。但是,就算法而言,我相信您正在寻找的是Connected-Component Labeling一种桶填充,用于矩阵。

维基百科文章在上面链接。那里提出的一种算法,称为单遍算法,如下所示:

One-Pass(Image)
        [M, N]=size(Image);
        Connected = zeros(M,N);
        Mark = Value;
        Difference = Increment;
        Offsets = [-1; M; 1; -M];
        Index = [];
        No_of_Objects = 0; 

   for i: 1:M :
       for j: 1:N:
            if(Image(i,j)==1)            
                 No_of_Objects = No_of_Objects +1;            
                 Index = [((j-1)*M + i)];           
                 Connected(Index)=Mark;            
                 while ~isempty(Index)                
                      Image(Index)=0;                
                      Neighbors = bsxfun(@plus, Index, Offsets');
                      Neighbors = unique(Neighbors(:));                
                      Index = Neighbors(find(Image(Neighbors)));                                
                      Connected(Index)=Mark;
                 end            
                 Mark = Mark + Difference;
            end
      end
  end

我想使用上面的方法很容易自己动手。