如何为生成树状图的距离矩阵添加标签并在树状图中展示
解决Scipy层次聚类中添加样本标签的问题
首先明确:scipy.cluster.hierarchy.average()(即UPGMA算法)这类linkage函数本身不接受labels参数,它仅负责计算聚类的连接关系,生成的outDND(linkage矩阵)里只存储聚类的结构信息,不会保存样本标签。标签需要在可视化树状图或后续分析阶段单独指定。
具体实现步骤
- 正常生成linkage矩阵
先按原有方式执行聚类计算,无需给average()传labels:
from scipy.cluster.hierarchy import average, fcluster, dendrogram import matplotlib.pyplot as plt # 你的距离矩阵(压缩向量形式) distanceMatrix = [188.61516889752, 226.68716730362135, 188.96015266132167] outDND = average(distanceMatrix)
- 可视化时添加标签
使用dendrogram()函数绘制树状图,通过labels参数传入自定义样本标签,叶子节点就会显示指定标签:
# 绘制带标签的树状图 dendrogram(outDND, labels=['A', 'B', 'C']) plt.title("UPGMA 聚类树状图") plt.show()
- 关联聚类结果与标签
如果用fcluster()得到样本的簇分配结果,可以将簇标签和样本标签对应起来,方便后续分析:
# 获取簇分配(阈值可根据需求调整) cluster_labels = fcluster(outDND, t=200, criterion='distance') # 关联样本标签和簇标签 sample_cluster = dict(zip(['A', 'B', 'C'], cluster_labels)) print(sample_cluster) # 输出示例:{'A': 1, 'B': 2, 'C': 1}
关键说明
- 你的距离矩阵是压缩的距离向量(对应3个样本两两之间的距离,顺序为A-B、A-C、B-C),这是
pdist()生成的格式,average()可直接处理。 - 标签本质是样本的标识,和聚类计算过程无关,仅在结果展示或后续数据关联时用到。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

