从 “单细胞” 到 “数据森林”:层次聚类的 “自底向上” 生长法则
目录
一、引言
在机器学习的无监督学习领域,聚类算法是探索数据内在结构的重要工具。层次聚类(Hierarchical Clustering)因其能够生成数据的层次化分组结构,在生物信息学、市场分析、文本挖掘等领域得到广泛应用。本文将从核心概念、算法原理、实现方法等方面深入解析层次聚类,并通过代码示例演示其在Python中的应用。
二、核心概念:什么是层次聚类?
层次聚类是一种通过构建数据点的层次结构实现聚类的无监督学习方法,其核心是将数据逐步合并(凝聚式)或分裂(分裂式),形成具有嵌套关系的簇(Cluster),最终生成一棵“树状图”(Dendrogram)。树状图的叶子节点是单个数据点,内部节点代表不同粒度的簇,根节点是包含所有数据的全局簇。
1. “层次”的含义
“层次”在层次聚类中体现为数据点的嵌套式分组结构,这种结构具有以下特性:
- 多粒度视角:用户可以通过树状图的不同层级观察数据,例如从“粗粒度”的大类(如“高价值用户”)到“细粒度”的子类(如“高价值年轻用户”)。
- 动态可调整性:无需预先指定簇数,用户可根据树状图中的距离阈值或业务需求灵活选择聚类数量。例如,在树状图中绘制一条水平线,与水平线相交的垂直线数量即为最终的簇数。
- 数据关系可视化:树状图直观展示了数据点之间的相似性和聚类过程。例如,在基因表达数据分析中,树状图可以揭示基因之间的进化关系或功能相似性。
2. 层次聚类的核心特点
- 无需预设簇数:聚类过程自然生成层次结构,用户可通过树状图动态决定簇数。
- 层次结构嵌套性:每个簇可以包含更小的子簇,形成类似“俄罗斯套娃”的结构。
- 适应任意形状的簇:相比K-means等基于质心的算法,层次聚类能够处理非球形簇(如环形、链状结构)。
三、算法分类:凝聚式 vs 分裂式
1. 凝聚式聚类(Agglomerative,自底向上)
- 初始状态:每个数据点自成一个簇(共n个簇)。
- 合并策略:按相似度(距离)逐步合并最接近的簇,直到所有簇合并为一个或满足停止条件。
- 典型场景:适用于小规模数据集,是最常用的层次聚类方法(如合并城市坐标点形成区域簇)。
2. 分裂式聚类(Divisive,自顶向下)
- 初始状态:所有数据点属于一个大簇。
- 分裂策略:递归将当前簇分裂为更小的子簇,直到每个子簇仅含一个数据点或满足条件。
- 特点:较少使用,因分裂条件复杂且计算成本高。
共性:贪心算法
两种方法均为贪心策略,每一步选择局部最优(如最近簇合并或最优分裂方式),但可能导致全局次优解。
四、距离度量:对象与簇的相似度计算
1. 对象间距离(数据点相似度)
- 欧氏距离(Euclidean Distance):最常用,适用于连续数值型数据,如二维坐标点距离:
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} d(x,y)=i=1∑n(xi−yi)2 - 曼哈顿距离(Manhattan Distance):适用于网格状数据(如城市街区距离):
d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x,y) = \sum_{i=1}^n |x_i - y_i| d(x,y)=i=1∑n∣xi−yi∣ - 余弦相似度(Cosine Similarity):衡量向量方向相似性,适用于高维稀疏数据(如文本词向量):
cos θ = x ⋅ y ∣ ∣ x ∣ ∣ ⋅ ∣ ∣ y ∣ ∣ \cos\theta = \frac{\mathbf{x} \cdot \mathbf{y}}{||\mathbf{x}|| \cdot ||\mathbf{y}||} cosθ=∣∣x∣∣⋅∣∣y∣∣x⋅y
2. 簇间距离(合并/分裂依据)
- 单链接(Single Linkage):两簇中最近点的距离(易形成链式结构,对噪声敏感)。
- 全链接(Complete Linkage):两簇中最远点的距离(倾向紧凑簇,抑制链式效应)。
- 平均链接(Average Linkage):两簇所有点对距离的平均值(平衡单/全链接优缺点)。
- 沃德法(Ward’s Method):最小化合并后簇的组内方差增量(适用于球形簇,基于方差分析)。
五、实战实现:基于Scipy的凝聚式聚类
1. 数据准备:生成示例数据集
import numpy as np
from sklearn.datasets import make_blobs# 生成3个中心的二维数据,共750个样本
X, _ = make_blobs(n_samples=750,centers=[[1, 1], [-1, -1], [1, -1]],cluster_std=0.4,random_state=0
)
2. 层次聚类执行与结果分析
from scipy.cluster.hierarchy import linkage, fcluster# 凝聚式聚类(沃德法,欧氏距离)
Z = linkage(X, method='ward', metric='euclidean')# 树状图可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
dendrogram(Z,truncate_mode='lastp', # 显示最后20次合并p=20,leaf_rotation=90, # 旋转叶子标签show_contracted=True, # 压缩重复分支title="Hierarchical Clustering Dendrogram"
)
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
3. 获取聚类结果
# 方法1:指定簇数(k=3)
labels_k3 = fcluster(Z, t=3, criterion='maxclust')# 方法2:指定距离阈值(如d=15)
labels_d15 = fcluster(Z, t=15, criterion='distance')
4. 结果可视化
plt.figure(figsize=(10, 8))
plt.scatter(X[:, 0], X[:, 1], c=labels_k3, cmap='prism', edgecolor='k')
plt.title("Clustering Result (k=3)")
plt.axis('off')
plt.show()
六、不同簇间距离方法对比
通过Scipy
可轻松切换簇间距离度量方法(如method='single'
、'complete'
、'average'
),不同方法对聚类结果的影响如下:
- 单链接:易受噪声影响,可能生成链式长簇。
- 全链接:对异常值敏感,但簇更紧凑。
- 沃德法:在球形簇数据中表现优异,是最常用的默认方法。
七、应用场景与优缺点
适用场景:
- 生物分类:基因表达数据的层次化分组。
- 市场细分:用户行为的多粒度聚类(如从“高价值用户”到具体细分群体)。
- 文本挖掘:文档层次结构构建(如按主题相似度生成分类树)。
- 图像分割:像素点层级合并,实现目标区域提取。
优点:
- 无需预设簇数,支持探索性分析。
- 层次结构直观展示数据内在关系。
- 适应任意形状的簇(如非球形簇)。
缺点:
- 计算复杂度高:凝聚式时间复杂度为O(n³),不适用于大规模数据(n>1000时需优化)。
- 不可逆性:早期合并错误可能影响全局结果。
- 距离敏感性:簇间距离度量的选择显著影响聚类效果。
八、总结
层次聚类通过层次化的簇合并或分裂,为数据提供了多维度的分组视角,是理解复杂数据结构的有效工具。尽管存在计算成本和参数选择的挑战,但其无需预设簇数和支持层次可视化的特点,使其在探索性分析中独具优势。实际应用中,建议结合树状图可视化和业务需求选择合适的距离度量方法,并针对大规模数据考虑优化算法(如BIRCH算法)。