gpt4 book ai didi

python - 如何计算水平线和树线树形图之间的线交叉Python

转载 作者:太空宇宙 更新时间:2023-11-03 20:24:23 25 4
gpt4 key购买 nike

我正在编写程序如何计算层次聚类中的最佳簇数,簇数由与树的垂直线交叉的水平线数定义

dendogram

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

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()

最佳答案

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

linkage matrix Z 中的每一行由以下部分组成:合并簇的 id、两个簇之间的距离以及新簇中的元素总数。

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

np.digitize函数允许获取给定任意高度的线 ID。那么,给定高度的簇数为 nbr_of_leaves - np.digitize(height, Z[:, 2])

这是一个测试示例:

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();

关于python - 如何计算水平线和树线树形图之间的线交叉Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com