如何从Dendrogram树状图计算指定y值聚类数及最优聚类数?
问题1:统计特定y值处的聚类数量
你可以直接使用scipy.cluster.hierarchy模块下的fcluster函数实现,该函数可根据指定的距离阈值切割层次聚类树,返回每个样本所属的聚类标签,统计去重后的标签数量即为对应阈值下的聚类数。
适配你现有代码的示例如下:
from scipy.cluster.hierarchy import fcluster import numpy as np # 计算y=2处的聚类数 cluster_labels_y2 = fcluster(Z, t=2, criterion='distance') n_clusters_y2 = len(np.unique(cluster_labels_y2)) print(f"y=2处的聚类数量为:{n_clusters_y2}") # 计算y=1.5处的聚类数 cluster_labels_y15 = fcluster(Z, t=1.5, criterion='distance') n_clusters_y15 = len(np.unique(cluster_labels_y15)) print(f"y=1.5处的聚类数量为:{n_clusters_y15}")
问题2:y轴数值与最优聚类数的关联及判定方法
y轴的数值代表两个聚类合并时的类间距离,和聚类数为负相关关系:设置的距离阈值越小,切割得到的聚类数量越多,反之则越少,二者直接对应。
层次聚类也有成熟的最优聚类数判定方法,和K-Means的常用方法逻辑一致:
- 肘方法:将不同距离阈值对应的聚类数作为横轴,对应聚类合并的距离增量作为纵轴绘图,找斜率突变的拐点,拐点对应的聚类数即为候选最优值,核心逻辑和K-Means肘方法一致,都是寻找类内差异最小、类间差异最大的平衡点。
- 轮廓系数法:和K-Means的用法完全相同,遍历不同聚类数k(也可以直接遍历对应距离阈值),计算每个k下所有样本的平均轮廓系数,系数最接近1对应的k就是最优聚类数。
- 除此之外,Calinski-Harabasz指数、Davies-Bouldin指数也可用于判定层次聚类的最优聚类数,两个指标的计算逻辑和在K-Means场景下的使用逻辑完全一致。
内容的提问来源于stack exchange,提问作者harry04
相关产品推荐
相关产品推荐

