共计 1677 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:高维数据的距离计算陷阱
在电商用户画像或推荐系统场景中,我们常遇到包含数百个特征的高维数据。传统欧式距离在高维空间会面临两个致命问题:

-
维度灾难:当维度增加时,所有样本间的距离会趋向相同值,导致聚类失效。数学表达式为:
$$\lim_{d \to \infty} \frac{\text{dist}{\max}-\text{dist} \to 0$$}}{\text{dist}_{\min} -
计算复杂度:对于 $n$ 个样本,暴力计算距离矩阵需要 $O(n^2)$ 时间,当 $n>10^4$ 时内存消耗可达 GB 级
技术对比:Agnes 的独特优势
横向对比常见聚类算法:
- K-means:
- 需要预设 K 值
- 对异常值敏感
-
无法发现非凸簇
-
DBSCAN:
- 自动确定簇数量
- 但密度参数 $\epsilon$ 难调优
-
高维下邻域查询效率低
-
Agnes:
- 通过树状图展示层次关系
- 无需预设簇数量
- Ward 方法对噪声鲁棒
核心实现:从树状图到 Ward 策略
树状图构建流程
- 初始化:将每个样本视为单独簇
- 计算所有簇间距离矩阵 $D_{n×n}$
- 每次合并距离最近的两个簇
- 更新距离矩阵并重复直到所有样本合并
Ward 方法数学原理
最小化合并后的总类内方差增量:
$$\Delta(A,B) = \frac{|A||B|}{|A|+|B|}||\mu_A – \mu_B||^2$$
其中 $\mu$ 表示簇中心,$|\cdot|$ 表示簇大小
Python 实战:从预处理到可视化
import numpy as np
from sklearn.preprocessing import StandardScaler
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 数据标准化(关键步骤)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 优化计算:使用 Ward 方法预先计算距离
# pdist 参数指定欧式距离,避免重复计算
Z = linkage(X_scaled, method='ward', metric='euclidean', optimal_ordering=True)
# 可视化树状图(截断显示前 50 层)plt.figure(figsize=(12, 6))
dendrogram(Z, truncate_mode='level', p=50)
plt.xlabel("样本索引")
plt.ylabel("合并距离")
plt.title("AGNES 聚类树状图")
plt.show()
性能优化技巧
计算加速方案
-
使用
scipy.spatial.distance.pdist替代朴素实现:from scipy.spatial.distance import pdist dist_matrix = pdist(X_scaled, 'euclidean') -
对于 $n>10^4$ 的数据:
- 采用 MiniBatch 策略随机采样
- 使用
fastcluster库加速
内存管理
- 分块计算距离矩阵
- 使用稀疏矩阵存储(当特征稀疏时)
避坑指南
样本量过大时
- 先使用 PCA 降维到 50-100 维
- 采用 HDBSCAN+Agnes 混合策略
类别型变量处理
# 使用 Target Encoding 替代 One-Hot
from category_encoders import TargetEncoder
encoder = TargetEncoder()
X_cat_encoded = encoder.fit_transform(X_cat, y)
评估指标选择
-
轮廓系数:适合凸形簇
from sklearn.metrics import silhouette_score score = silhouette_score(X, labels) -
Calinski-Harabasz:更快但偏向球形簇
进阶思考:与降维技术结合
当面对 1000+ 维数据时,建议流程:
- 先用 PCA 保留 95% 方差
- 对降维后数据运行 Agnes
- 比较降维前后的轮廓系数差异
思考题:如果先用 t -SNE 降维再聚类,会带来什么问题?
提示:t-SNE 的非线性特性可能导致距离失真
正文完
