2016-04-09 10 views
1

Я пытаюсь научиться использовать dendrograms в Python с использованием SciPy. Я хочу получить кластеры и иметь возможность их визуализировать; Я слышал, что hierarchical clustering и dendrograms - лучший способ.Резка дендрограмма/Дерево кластеризации из SciPy на высоте расстояния

Как я могу «вырезать» дерево на определенном расстоянии?

В этом примере, я просто хочу, чтобы разрезать его на расстоянии 1.6 enter image description here

Я посмотрел учебник по https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/#Inconsistency-Method но парень сделал некоторые действительно запутанной функции обертку с помощью **kwargs (он называет его порог max_d)

Вот мой код и график ниже; Я попытался аннотирования это как лучше всего, как я мог воспроизводимости:

from __future__ import print_function 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
from scipy.cluster.hierarchy import dendrogram,linkage,fcluster 
from scipy.spatial import distance 
np.random.seed(424173239) #43984 

#Dims 
n,m = 20,7 

#DataFrame: rows = Samples, cols = Attributes 
attributes = ["a" + str(j) for j in range(m)] 
DF_data = pd.DataFrame(np.random.random((n, m)), columns = attributes) 

A_dist = distance.cdist(DF_data.as_matrix().T, DF_data.as_matrix().T) 

#(i) . Do the labels stay in place from DF_data for me to do this? 
DF_dist = pd.DataFrame(A_dist, index = attributes, columns = attributes) 

#Create dendrogram 
fig, ax = plt.subplots() 
Z = linkage(distance.squareform(DF_dist.as_matrix()), method="average") 
D_dendro = dendrogram(Z, labels = attributes, ax=ax) #create dendrogram dictionary 
threshold = 1.6 #for hline 
ax.axhline(y=threshold, c='k') 
plt.show() 

#(ii) How can I "cut" the tree by giving it a distance threshold? 
#i.e. If I cut at 1.6 it would make (a5 : cluster_1 or not in a cluster), (a2,a3 : cluster_2), (a0,a1 : cluster_3), and (a4,a6 : cluster_4) 

#link_1 says use fcluster 
#This -> fcluster(Z, t=1.5, criterion='inconsistent', depth=2, R=None, monocrit=None) 
#gives me -> array([1, 1, 1, 1, 1, 1, 1], dtype=int32) 

print(
    len(set(D_dendro["color_list"])), "^ # of colors from dendrogram", 
    len(D_dendro["ivl"]), "^ # of labels",sep="\n") 
#3 
#^ # of colors from dendrogram it should be 4 since clearly (a6, a4) and a5 are in different clusers 
#7 
#^ # of labels 

link_1: How to compute cluster assignments from linkage/distance matrices in scipy in Python?

+0

[Родственный вопрос] (http://stackoverflow.com/q/16883412/832621) ... –

+0

@SaulloCastro для этого. Да, это определенно связано. Интересный путь к деревьям, идущий горизонтально. Также очень здорово видеть, как график графика тоже нарисован. –

ответ

0

color_threshold метод, который я искал. Это действительно не помогает, когда color_palette слишком мал для количества генерируемых кластеров. Миграция следующего шага к Bigger color-palette in matplotlib for SciPy's dendrogram (Python), если кто-то может помочь.