共计 1833 个字符,预计需要花费 5 分钟才能阅读完成。
开篇痛点
层次聚类作为经典的无监督学习方法,最大的痛点就是需要人工指定聚类数量 K。传统方法要么依赖主观判断树状图的切割高度,要么需要尝试多个 K 值计算评估指标,这个过程不仅效率低下,还容易受个人经验影响。特别是在用户分群、异常检测等工业场景中,数据分布往往复杂多变,手动调参的方式很难保证结果稳定性。
常见方法对比
先快速了解几种主流的 K 值确定方法:
- 肘部法则:通过 SSE 曲线的拐点确定 K 值
- 优点:计算简单,可视化直观
-
缺点:拐点判断主观性强,曲线可能没有明显拐点
-
轮廓系数:衡量样本与同类 / 异类样本的相似度
- 优点:有明确数学定义(- 1 到 1 区间)
-
缺点:计算复杂度 O(n^2),大数据集性能差
-
Gap 统计量:比较实际数据与参考分布的聚类效果
- 优点:理论基础强
- 缺点:需要生成多组参考数据,计算成本高
AGG 层次聚类核心原理
树状图生成机制
- 初始化:将每个样本视为单独类簇
- 迭代合并:
- 计算所有类簇间距离(常用 ward/complete/average linkage)
- 合并距离最近的两个类簇
- 生成谱系:记录每次合并的高度(距离)和参与合并的类簇
关键点:树状图的 y 轴高度表示合并时的距离,这个距离值的选择直接影响聚类结果。
自动切割算法
基于轮廓系数的切割流程:
- 遍历所有可能的切割高度
- 对每个切割后的聚类结果计算平均轮廓系数
- 选择使轮廓系数最大的切割高度
- 根据最优高度确定最终聚类数 K
优势:整个过程完全自动化,且选择标准有明确的数学解释。
完整代码实现
环境准备
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成示例数据
X, _ = make_blobs(n_samples=500, centers=5, random_state=42)
层次聚类建模
# 计算连接矩阵(关键参数:method='ward'/'complete'/'average')Z = linkage(X, method='ward')
# 生成树状图
plt.figure(figsize=(12, 6))
dendrogram(Z, truncate_mode='level', p=5)
plt.xlabel('Sample index')
plt.ylabel('Merge distance')
plt.show()
自动确定 K 值
# 遍历可能的聚类数范围
range_n_clusters = range(2, 10)
best_k = 2
max_silhouette = -1
for n_clusters in range_n_clusters:
# 根据高度切割树状图
clusters = fcluster(Z, t=n_clusters, criterion='maxclust')
# 计算轮廓系数(注意:大数据集可采样计算)silhouette_avg = silhouette_score(X, clusters)
# 更新最优解
if silhouette_avg > max_silhouette:
max_silhouette = silhouette_avg
best_k = n_clusters
print(f'Optimal clusters: {best_k} (silhouette={max_silhouette:.3f})')
性能优化技巧
大数据量处理
- 近似计算 :使用
fastcluster库替代 scipy - 采样评估:对轮廓系数计算使用 10%~20% 的随机样本
- 批处理:对距离矩阵分块计算
内存优化
- 稀疏矩阵:当数据稀疏时使用
scipy.sparse - 距离近似:用 HDBSCAN 的 memory 参数控制计算精度
生产环境注意事项
高维数据陷阱
- 先使用 PCA/TSNE 降维
- 改用更适合高维的距离度量(如余弦相似度)
类别不平衡
- 轮廓系数可能失效,可改用:
- Calinski-Harabasz 指数
- Davies-Bouldin 指数
延伸思考
- 与密度聚类结合:先用 DBSCAN 识别核心点,再对噪声点做层次聚类
- 增量聚类实现:
- 定期更新树状图(限定合并层数)
- 滑动窗口处理数据流
这种方法在电商用户行为分析中帮我们发现了多个隐藏的细分群体,相比 K -Means 减少了 80% 的调参时间。特别是在处理新兴业务数据时,自动确定 K 值的优势更加明显。
正文完

