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

如何使用树形图中的轴线和树线来计算水平线之间的交叉线的数量?这是我的脚本来可视化,但我不知道如何计算交叉数
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()发布于 2019-09-16 07:20:41
它是给定高度的簇数。
除非你的链接有反转,否则你可以从链接矩阵L中简单地读出这一点。
发布于 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])
下面是一个测试示例:
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();https://stackoverflow.com/questions/57943849
复制相似问题