Schneiden SciPy hierarchisch in Clustern das dendrogramm über einem Schwellenwert
Ich versuche, SciPy ist dendrogram
Methode zu schneiden, meine Daten in eine Anzahl von Clustern, die basierend auf einem Schwellenwert. Jedoch, sobald ich eine das dendrogramm und abrufen der color_list
, es ist ein fehlender Eintrag in der Liste als gibt es Etiketten.
Alternativ habe ich versucht, mit fcluster
mit dem gleichen Schwellenwert, identifizierte ich mich in dendrogram
; allerdings bedeutet dies nicht, führen zum selben Ergebnis-es gibt mir ein cluster statt drei.
hier ist mein code.
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())
len(dend['color_list'])
Out[169]: 32
len(df.index)
Out[170]: 33
Warum ist dendrogram
nur zuweisen von Farben zu 32 Etiketten, obwohl es 33 Beobachtungen in den Daten? Ist dies, wie extrahiere ich die Etiketten und die entsprechenden Cluster (farbig in blau, grün und rot oben)? Wenn nicht, wie ich sonst noch 'cut' der Baum richtig?
Hier ist mein Versuch mit fcluster
. Warum hat es wieder nur zu einem cluster für das set, wenn die gleiche Schwelle für dend
gibt drei?
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)
- Die docs Staat über
color_list
:A list of color names. The k’th element represents the color of the k’th link.
Finden Sie unter: docs.scipy.org/doc/scipy/reference/generated/.... Ich denke, das ist ein Missverständnis. - Angesichts dieser, wie sehe ich die cluster-Ergebnisse, wenn ich den 'cut' der Baum bei einem Schwellenwert von 4?
- Auch, als diese Frage gestellt wurde, auf SO viele Male, ohne eine gute Antwort (siehe meine Anmerkungen weiter unten), ich werde es für ein Kopfgeld. Die konkrete Frage ist: mit einem das dendrogramm in SciPy, wie Schneide ich meine Daten in Cluster, bei einer bestimmten Schwelle der Ebene, und sammeln Sie dann diese Cluster mit Ihren entsprechenden Beobachtung label? Siehe stackoverflow.com/questions/9708630/... und stackoverflow.com/questions/10305111/...
- Hier ist ein weiteres fast genau ähnliche Frage ohne Antwort: stackoverflow.com/questions/26608412/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Antwort - ich habe nicht hinzufügen "Distanz" als eine option, um
fcluster
. Mit ihm, bekomme ich den richtigen (3) cluster-Zuordnungen.Hast du Folgendes versuchen?
Wo
k = 14
würde Sie Ihre gewünschte Anzahl von Clustern.In diesem Fall sollten Sie schneiden Sie die dendogram in der Weise schafft, dass 14 Clustern. Wenn Sie wollen, visualisieren Sie diese besser ist, würde ich verwenden Sie R, wo Sie es sehen können besser.