agglomerativeclustering默认不输出标签,因设计上fit()仅拟合树结构,需显式调用fit_predict()才返回整数标签数组;它不支持predict(),无法泛化至新样本。

AgglomerativeClustering 为什么默认不输出聚类标签?
直接调用 fit() 后发现 model.labels_ 是空的,不是 bug,是设计:它默认只做拟合,不自动预测。必须显式调用 fit_predict() 才会返回标签数组,或者先 fit() 再 predict()(但注意——AgglomerativeClustering 不支持 predict() 方法,因为层次聚类无法泛化到新样本)。
常见错误现象:AttributeError: 'AgglomerativeClustering' object has no attribute 'labels_',就是只用了 fit() 却没调用 fit_predict()。
- 正确做法:用
labels = model.fit_predict(X)一步到位 - 如果已
fit()过,仍需重新fit_predict(),不能复用 - 想对新数据“预测”?不行——得换
KMeans或训练一个分类器代理
n_clusters 参数设多少才合理?
n_clusters 是必须指定的超参,但它不像 KMeans 那样有明确物理意义:这里它只是决定在树状图(dendrogram)上切一刀的位置,切得高,簇少;切得低,簇多。没有银弹值,得结合业务目标和距离阈值判断。
使用场景建议:
- 已有明确类别数(如分 3 类客户),直接设
n_clusters=3 - 不确定时,先画 dendrogram,观察距离跃升点(即“肘部”),再定
n_clusters - 更灵活的方式:改用
distance_threshold(配合n_clusters=None),让模型按距离自动合并,避免硬编码簇数
注意:n_clusters 和 distance_threshold 互斥,同时设会报错 ValueError: Compute full tree with either n_clusters or distance_threshold。
metric 和 linkage 怎么选?影响聚类结果明显吗?
选错组合会让簇结构完全失真。默认 metric='euclidean' + linkage='ward' 看似省事,但 ward 要求输入必须是欧氏距离且数据需中心化,否则直接报错 ValueError: The ward clustering algorithm requires the distance to be Euclidean。
- 数据标准化了?没标准化就别用
ward,换成linkage='average'或'complete' - 用非欧距离(如
metric='cosine')?必须配linkage='average'或'single',ward不支持 -
single易产生链式簇(chaining effect),complete偏好紧凑球形簇,average是较稳的折中选择
示例:文本 TF-IDF 向量常用 metric='cosine', linkage='average';地理坐标用 metric='haversine'(需 scikit-learn ≥ 1.2)加 linkage='average'。
如何可视化聚类过程并验证合理性?
仅看 labels 数组毫无意义。必须结合 dendrogram 或降维后散点图交叉验证。
- 画 dendrogram:用
scipy.cluster.hierarchy.dendrogram,传入model.children_和model.n_connected_components_等信息,注意AgglomerativeClustering本身不存距离矩阵,得自己算或用sklearn.metrics.pairwise_distances - 2D 可视化:先用
TSNE或PCA降到 2 维,再用plt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels),重点看簇间是否分离、簇内是否紧凑 - 警惕“假分离”:如果 PCA 后簇重叠严重,但标签看起来整齐,大概率是降维扭曲或聚类本身失效
真正麻烦的是高维稀疏数据——dendrogram 会密集成团,肉眼无法判断切分点,这时 distance_threshold + 轮廓系数(silhouette_score)比硬设 n_clusters 更可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











