首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算水平线和树线树状图python之间的交叉点

如何计算水平线和树线树状图python之间的交叉点
EN

Stack Overflow用户
提问于 2019-09-15 19:53:48
回答 2查看 1.6K关注 0票数 1

我正在编写关于如何计算层次聚类的最佳聚类数的程序,聚类数是由与树的垂直线相交的水平线的数目来定义的

如何使用树形图中的轴线和树线来计算水平线之间的交叉线的数量?这是我的脚本来可视化,但我不知道如何计算交叉数

代码语言:javascript
复制
plt.figure(0)
plt.figure(figsize=(20, 7))
plt.title("Customer Dendograms")
L=shc.linkage(X, method='average')
dend = shc.dendrogram(L)
plt.axhline(c=c,linestyle='--', y=35) 
plt.show()
EN

回答 2

Stack Overflow用户

发布于 2019-09-16 07:20:41

它是给定高度的簇数。

除非你的链接有反转,否则你可以从链接矩阵L中简单地读出这一点。

票数 0
EN

Stack Overflow用户

发布于 2019-09-16 20:12:52

这不完全是我的领域,所以我在这里试一试。

linkage matrix Z中的每一行由:合并集群的id、两个集群之间的距离和新集群中的元素总数组成。

假设高度在Z矩阵中按升序排列(即没有inversions?)。每次形成一个集群(通过合并两个集群),集群的数量减少1。因此,对应于Z矩阵的每一行的簇数等于nbr_of_leaves - idx of the line

np.digitize函数允许在给定任意高度的情况下获取行id。然后,给定高度的簇数为nbr_of_leaves - np.digitize(height, Z[:, 2])

下面是一个测试示例:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

from scipy.spatial.distance import euclidean
from scipy.cluster.hierarchy import dendrogram, linkage

def get_number_of_clusters(height, Z):
    nbr_of_leaves = Z.shape[0] + 1
    merge_heights = Z[:, 2]
    nbr_of_clusters  = nbr_of_leaves - np.digitize(height, merge_heights)
    return nbr_of_clusters

# data for an example
x = np.array([0, 1, 2, 11, 4.5, 8, 9, 4])
x_2d = x.reshape(-1, 1)
Z = linkage(x_2d, method='single')

#for method = 'single' 
print(get_number_of_clusters(2.1, Z)) # 2
print(get_number_of_clusters(1.5, Z)) # 4
print(get_number_of_clusters(0.5, Z)) # 7

# Dendrogram
plt.figure(figsize=(8, 2))
dendrogram(Z, labels=x);
plt.grid(axis='y'); plt.xlabel('leaves'); plt.ylabel('distances');
plt.show();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57943849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档