2015-02-24 21 views
7

Sto tentando di utilizzare il metodo dendrogram di SciPy per tagliare i miei dati in un numero di cluster in base a un valore soglia. Tuttavia, una volta creato un dendrogramma e recuperato il suo color_list, c'è una voce in meno nell'elenco rispetto alle etichette.Taglio SciPy dendrogramma gerarchico in cluster tramite un valore soglia

In alternativa, ho provato a utilizzare fcluster con lo stesso valore di soglia identificato in dendrogram; tuttavia, questo non rende lo stesso risultato: mi dà un cluster invece di tre.

ecco il mio codice.

import pandas 
data = pandas.DataFrame({'total_runs': {0: 2.489857755536053, 
1: 1.2877651950650333, 2: 0.8898850111727028, 3: 0.77750321282732704, 4: 0.72593099987615461, 5: 0.70064977003207007, 
6: 0.68217502514600825, 7: 0.67963194285399975, 8: 0.64238326692987524, 9: 0.6102581538587678, 10: 0.52588765899448564, 
11: 0.44813665774322564, 12: 0.30434031343774476, 13: 0.26151929543260161, 14: 0.18623657993534984, 15: 0.17494230269731209, 
16: 0.14023670906519603, 17: 0.096817318756050832, 18: 0.085822227670014059, 19: 0.042178447746868117, 20: -0.073494398270518693, 
21: -0.13699665903273103, 22: -0.13733324345373216, 23: -0.31112299949731331, 24: -0.42369178918768974, 25: -0.54826542322710636, 
26: -0.56090603814914863, 27: -0.63252372328438811, 28: -0.68787316140457322, 29: -1.1981351436422796, 30: -1.944118415387774, 
31: -2.1899746357945964, 32: -2.9077222144449961}, 
'total_salaries': {0: 3.5998991340231234, 
1: 1.6158435140488829, 2: 0.87501176080187315, 3: 0.57584734201367749, 4: 0.54559862861592978, 5: 0.85178295446270169, 
6: 0.18345463930386757, 7: 0.81380836410678736, 8: 0.43412670908952178, 9: 0.29560433676606418, 10: 1.0636736398252848, 
11: 0.08930130612600648, 12: -0.20839133305170349, 13: 0.33676911316165403, 14: -0.12404710480916628, 15: 0.82454221267393346, 
16: -0.34510456295395986, 17: -0.17162157282367937, 18: -0.064803261585569982, 19: -0.22807757277294818, 20: -0.61709008778669083, 
21: -0.42506873158089231, 22: -0.42637946918743924, 23: -0.53516500398181921, 24: -0.68219830809296633, 25: -1.0051418692474947, 
26: -1.0900316082184143, 27: -0.82421065378673986, 28: 0.095758053930450004, 29: -0.91540963929213015, 30: -1.3296449323844519, 
31: -1.5512503530547552, 32: -1.6573856443389405}}) 

from scipy.spatial.distance import pdist 
from scipy.cluster.hierarchy import linkage, dendrogram 

distanceMatrix = pdist(data) 
dend = dendrogram(linkage(distanceMatrix, method='complete'), 
      color_threshold=4, 
      leaf_font_size=10, 
      labels = df.teamID.tolist()) 

dendrogram

len(dend['color_list']) 
Out[169]: 32 
len(df.index) 
Out[170]: 33 

Perché dendrogram solo assegnando colori a 32 etichette, anche se ci sono 33 osservazioni nei dati? È così che estraggo le etichette e i loro cluster corrispondenti (colorati in blu, verde e rosso sopra)? In caso contrario, in quale altro modo posso "tagliare" l'albero correttamente?

Ecco il mio tentativo di utilizzare fcluster. Perché restituisce solo un cluster per il set, quando la stessa soglia per dend restituisce tre?

from scipy.cluster.hierarchy import fcluster 
fcluster(linkage(distanceMatrix, method='complete'), 4) 
Out[175]: 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32) 
+0

I documenti indicano su 'color_list':' Un elenco di nomi di colori. L'elemento k'th rappresenta il colore del k'th link. Vedi: http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.dendrogram.html. Penso che questo sia un fraintendimento. – cel

+0

Dato questo, come posso vedere i risultati del cluster se ho "tagliato" l'albero a una soglia di 4? – Bryan

+0

Inoltre, dato che questa domanda è stata posta tante volte senza una buona risposta (vedi le mie annotazioni sotto), ho intenzione di metterla in palio per una taglia. La domanda specifica è: usare un dendrogramma in SciPy, come posso tagliare i miei dati in cluster dato un livello di soglia specifico e poi raccogliere questi cluster con la loro etichetta di osservazione corrispondente? Vedi http://stackoverflow.com/questions/9708630/some-questions-on-dendrogram-python-scipy?rq=1 e http://stackoverflow.com/questions/10305111/pruning-dendrogram-in-scipy- gerarchico-clustering? rq = 1 – Bryan

risposta

8

Ecco la risposta - non ho aggiunto 'distanza' come opzione per fcluster. Con esso, ottengo il corretto (3) assegnazioni di cluster.

assignments = fcluster(linkage(distanceMatrix, method='complete'),4,'distance') 

print assignments 
     [3 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] 

cluster_output = pandas.DataFrame({'team':df.teamID.tolist() , 'cluster':assignments}) 

print cluster_output 
    cluster team 
0   3 NYA 
1   2 BOS 
2   2 PHI 
3   2 CHA 
4   2 SFN 
5   2 LAN 
6   2 TEX 
7   2 ATL 
8   2 SLN 
9   2 SEA 
10  2 NYN 
11  2 HOU 
12  1 BAL 
13  2 DET 
14  1 ARI 
15  2 CHN 
16  1 CLE 
17  1 CIN 
18  1 TOR 
19  1 COL 
20  1 OAK 
21  1 MIL 
22  1 MIN 
23  1 SDN 
24  1 KCA 
25  1 TBA 
26  1 FLO 
27  1 PIT 
28  1 LAA 
29  1 WAS 
30  1 ANA 
31  1 MON 
32  1 MIA 
+0

Anche questo problema mi ha infastidito. Alla fine ho capito che l'ordine del mostro è lo stesso dell'ordine della matrice della distanza di input, non lo stesso delle foglie da sinistra a destra nel dendrogramma. – user3479780