Identificazione di "cluster" o "gruppi" in una matrice


7

Ho una matrice che è popolata con elementi discreti e ho bisogno di raggrupparli (usando R) in gruppi intatti. Quindi, ad esempio, prendi questa matrice:

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

Ci sarebbero due cluster separati per A, due cluster separati per C e un cluster per B.

L'output che sto cercando assegnerebbe idealmente un ID univoco a ciascun cluster, qualcosa del genere:

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

In questo momento ho scritto un codice che lo fa in modo ricorsivo controllando solo ripetutamente il vicino più vicino, ma trabocca rapidamente quando la matrice diventa grande (cioè 100x100).

Esiste una funzione integrata in R che può fare questo? Ho esaminato l'elaborazione raster e delle immagini, ma senza fortuna. Sono convinto che debba essere là fuori.


Risposte:


2

Cosa pensi sia la misura della distanza nel tuo caso?

Presumo che ci siano tre dimensioni qui:

  • RowN (numero di riga)
  • ColN (numero colonna)
  • Value (valore: A, B o C)

Ciò significa che i dati ottenuti dalla 4x5matrice sono simili:

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

È valueridimensionato? In altre parole, è A < B < C?

Se sì, allora

In tal caso la distanza tra due sarà:

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

Se valuenon viene ridimensionato (normale variabile categoriale), utilizzare alcune modifiche di K-Mezzi che funzionano con dati categorici .

Quindi, nel caso di matrice 100x100, hai 10000 osservazioni e tre variabili, che è una dimensione del campione piuttosto banale.


1

Non sono sicuro che la tua domanda sia classificata come un problema di clustering. Nel clustering si sta cercando di scoprire cluster di esempi simili utilizzando dati senza etichetta. Qui, sembra che tu voglia elencare i "cluster" esistenti di nodi vicini.

Ad essere onesti, non ho idea di una tale funzione in R. Ma, per quanto riguarda l'algoritmo, credo che ciò che stai cercando sia l' etichettatura dei componenti collegati . Tipo di riempimento a secchio, per matrici.

L'articolo di Wikipedia è collegato sopra. Uno degli algoritmi qui presentati, chiamato algoritmo single-pass, è il seguente:

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

Immagino che sarebbe facile realizzarne uno usando quanto sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.