层次聚类实战:如何用AGG方法自动确定最佳K值

1次阅读
没有评论

共计 1833 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

开篇痛点

层次聚类作为经典的无监督学习方法,最大的痛点就是需要人工指定聚类数量 K。传统方法要么依赖主观判断树状图的切割高度,要么需要尝试多个 K 值计算评估指标,这个过程不仅效率低下,还容易受个人经验影响。特别是在用户分群、异常检测等工业场景中,数据分布往往复杂多变,手动调参的方式很难保证结果稳定性。

常见方法对比

先快速了解几种主流的 K 值确定方法:

  • 肘部法则:通过 SSE 曲线的拐点确定 K 值
  • 优点:计算简单,可视化直观
  • 缺点:拐点判断主观性强,曲线可能没有明显拐点

  • 轮廓系数:衡量样本与同类 / 异类样本的相似度

  • 优点:有明确数学定义(- 1 到 1 区间)
  • 缺点:计算复杂度 O(n^2),大数据集性能差

  • Gap 统计量:比较实际数据与参考分布的聚类效果

  • 优点:理论基础强
  • 缺点:需要生成多组参考数据,计算成本高

AGG 层次聚类核心原理

树状图生成机制

  1. 初始化:将每个样本视为单独类簇
  2. 迭代合并
  3. 计算所有类簇间距离(常用 ward/complete/average linkage)
  4. 合并距离最近的两个类簇
  5. 生成谱系:记录每次合并的高度(距离)和参与合并的类簇

关键点:树状图的 y 轴高度表示合并时的距离,这个距离值的选择直接影响聚类结果。

自动切割算法

基于轮廓系数的切割流程:

  1. 遍历所有可能的切割高度
  2. 对每个切割后的聚类结果计算平均轮廓系数
  3. 选择使轮廓系数最大的切割高度
  4. 根据最优高度确定最终聚类数 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 指数

延伸思考

  1. 与密度聚类结合:先用 DBSCAN 识别核心点,再对噪声点做层次聚类
  2. 增量聚类实现
  3. 定期更新树状图(限定合并层数)
  4. 滑动窗口处理数据流

完整代码可在 Colab 运行:层次聚类实战:如何用 AGG 方法自动确定最佳 K 值

这种方法在电商用户行为分析中帮我们发现了多个隐藏的细分群体,相比 K -Means 减少了 80% 的调参时间。特别是在处理新兴业务数据时,自动确定 K 值的优势更加明显。

正文完
 0
评论(没有评论)