MCM520 ← 资料站首页 层次聚类 · 深度手册 打开交互阅读器 →

层次聚类 · 深度手册

分类:聚类分类 | 难度:★★☆ 进阶 | 编号:hierarchical

一、这是什么(一句话用途)

不需预设 k 的谱系聚类(可画树状图)

二、核心思想

层次聚类不要求预先指定簇数,而是逐步构建一棵"聚类树"(dendrogram):自底向上(凝聚式,最常用)开始时每个样本自成一簇,每次合并最相似的两个簇,直到所有样本归为一棵树;之后想分几类,就在树上"横切一刀"。它的优势是可解释性强、能展现数据的自然层级结构(比如生物分类、文档主题层级),缺点是计算开销大(距离矩阵反复更新),且一旦合并无法撤销。

三、数学原理与推导

凝聚式聚类的核心是"簇间距离"定义,决定合并顺序:

  • 单链(single linkage):dSL(A,B)=min⁡a∈A,b∈Bd(a,b)d_{SL}(A,B)=\min_{a\in A,b\in B}d(a,b)——易形成链式拉长簇;
  • 全链(complete linkage):dCL(A,B)=max⁡a∈A,b∈Bd(a,b)d_{CL}(A,B)=\max_{a\in A,b\in B}d(a,b)——倾向紧凑球形簇;
  • 平均链(UPGMA):dUPGMA(A,B)=1∣A∣∣B∣∑a∈A∑b∈Bd(a,b)d_{UPGMA}(A,B)=\frac{1}{|A||B|}\sum_{a\in A}\sum_{b\in B}d(a,b);
  • Ward 法:合并使合并后总簇内平方误差增量最小:

Δ(A,B)=∣A∣∣B∣∣A∣+∣B∣∥mA−mB∥2 \Delta(A,B)=\frac{|A||B|}{|A|+|B|}\|m_A-m_B\|^2

其中 mA,mBm_A,m_B 为两簇质心。每轮选距离最小的两簇合并,更新距离矩阵,重复至单簇。最终按树状图在合适高度切割得到 kk 个簇。

四、建模 / 求解步骤

  1. 算样本间距离
  2. 找最近两簇合并
  3. 更新距离矩阵
  4. 重复至单簇
  5. 按树状图切分

五、关键公式速查

簇间距离: 单链 / 全链 / 平均链(常用 Ward)

六、典型示例

物种 / 文档按相似度建谱系,按需切层。

完整算例(数字演示,照着算一遍)

场景:同上 8 点,凝聚法。

合并顺序(距离):(1,1)-(1,2)=1 → 簇A;(2,1)-(2,2)=1 → 簇B;A-B=1.41 → 大簇;(4,5)-(5,4)=1.41 → 簇C;… 最终切 2 类与 K-Means 一致。

结论:树状图直观展示层次,不需预设 K(用剪枝定类数)。

七、Python 实现示例

import os, numpy as np
import pandas as pd, scipy.cluster.hierarchy as h, scipy.spatial.distance as d
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","hierarchical.csv"))
X = df[["x","y"]].to_numpy(dtype=float)
Z = h.linkage(X, method="ward")
# 切出 3 簇
labels = h.fcluster(Z, 3, criterion="maxclust")
print("簇标签(前10):", labels[:10])
print("簇数统计:", np.bincount(labels))

配套文件:py_hierarchical.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% 层次聚类示例(MATLAB,需 Statistics Toolbox)
df = readtable('..\datasets\hierarchical.csv');
X = table2array(df(:,1:2));
Z = linkage(X,'ward');
labels = cluster(Z,'MaxClust',3);
tabulate(labels);

配套文件:m_hierarchical.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

40 个二维散点。用于层次聚类(Ward)并切出 3 簇。

十、常见误区与避坑清单

  • 大样本慢(O(n³))
  • 距离定义影响大
  • 切层高度凭经验

十一、结果怎么解读

树状图看自然分层;切一刀定簇数。

十二、常与谁搭配

与 KMeans 互补。

十三、论文写作技巧(怎么把它写进论文)

把 层次聚类 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

区分你要的是无监督划分(聚类)还是有监督判别(分类)。说明特征维度与样本量,以及为什么选 层次聚类(如非线性边界用核方法、高维稀疏用线性、需概率输出用贝叶斯)。

2. 结果怎么写(图表与指标)

聚类给散点图着色 + 轮廓系数 / 肘部图;分类给混淆矩阵 + 准确率 / F1 / ROC 曲线。特征重要性图能加分。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 层次聚类 进行不需预设 k 的谱系聚类(可画树状图)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt 层次聚类 to 不需预设 k 的谱系聚类(可画树状图). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

聚类要说明簇数怎么定(不是拍脑袋);分类要交代训练 / 测试划分与交叉验证,避免过拟合误报高精度。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

为揭示客户群体的内在结构,本文采用 层次聚类 将 1,200 条样本划分为 4 类(轮廓系数=0.61),各类在消费频次与客单价上差异显著,为精准营销提供依据。

To reveal the intrinsic structure of customers, we apply 层次聚类 to partition 1,200 samples into 4 clusters (silhouette=0.61); the groups differ markedly in purchase frequency and average order value, supporting targeted marketing.

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。