2016-04-09 18 views
1

SciPy kullanarak Python içinde dendrograms'u kullanmayı öğreniyorum. Kümeleri elde etmek ve onları görselleştirmek istiyorum; hierarchical clustering ve dendrograms'un en iyi yol olduğunu duydum.Dendrogram/Kümeleme Ağacını SciPy'den Uzaklık Yüksekliğinde Kesme

Ağacı belirli bir mesafede nasıl kesebilirim? Ben https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/#Inconsistency-Method bir öğretici baktı ama adam **kwargs kullanarak bazı gerçekten kafa karıştırıcı sarıcı işlevi yaptığını 1.6 enter image description here

Bu örnekte

, sadece mesafeden kesmek istiyorum (onun eşik çağırır max_d)

Aşağıda kodum ve grafiğim var; Ben tekrarlanabilirlik için elimden geldiğince açıklayarak çalıştı:

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

[İlgili soru] (http://stackoverflow.com/q/16883412/832621) ... –

+0

@SaulloCastro bunun için teşekkürler. Evet, kesinlikle alakalı. Yatay olarak sadece ağaçlara giden ilginç bir yol. Ayrıca gerçek grafiğin nasıl çizildiğini görmek gerçekten harika. –

cevap