2013-04-11 16 views
16

se si dispone di questa chiamata clustering gerarchico in SciPy in Python:Come calcolare le assegnazioni di cluster dalle matrici linkage/distance in scipy in Python?

from scipy.cluster.hierarchy import linkage 
# dist_matrix is long form distance matrix 
linkage_matrix = linkage(squareform(dist_matrix), linkage_method) 

allora qual è un modo efficace per andare da questo per le assegnazioni di cluster per singoli punti? ovvero un vettore di lunghezza N dove N è il numero di punti, dove ogni voce i è il numero di cluster del punto i, dato il numero di cluster generato da una soglia data thresh sul clustering risultante?

Per chiarire: il numero di cluster sarebbe il cluster in cui si trova dopo aver applicato una soglia all'albero. In tal caso si otterrebbe un cluster univoco per ciascun nodo foglia per il cluster in cui si trova. Unico nel senso che ogni punto appartiene a un "cluster più specifico" definito dalla soglia in cui si taglia il dendrogramma.

So che scipy.cluster.hierarchy.fclusterdata fornisce questa assegnazione di cluster come valore di ritorno, ma sto iniziando da una matrice di distanza personalizzata e una metrica di distanza, quindi non posso utilizzare fclusterdata. La domanda si riduce a: come posso calcolare che cosa sta calcolando fclusterdata - le assegnazioni del cluster?

+1

Se si dà squareform (dist_matrix) per il collegamento(), la matrice è considerato come osservazioni e il raggruppamento i risultati potrebbero essere errati. È possibile assegnare direttamente il vettore condensato della matrice di distanze come input a linkage(). – HongboZhu

+0

maggiori dettagli vedi: https://github.com/scipy/scipy/issues/2614 – HongboZhu

risposta

14

Se ho capito bene, questo è ciò che fa fcluster:

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

Forme cluster piatti dal clustering gerarchico definito dalla matrice legame Z.

...

Restituisce: una matrice di lunghezza n. T [i] è il numero del cluster piatto a cui appartiene l'osservazione originale.

Quindi basta chiamare fcluster(linkage_matrix, t), dove t è la vostra soglia.

Problemi correlati