我如何获得scipy.cluster.hierarchy制作的树状图的子树 - python

我对此模块(scipy.cluster.hierarchy)感到困惑,但仍然有些困惑!

例如,我们有以下树状图:

我的问题是如何以一种好的格式(例如SIF格式)提取彩色的子树(每个子树代表一个集群)?
现在,获得上面图的代码是:

import scipy
import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt

scipy.randn(100,2)

d = sch.distance.pdist(X)

Z= sch.linkage(d,method='complete')

P =sch.dendrogram(Z)

plt.savefig('plot_dendrogram.png')

T = sch.fcluster(Z, 0.5*d.max(), 'distance')
#array([4, 5, 3, 2, 2, 3, 5, 2, 2, 5, 2, 2, 2, 3, 2, 3, 2, 5, 4, 5, 2, 5, 2,
#       3, 3, 3, 1, 3, 4, 2, 2, 4, 2, 4, 3, 3, 2, 5, 5, 5, 3, 2, 2, 2, 5, 4,
#       2, 4, 2, 2, 5, 5, 1, 2, 3, 2, 2, 5, 4, 2, 5, 4, 3, 5, 4, 4, 2, 2, 2,
#       4, 2, 5, 2, 2, 3, 3, 2, 4, 5, 3, 4, 4, 2, 1, 5, 4, 2, 2, 5, 5, 2, 2,
#       5, 5, 5, 4, 3, 3, 2, 4], dtype=int32)

sch.leaders(Z,T)
# (array([190, 191, 182, 193, 194], dtype=int32),
#  array([2, 3, 1, 4,5],dtype=int32))

所以现在,fcluster()的输出给出了节点的聚类(按其ID),并且here描述的leaders()应该返回2个数组:

  • 第一个包含Z生成的簇的前导节点,在这里我们可以看到我们有5个簇,以及图中的
  • ,第二个是这些集群的ID
  • 因此,如果这个Leader()返回resp。 L和M:L[2]=182M[2]=1,然后群集1由节点ID 182引导,节点ID 182在观察集X中不存在,文档说“...然后它对应于非单例群集”。但是我不明白...

    另外,我通过sch.to_tree(Z)将Z转换为树,该树将返回一个易于使用的树对象(我想将其可视化),但是我应该使用哪个工具作为将这些树对象作为输入进行操作的图形平台?

    参考方案

    回答关于树操作的问题部分...

    如aother answer中所述,您可以从树对象中读取读取icoorddcoord的分支的坐标。对于每个分支,从左到右给出协调。

    如果要手动绘制树,则可以使用以下方法:

    def plot_tree(P, pos=None):
        plt.clf()
        icoord = scipy.array(P['icoord'])
        dcoord = scipy.array(P['dcoord'])
        color_list = scipy.array(P['color_list'])
        xmin, xmax = icoord.min(), icoord.max()
        ymin, ymax = dcoord.min(), dcoord.max()
        if pos:
            icoord = icoord[pos]
            dcoord = dcoord[pos]
            color_list = color_list[pos]
        for xs, ys, color in zip(icoord, dcoord, color_list):
            plt.plot(xs, ys, color)
        plt.xlim(xmin-10, xmax + 0.1*abs(xmax))
        plt.ylim(ymin, ymax + 0.1*abs(ymax))
        plt.show()
    

    在您的代码中,plot_tree(P)在以下位置给出:

    该功能允许您仅选择一些分支:

    plot_tree(P, range(10))
    

    现在,您必须知道要绘制的分支。也许fcluster()的输出有些晦涩,而另一种基于最小和最大距离公差来找到要绘制的分支的另一种方法是直接使用linkage()的输出(在OP的情况下为Z):

    dmin = 0.2
    dmax = 0.3
    pos = scipy.all( (Z[:,2] >= dmin, Z[:,2] <= dmax), axis=0 ).nonzero()
    plot_tree( P, pos )
    

    推荐参考:

  • How does condensed distance matrix work? (pdist)
  • how to plot and annotate hierarchical clustering dendrograms in scipy/matplotlib
  • Python:集群作业管理 - python

    我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

    如何立即将所有Snakemake作业提交到Slurm Cluster - python

    我正在使用snakemake构建可在SLURM群集上运行的变体调用管道。集群具有登录节点和计算节点。任何真正的计算都应以srun或sbatch作业的形式在计算节点上完成。作业最多只能运行48小时。我的问题是,处理许多样本(尤其是在队列繁忙时)将花费48小时以上的时间来处理每个样本的所有规则。传统的snakemake群集执行使主线程运行,该主线程仅在所有规则的…

    如何在python的MeanShift模块中估计带宽时选择合适的分位数? - python

    我正在对数据集执行均值漂移聚类。Estimate_bandwidth函数估计适当的带宽以执行均值漂移聚类。句法:sklearn.cluster.estimate_bandwidth(X, quantile=0.3, n_samples=None, random_state=0) 我发现,估计带宽随分位数的增加而增加,从而导致簇数减少。类似地,分位数的减少会减…

    Python GPU资源利用 - python

    我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

    Python:图像处理可产生皱纹纸效果 - python

    也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…