【问题标题】:Cutting Dendrogram/Clustering Tree from SciPy at distance height在距离高度从 SciPy 切割树状图/聚类树
【发布时间】:2016-07-31 03:28:52
【问题描述】:

我正在尝试学习如何在 Python 中使用 dendrograms 使用 SciPy 。我想获得集群并能够可视化它们;我听说hierarchical clusteringdendrograms 是最好的方法。

如何在特定距离“砍”树?

在这个例子中,我只想在距离1.6 处切割它

我在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?

【问题讨论】:

  • @SaulloCastro 对此表示感谢。是的,肯定有关系。一种有趣的方式,只通过水平移动树木。看看实际的图表是如何绘制的也很酷。

标签: python numpy scipy hierarchical-clustering dendrogram


【解决方案1】:

color_threshold 是我正在寻找的方法。当color_palette 对于生成的集群数量来说太小时,它并没有真正的帮助。如果有人可以提供帮助,请将下一步迁移到 Bigger color-palette in matplotlib for SciPy's dendrogram (Python)

【讨论】:

    【解决方案2】:

    对于更大的调色板,这应该可以:

    from scipy.cluster import hierarchy as hc
    import matplotlib.cm as cm
    import matplotlib.colors as col
    
    #get a color spectrum "gist_ncar" from matplotlib cm. 
    #When you have a spectrum it begins with 0 and ends with 1. 
    #make tinier steps if you need more than 10 colors
    
    colors = cm.gist_ncar(np.arange(0, 1, 0.1)) 
    
    colorlst=[]# empty list where you will put your colors
    for i in range(len(colors)): #get for your color hex instead of rgb
        colorlst.append(col.to_hex(colors[i]))
    
    hc.set_link_color_palette(colorlst) #sets the color to use.
    

    把所有这些放在你的代码前面,它应该可以工作

    【讨论】:

      猜你喜欢
      • 2014-04-14
      • 1970-01-01
      • 2019-07-07
      • 2012-05-05
      • 2014-12-23
      • 2015-04-25
      • 2018-05-04
      • 2017-04-27
      • 2020-06-06
      相关资源
      最近更新 更多