2011-11-04 17 views
6

Ho un set di dati bidimensionale semplice che desidero raggruppare in modo agglomerato (non conoscendo il numero ottimale di cluster da utilizzare). L'unico modo in cui sono riuscito a raggruppare correttamente i miei dati è assegnando alla funzione un valore 'maxclust'.Clustering agglomerato in Matlab

Per semplicità, diciamo che questo è il mio set di dati:

X=[ 1,1; 
    1,2; 
    2,2; 
    2,1; 
    5,4; 
    5,5; 
    6,5; 
    6,4 ]; 

Naturalmente, vorrei questi dati per formare 2 gruppi. Capisco che se avessi saputo questo, ho potuto solo dire:

T = clusterdata(X,'maxclust',2); 

e per trovare quali punti cadono in ogni cluster potrei dire:

cluster_1 = X(T==1, :); 

e

cluster_2 = X(T==2, :); 

ma senza sapendo che 2 cluster sarebbero ottimali per questo set di dati, come faccio a raggruppare questi dati?

Grazie

+0

domanda simile: [Quali criteri di arresto per il clustering gerarchico agglomerato vengono utilizzati nella pratica?] (Http://stats.stackexchange.com/q/2597) – Amro

+0

@Amro Collegamenti utili! –

risposta

5

Il punto centrale di questo metodo è che esso rappresenta i cluster si trovano in una gerarchia, e spetta a voi per determinare quanto i dettagli che si desidera ottenere ..

agglomerative dendogram

Pensa a questo come se avesse una linea orizzontale che interseca il dendrogramma, che si sposta a partire da 0 (ogni punto è il proprio cluster) fino al valore massimo (tutti i punti in un cluster). Si potrebbe:

  • fermata quando si raggiunge un numero predeterminato di cluster (example)
  • manualmente posizionarlo dato un certo valore di altezza (example)
  • scelgono di posizionarlo dove i grappoli sono troppo distanti Secondo al criterio della distanza (cioè c'è un grande salto al livello successivo) (example)

questo può essere fatto sia usando i 'maxclust' o 'cutoff' argomenti della Funzioni CLUSTER/CLUSTERDATA

+0

Grande spiegazione, Amro. Ho notato che questo è un argomento con cui sembra avere una vasta esperienza. Quei collegamenti erano tutti molto utili alla mia applicazione. Grazie! –

5

per scegliere il numero ottimale di cluster, un approccio comune è quello di fare una trama simile ad una trama Scree. Poi cerchi il "gomito" nella trama, e questo è il numero di cluster che scegli. Per il criterio qui, useremo i somma dei quadrati all'interno di cluster:

function wss = plotScree(X, n) 

wss = zeros(1, n); 
wss(1) = (size(X, 1)-1) * sum(var(X, [], 1)); 
for i=2:n 
    T = clusterdata(X,'maxclust',i); 
    wss(i) = sum((grpstats(T, T, 'numel')-1) .* sum(grpstats(X, T, 'var'), 2)); 
end 
hold on 
plot(wss) 
plot(wss, '.') 
xlabel('Number of clusters') 
ylabel('Within-cluster sum-of-squares') 
>> plotScree(X, 5) 

ans = 

    54.0000 4.0000 3.3333 2.5000 2.0000 

enter image description here

+0

la somma del quadrato all'interno del cluster potrebbe non essere sempre un buon criterio, soprattutto dal momento che il cluster gerarchico utilizza il metodo del collegamento singolo, che per definizione desidera solo la separazione (tra i cluster) e non si preoccupa della compattezza o saldo (entro cluster) – Amro

+0

Grazie per questo codice. Era particolarmente utile quando combinato con il metodo utilizzato nel terzo link condiviso da Amro. –

-1

È possibile utilizzare il pacchetto NbClust in R che utilizza 30 indici per determinare il numero ottimale di cluster in un set di dati.