You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用共表型距离选择最佳链接方法构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:55:20