Mengidentifikasi "kelompok" atau "kelompok" dalam sebuah matriks

7

Saya memiliki matriks yang diisi dengan elemen diskrit, dan saya perlu mengelompokkannya (menggunakan R) ke dalam kelompok utuh. Jadi, misalnya, ambil matriks ini:

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

Akan ada dua kelompok terpisah untuk A, dua kelompok terpisah untuk C, dan satu kelompok untuk B.

Output yang saya cari idealnya akan menetapkan ID unik untuk setiap cluster, seperti ini:

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

Saat ini saya menulis kode yang melakukan ini secara rekursif dengan hanya mengecek tetangga terdekat, tetapi dengan cepat meluap ketika matriks menjadi besar (yaitu, 100x100).

Apakah ada fungsi bawaan di R yang bisa melakukan ini? Saya melihat ke dalam raster dan pemrosesan gambar, tetapi tidak berhasil. Saya yakin itu pasti ada di luar sana.

pengguna3037237
sumber

Jawaban:

2

Menurut Anda apa ukuran jarak dalam kasus Anda?

Saya berasumsi ada tiga dimensi di sini:

  • RowN (nomor baris)
  • ColN (nomor kolom)
  • Value (nilai: A, B atau C)

Itu berarti data yang Anda dapatkan dari 4x5matriks terlihat seperti:

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

Apakah valuediskalakan? Dengan kata lain, bukan A < B < C?

Jika ya, maka

Dalam hal ini jarak antara keduanya adalah:

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

Jika valuetidak diskalakan (variabel kategori reguler), gunakan beberapa modifikasi K-Means yang berfungsi dengan data kategorikal .

Jadi dalam kasus 100x100 matriks Anda memiliki 10.000 pengamatan dan tiga variabel, yang merupakan ukuran sampel yang sangat sepele.

IharS
sumber
1

Saya tidak yakin apakah pertanyaan Anda diklasifikasikan sebagai masalah pengelompokan. Dalam pengelompokan Anda mencoba menemukan kelompok contoh serupa menggunakan data tidak berlabel. Di sini, tampaknya Anda ingin menghitung "cluster" yang ada dari node terdekat.

Sejujurnya, saya tidak tahu fungsi seperti itu di R. Tapi, sejauh menyangkut algoritma, saya percaya apa yang Anda cari adalah Connected-Component Labeling . Jenis isi ember, untuk matriks.

Artikel wikipedia tertaut di atas. Salah satu algoritma yang disajikan di sana, disebut sebagai algoritma single-pass, adalah sebagai berikut:

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

Saya kira itu akan mudah untuk roll sendiri menggunakan di atas.

insys
sumber