共计 1666 个字符,预计需要花费 5 分钟才能阅读完成。
1. 背景痛点:从传统聚类到层次凝聚
在无监督学习领域,聚类算法常面临两大挑战:

- 类别数预设难题:K-means 等算法需预先指定聚类数量,但实际场景中最优 K 值往往未知
- 形状适应性差:传统算法对非凸分布数据(如环形簇)表现不佳
AHC(Agglomerative Hierarchical Clustering)通过自底向上的层次化策略解决了这些问题:
- 初始时将每个样本视为独立簇
- 迭代合并最相近的簇直至满足终止条件
- 生成可解释的树状图(Dendrogram),无需预设类别数
2. 核心原理:连接策略与距离度量
2.1 数学表达
定义合并策略为 $\mathcal{L}(C_i,C_j)$,常见形式包括:
- 单连接(Single Linkage):$\min\limits_{a\in C_i, b\in C_j} d(a,b)$
- 全连接(Complete Linkage):$\max\limits_{a\in C_i, b\in C_j} d(a,b)$
- 平均连接(Average Linkage):$\frac{1}{|C_i||C_j|}\sum\limits_{a\in C_i}\sum\limits_{b\in C_j} d(a,b)$
2.2 树状图生成流程
- 计算所有样本间距离矩阵
- 找出当前最小距离对合并为新簇
- 更新距离矩阵(根据选定策略)
- 重复步骤 2 - 3 直至所有样本合并
3. 工程实战:Python 实现详解
import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 数据预处理
def preprocess_data(data):
scaler = StandardScaler()
try:
return scaler.fit_transform(data)
except ValueError as e:
print(f"标准化失败: {str(e)}")
raise
# 聚类与可视化
def ahc_clustering(data, method='ward', metric='euclidean'):
normalized_data = preprocess_data(data)
# 计算链接矩阵
Z = linkage(normalized_data, method=method, metric=metric)
# 绘制树状图
plt.figure(figsize=(12, 6))
dendrogram(Z, truncate_mode='lastp', p=20)
plt.xlabel("样本索引")
plt.ylabel("合并距离")
plt.show()
return Z
关键参数说明:
method: 连接策略(ward/complete/average/single)metric: 距离度量(euclidean/cosine/cityblock 等)truncate_mode: 控制树状图显示密度
4. 性能优化方案
针对 O(n³)复杂度问题,推荐以下优化手段:
- 稀疏矩阵优化
- 对高维数据使用 cosine 距离 + 稀疏存储
-
采用
scipy.sparse格式存储距离矩阵 -
采样策略
- 先用 K -means 生成超簇
-
再对超簇中心进行 AHC
-
并行计算
- 利用 joblib 并行计算距离矩阵
- 分块处理超大规模数据
5. 常见误区与解决方案
| 误区类型 | 典型表现 | 解决方案 |
|---|---|---|
| 数据尺度不统一 | 数值型特征主导聚类结果 | 标准化 /Z-score 归一化 |
| 距离度量误选 | 欧式距离处理文本数据 | 按数据类型选择(文本用 cosine) |
| 树状图解读错误 | 过早截断聚类 | 观察距离突变点确定最佳切割高度 |
6. 延伸思考方向
- 动态剪枝策略:如何根据业务需求自动确定最佳聚类数?
- 混合模型设计:能否结合 DBSCAN 的噪声处理能力改进 AHC?
- 增量学习:如何适应流式数据的层次聚类需求?
实践心得
在实际电商用户分群项目中,我们发现:
– 全连接策略对异常值更鲁棒
– 当特征维度 >1000 时,优先考虑 PCA 降维
– 树状图高度突降点往往对应业务有意义的分类层级
正文完
