三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

层次聚类算法解析:AGNES与DIANA实战对比

层次聚类算法解析:AGNES与DIANA实战对比

1. 层次聚类基础概念解析

层次聚类(Hierarchical Clustering)是一种通过构建树状结构来展示数据层次关系的聚类方法。与K-means等划分式聚类不同,它不需要预先指定聚类数量,而是通过计算样本间的相似度逐步合并或分裂簇。

在实际项目中,我经常用层次聚类处理那些不清楚具体类别数量的数据集。比如分析用户行为特征时,我们可能不知道用户应该分成几类,这时层次聚类就能自动展示数据的分层结构。

层次聚类主要有两种实现方式:

  • 自底向上的聚合方法(AGNES)
  • 自顶向下的分裂方法(DIANA)

重要提示:选择哪种方法取决于数据特征和需求。当预期聚类数量较少时AGNES更高效,而DIANA更适合发现数据中的异常点。

2. AGNES算法深度剖析

2.1 AGNES工作原理

AGNES(Agglomerative Nesting)是典型的聚合式层次聚类算法。我常用它来处理中小规模数据集(样本量<10,000)。它的核心步骤如下:

  1. 初始化:将每个样本视为一个簇
  2. 计算所有簇间距离矩阵
  3. 合并距离最近的两个簇
  4. 更新距离矩阵
  5. 重复步骤3-4直到所有样本聚为一类

在Python中,我们可以用scipy库快速实现:

from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt # 生成示例数据 data = [[i] for i in [2,8,0,4,1,9,9,0]] # 计算层次聚类 Z = linkage(data, 'single') # 使用单链接方法 # 绘制树状图 plt.figure(figsize=(10,5)) dendrogram(Z) plt.show()

2.2 关键参数解析

AGNES的核心在于距离度量方法的选择,常见的有:

  • 单链接(Single Linkage):取两个簇中最近样本的距离
  • 全链接(Complete Linkage):取两个簇中最远样本的距离
  • 平均链接(Average Linkage):取两个簇所有样本间的平均距离
  • 沃德方法(Ward's Method):最小化合并后的簇内方差

在我的实践中,发现这些方法各有优劣:

  • 单链接容易形成"链条效应"
  • 全链接对噪声敏感但聚类更紧凑
  • 沃德方法通常能产生最平衡的聚类结果

3. DIANA算法详解

3.1 DIANA工作原理

DIANA(Divisive Analysis)是自上而下的分裂算法,与AGNES相反。它特别适合发现数据中的异常值,我在金融风控领域经常使用。

算法流程:

  1. 将所有样本视为一个簇
  2. 找出当前簇中与其他点平均距离最大的样本作为分裂点
  3. 形成两个新簇:分裂点簇和剩余点簇
  4. 递归地对每个新簇执行分裂
  5. 直到满足停止条件(如簇数量或直径阈值)

3.2 DIANA实现要点

Python中没有DIANA的直接实现,但可以基于以下逻辑自定义:

import numpy as np from scipy.spatial.distance import pdist, squareform def diana_cluster(data, max_clusters): clusters = [data] while len(clusters) < max_clusters: # 找出最大直径的簇 diameters = [np.max(pdist(c)) for c in clusters] target_idx = np.argmax(diameters) target = clusters.pop(target_idx) # 找出分裂点 dist_matrix = squareform(pdist(target)) avg_distances = np.mean(dist_matrix, axis=1) split_point = np.argmax(avg_distances) # 分裂簇 new_cluster = [target[split_point]] remaining = np.delete(target, split_point, axis=0) clusters.extend([new_cluster, remaining]) return clusters

4. AGNES与DIANA对比分析

4.1 算法特性对比

特性AGNESDIANA
方向自底向上自顶向下
时间复杂度O(n³)O(2ⁿ)
适用场景中小数据集异常值检测
内存消耗中等较高
聚类形状适应各种形状偏好球形簇

4.2 实战选择建议

根据我的项目经验,选择建议如下:

  1. 当数据量<1万且需要完整层次结构时,优先选AGNES
  2. 当重点关注异常检测或数据有明显层级时,考虑DIANA
  3. 大数据集考虑先用AGNES的优化版本(如BIRCH)

实用技巧:可以先用AGNES快速分析,再用DIANA深入检查可疑簇。

5. Python实现进阶技巧

5.1 可视化优化

树状图是理解层次聚类的关键。我常用的优化方法:

def enhanced_dendrogram(Z, labels=None): plt.figure(figsize=(12,6)) dendrogram(Z, labels=labels, leaf_rotation=90, leaf_font_size=8, show_contracted=True) plt.title('Enhanced Dendrogram') plt.xlabel('Sample index') plt.ylabel('Distance') plt.grid(True, linestyle='--', alpha=0.5) plt.tight_layout() plt.show()

5.2 聚类结果提取

从linkage矩阵中提取扁平聚类:

from scipy.cluster.hierarchy import fcluster # 按距离阈值提取 clusters = fcluster(Z, t=1.5, criterion='distance') # 按聚类数量提取 clusters = fcluster(Z, t=3, criterion='maxclust')

6. 常见问题与解决方案

6.1 内存不足问题

处理大数据集时的优化策略:

  1. 使用稀疏矩阵表示距离矩阵
  2. 采用采样方法先处理子集
  3. 使用Mini-Batch或BIRCH等优化算法

6.2 距离计算选择

不同数据类型的最佳距离度量:

  • 连续数值:欧式距离
  • 分类数据:汉明距离
  • 文本数据:余弦相似度
  • 混合数据:Gower距离

6.3 聚类效果评估

我常用的评估方法组合:

  1. 轮廓系数(Silhouette Score)
  2. 戴维森堡丁指数(Davies-Bouldin Index)
  3. 可视化检查(降维后观察)
from sklearn.metrics import silhouette_score # 计算轮廓系数 score = silhouette_score(X, clusters) print(f"Silhouette Score: {score:.3f}")

7. 实战案例:客户细分分析

以电商用户行为分析为例:

import pandas as pd from sklearn.preprocessing import StandardScaler # 加载数据 data = pd.read_csv('user_behavior.csv') # 特征工程 features = ['purchase_freq', 'avg_order_value', 'browse_duration'] X = data[features] # 标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 层次聚类 Z = linkage(X_scaled, method='ward') # 提取5个簇 data['cluster'] = fcluster(Z, t=5, criterion='maxclust') # 分析聚类特征 cluster_profile = data.groupby('cluster')[features].mean() print(cluster_profile)

这个案例中,我们发现了5类典型用户:

  1. 高频高价值用户
  2. 低频高价值用户
  3. 中等活跃度用户
  4. 浏览型非购买用户
  5. 流失风险用户

8. 性能优化与扩展

8.1 加速计算技巧

  1. 使用快速实现如fastcluster库
  2. 并行计算距离矩阵
  3. 近似算法如HDBSCAN
import fastcluster # 更快的linkage计算 Z = fastcluster.linkage(X, method='ward')

8.2 与其他算法结合

我常将层次聚类作为其他算法的预处理步骤:

  1. 先用层次聚类确定K-means的K值
  2. 结合PCA降维提高可视化效果
  3. 作为深度学习的特征工程步骤

9. 最新进展与趋势

近年来层次聚类的改进方向:

  1. 增量式层次聚类处理流数据
  2. 基于GPU的加速实现
  3. 与深度学习的结合
  4. 可解释性增强方法

我在实际项目中测试过一些新算法,发现基于局部敏感哈希(LSH)的近似方法能显著提升大数据集的处理速度。

← 返回列表