如何用共表型距离选择最佳链接方法构建Python自底向上树状图?
确定层次聚类最佳链接准则的实用方法
匹配数据天然结构:你的数据集是
make_moons生成的双月牙非凸结构,不同链接方法的适配性差异明显:- 单链接擅长捕捉非凸簇,但对噪声敏感(你的噪声0.07不算大,影响有限);
- 完全链接能收紧簇边界,但可能误拆分相近簇;
- 平均链接是折中方案,对这种双簇结构表现稳定,能平衡噪声干扰和簇形状匹配;
- ward链接更适合凸形簇,对月牙这类非凸结构适配性差。
用共表型距离量化筛选:你已经测试的共表型距离是最靠谱的量化手段,直接看共表型相关系数(CPCC)——这个值越接近1,说明树状图的层级结构和原始数据的距离分布匹配度越高。直接选CPCC最高的链接方法就行,针对你的月牙数据,平均或单链接的CPCC通常会远高于ward链接。
可视化验证补全:光看数值不够,结合可视化确认:
- 用
dendrogram生成每种方法的树状图,看簇划分是否和月牙的天然结构对应; - 用
fcluster按预设簇数(比如2个)截取结果,和原始标签y_moons对比准确率,进一步验证最优性。
- 用
实操代码片段:
from scipy.cluster.hierarchy import linkage, cophenet, dendrogram, fcluster from scipy.spatial.distance import pdist from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 生成数据集 X_moons, y_moons = make_moons(n_samples=1000, noise=.07, random_state=42) # 遍历所有链接方法计算CPCC linkage_methods = ['single', 'complete', 'average', 'ward'] cpcc_results = {} for method in linkage_methods: Z = linkage(X_moons, method=method) cpcc, _ = cophenet(Z, pdist(X_moons)) cpcc_results[method] = cpcc print(f"{method} 链接的CPCC: {cpcc:.4f}") # 选出CPCC最高的方法 best_method = max(cpcc_results, key=cpcc_results.get) print(f"\n最优链接方法: {best_method}") # 可视化最优方法的树状图和簇划分 Z_best = linkage(X_moons, method=best_method) plt.figure(figsize=(10, 4)) dendrogram(Z_best, truncate_mode='lastp', p=2) plt.title(f"{best_method} 链接树状图") plt.show() # 对比原始标签的准确率 clusters = fcluster(Z_best, t=2, criterion='maxclust') # 注意聚类结果的簇编号可能和原始标签不一致,这里做简单匹配 accuracy = max(sum(clusters == y_moons + 1)/len(y_moons), sum(clusters == 3 - y_moons)/len(y_moons)) print(f"簇划分与原始标签匹配准确率: {accuracy:.4f}")
内容的提问来源于stack exchange,提问作者Stackoverflow Stackoverflow
相关产品推荐
相关产品推荐

