マトリックス内の「クラスター」または「グループ」の識別


7

個別の要素が入力されたマトリックスがあり、それらを(Rを使用して)そのままのグループにクラスター化する必要があります。したがって、たとえば、次のマトリックスを見てください。

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

Aには2つの個別のクラスター、Cには2つの個別のクラスター、Bには1つのクラスターがあります。

私が探している出力は、理想的には次のような一意のIDを各クラスターに割り当てます。

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

今、私は最近傍を繰り返しチェックするだけで再帰的にこれを行うコードを書きましたが、行列が大きくなると(つまり、100x100)すぐにオーバーフローします。

これを行うことができるRの組み込み関数はありますか?ラスターと画像処理を調べましたが、うまくいきませんでした。私はそれがそこにあるに違いないと確信しています。


回答:


2

あなたの場合、距離の測定はどう思いますか?

ここには3つの次元があると思います。

  • 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

はいの場合、

  • あなたは置き換えることができ{A, B, C}{0, 1, 2}(またはかもしれ{10, 11, 12}、あなたはこの差はRowNとコルン属性よりも重要であることしたい場合)
  • データを正規化する
  • たとえば、RパッケージのK-Meansクラスタリングアルゴリズム(http://stat.ethz.ch/R-manual/R-patched/library/stats/html/kmeans.html)をstats使用します

その場合、2つの間の距離は次のようになります。

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

valueがスケーリングされていない場合(通常のカテゴリ変数)、カテゴリデータを処理するK-Meansのいくつかの変更を使用します

したがって、100x100の行列の場合、10000の観測値と3つの変数があり、これはサンプルのサイズはかなり簡単です。


1

あなたの質問がクラスタリングの問題に分類されるかどうかはわかりません。クラスタリングでは、ラベル付けされていないデータを使用して、類似した例のクラスタを発見しようとしています。ここでは、近くのノードの既存の「クラスター」を列挙したいようです。

正直なところ、私はRでそのような関数を知りません。しかし、アルゴリズムに関する限り、あなたが探しているのはConnected-Component Labelingだと思います。マトリックス用のバケットの種類。

ウィキペディアの記事は上にリンクされています。そこで提示されているアルゴリズムの1つは、シングルパスアルゴリズムと呼ばれ、次のとおりです。

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

上記を使って自分でロールするのは簡単だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.