P4-17.3 补充学习:层次聚类与谱聚类¶
Section ID:
P4-17.3Version:v2026.07.23
如果在 P4-17.1 里已经看过 k-means 和 DBSCAN,接下来通常会留下这样一个问题。
为什么聚类算法会有这么多名字,它们彼此之间到底有什么不同?
第一次整理这个问题时,经常会再次遇到的两个名字,就是层次聚类(hierarchical clustering)和谱聚类(spectral clustering)。
这一节不是展开两种方法的实现细节,而是从它们打算依据什么来形成分组这个角度,做一次入门区分。
本节范围¶
这一节回答下面这些问题。
- 层次聚类会一步一步展示什么?
- 为什么会说谱聚类比起距离,更先看连接结构?
- 和 k-means、DBSCAN 相比,这两种方法会在什么场景下先被想到?
- 第一次区分这四种方法时,最先值得记录什么?
这一节集中区分像树一样逐步合并的视角和把图切开后再分组的视角。
用补充学习:如何第一次区分层次聚类与谱聚类留下的判断标准¶
- 能把层次聚类解释为
展示合并顺序的聚类。 - 能把谱聚类解释为
重新读取连接结构后再分组的聚类。 - 能说明 k-means、DBSCAN、层次聚类、谱聚类是从不同问题出发的。
为什么需要这一节¶
刚开始学聚类时,算法名字越多,反而越容易更混乱。
- k-means 看中心
- DBSCAN 看密度
- 可有的方法又说像树,有的方法又说像图
这里重要的不是记住更多名字,而是先抓住这个算法打算用什么来理解聚类。
也就是说,17.3 会把聚类家族重新整理成 中心、密度、合并顺序、连接结构 这四种直觉。
层次聚类展示的是什么¶
层次聚类不是一开始就把点切成固定数量的几个聚类,而是想一步一步展示什么先变近、什么后合并。
入门时,先抓住下面这一句就够了。
层次聚类不仅给出一个聚类结果,也把分组生长的顺序一起展示出来。
假设有四位客户。
- A 和 B 非常相似
- C 和 D 也相当相似
- A/B 这一组和 C/D 这一组彼此稍远
这时,层次聚类可以展示出这样一个顺序:A 和 B 先合并,C 和 D 再合并,最后这两个小组再合成一个更大的组。
flowchart TB
A["簇 A"]
B["簇 B"]
C["簇 C"]
D["簇 D"]
AB["A+B 合并"]
CD["C+D 合并"]
ALL["(A+B)+(C+D) 合并"]
A --> AB
B --> AB
C --> CD
D --> CD
AB --> ALL
CD --> ALL
这个图里的重点不是最终有几个聚类,而是合并顺序。所以当你还没有决定要切成几个组,但想先看看什么会先靠近时,层次聚类就会自然地浮现出来。
把这个差别再写短一点,可以这样理解。
| 你最先想知道的事 | 为什么层次聚类更合适 |
|---|---|
| 现在到底该看成 2 组还是 4 组还不明确 | 因为可以先看合并顺序,再回过头决定切割位置 |
| 想先看哪些样本最早互相接近 | 因为它展示的是逐步靠近的阶段,而不只是最终聚类数 |
| 想结合领域审查来调节分组层级 | 因为它能同时提供多个层级的分组候选,而不是只有一个固定答案 |
所以,层次聚类更接近于先看分组是怎样长出来的,再决定在什么高度切开来读,而不是一次就找出正确的聚类数。因此在领域解释还没稳定下来的早期探索阶段,它尤其有用。
谱聚类想看的是什么¶
谱聚类并不只是按坐标距离来读点,而是试图通过谁和谁相连这样的图(graph)结构来重新理解它们。
入门时,可以先抓住下面这句话。
谱聚类比起附近点的外形,更擅长读取连接关系在哪里断开。
假设有两团像月牙一样弯曲的数据。在这种场景里,以中心为基础的 k-means 可能会把边界切得太直;如果改看连接结构,就更可能自然地把同一条曲线上的点读成一组。
flowchart TD
A["点集"]
B["构建相似度图"]
C["寻找连通结构"]
D["把图切分成群组"]
A --> B --> C --> D
这里的重点不是是不是直接切原始坐标,而是先把连接关系构造成新的表达,再去切这个结构。所以,当问题场景是形状很复杂,但连接关系仍然很清晰吗时,就会想到谱聚类。
把这点再直接比较一下,可以这样读。
| 最先撞到的问题 | 为什么会想到谱聚类 |
|---|---|
| 用中心点来切,会把弯曲结构从中间切断 | 因为比起几何中心,更自然的是先读连接关系 |
| 有些点看起来离得远,但其实沿着同一条曲线延续 | 因为把邻居关系做成图之后,更容易看见同一结构内部的连通性 |
| 聚类形状不像圆团那样规整 | 因为比起只依赖一个距离,重新构造图结构可能更合适 |
不过,也不能因为形状复杂就认定谱聚类一定正确。真正的核心问题是:当把邻域关系构造成图时,是否能更清楚地暴露出同一结构内部的连接。换句话说,更准确的理解方式是:谱聚类是在重新表达连接关系后,再去读这个结构,而不是直接去切坐标。
把四种直觉并排来看¶
把 Chapter 17 出现过的代表性直觉放进一张表里,可以整理成下面这样。
| 方法 | 最先看的东西 | 自然会想到它的场景 | 首先要小心的点 |
|---|---|---|---|
| k-means | 中心(center) | 想快速看到圆形且相对均匀的分组时 | 对聚类数和形状假设很敏感 |
| DBSCAN | 密度(density) | 想把噪声单独留下并观察不规则分组时 | 对 eps 和 min_samples 很敏感 |
| 层次聚类 | 合并顺序 | 想分阶段观察分组如何长大时 | 仍然需要解释到底在哪里切开 |
| 谱聚类 | 连接(connectivity) | 形状复杂但连接结构很清楚时 | 对相似度图怎么构造很敏感 |
这张表的目的不是比较高下,而是先抓住它们是用不同把手来读取聚类这一点。
如果把这个比较改写成更具体的选择问题,可以写成这样。
| 现在最先要问的问题 | 更先想到的方法 |
|---|---|
| 比起立刻固定聚类数,更想先看合并顺序吗 | 层次聚类 |
| 想把噪声单独保留并观察不规则分组吗 | DBSCAN |
| 想快速拿到圆形且相对均匀分组的基线吗 | k-means |
| 想切开弯曲或复杂的连接结构吗 | 谱聚类 |
如果把层次聚类和谱聚类真正分开的场景写得更直接一点,会是这样。
| 最先撞到的问题 | 更自然的起点 |
|---|---|
比起切成几个组,你更想知道什么先合并吗 | 层次聚类 |
比起分组数,靠近的顺序本身就是解释线索吗 | 层次聚类 |
| 是否存在用中心点很难看清的弯曲结构 | 谱聚类 |
比起坐标距离,谁和谁连在一起看起来更重要吗 | 谱聚类 |
案例与示例¶
案例 1. 当还没决定客户分群要切成几层时¶
假设订阅服务团队想给客户分组,但一开始很难直接固定成3 个聚类或4 个聚类。这时,层次聚类就可能成为一个更合适的起点。因为通过观察哪些客户先靠近、在哪个阶段会并成更大的组,团队可以结合领域审查去判断:现在更自然的是看成 2 组,还是看成 4 组。
所以,在这个场景里,重要的不是自动找出正确的聚类数,而是看分组是怎样长出来的,从而更谨慎地提出解释候选。
flowchart TD
A["客户行为表"]
B["固定 k 仍然说不清"]
C["观察哪些群组最先合并"]
D["比较切成 2 组和 4 组的结果"]
E["结合领域背景复核分群含义"]
A --> B --> C --> D --> E
案例 2. 当弯曲的移动路径很难用中心点切好时¶
如果数据像位置日志或移动轨迹那样呈现长长的弯曲形状,k-means 可能会按中心点把它切得过于笔直。在这种场景里,人们往往更关心同一条曲线上的点是否保持连在一起,这时就可以想到谱聚类。也就是说,这类问题里,比起最近的中心是什么,更重要的是它们是否仍然连接在同一个结构里。
flowchart TD
A["沿曲线分布的轨迹点"]
B["基于中心的切法显得别扭"]
C["检查邻域连通关系"]
D["按连通结构切分"]
E["复核曲线是否仍保持完整"]
A --> B --> C --> D --> E
把这两个案例放在一起看,差别会更清楚。
| 案例里最先读到的问题 | 更合适的方法 | 理由 |
|---|---|---|
| 还不确定客户分组应该读成几个层级吗 | 层次聚类 | 因为可以一边看合并顺序,一边比较多个切割层级 |
| 想看弯曲的移动路径是否仍属于同一结构吗 | 谱聚类 | 因为比起中心,更自然的是先读连接结构 |
也就是说,层次聚类更接近于解释分组是怎样长出来的顺序,而谱聚类更接近于观察连接结构是否被保留下来。
练习与示例¶
这一段练习改成了可核对的验证型练习:先自己判断应该先想到哪一种聚类直觉,再和下面的说明对照。
- 问题场景:按场景区分圆形分组、不规则分组、合并顺序、连接结构里哪一个最先重要
- 输入(input):4个简短的问题场景
- 期望输出(output):每个场景里最先应该想到的方法和理由
- 要确认的概念:
- 在算法名字之前,还有必须先读的问题
- 即使是同一份数据,起点也会随着
你想看什么结构而变化
先把下面表格里的最先想到的方法一列遮住,自己先写出判断,再和表中的答案与理由比较。
| 场景 | 最先想到的方法 | 为什么先想到它 |
|---|---|---|
| 想快速得到一个针对圆形且较均匀分组的基准线 | k-means | 因为这个问题先从中心出发,想快速形成分组 |
| 想把噪声单独留下,并观察不规则分组 | DBSCAN | 因为这个场景首先关心的是密度与噪声分离 |
| 在固定聚类数之前,更想先看什么会最先合并 | 层次聚类 | 因为这里真正的解释线索是合并顺序本身 |
| 想保留弯曲结构,而基于中心的切法看起来很别扭 | 谱聚类 | 因为先读连接结构比先读中心更自然 |
这段练习的重点不是背算法名字,而是先问我到底想看什么结构。比起答对名称,更重要的是能说明为什么这个场景会先把这个问题推到前面。
第一次比较时值得记录什么¶
刚开始时,比起实现细节,更实用的是先记下下面这些问题。
| 要记录的问题 | 为什么需要 |
|---|---|
| 是否需要从一开始就固定聚类数 | 因为这会成为区分 k-means 和其他方法的第一条标准 |
| 是否需要把噪声单独留下 | 因为这会决定是否需要 DBSCAN 这类直觉 |
| 合并顺序本身是否重要 | 因为这会成为想到层次聚类的理由 |
| 形状很复杂时,连接结构是否看起来更重要 | 因为这会成为想到谱聚类的理由 |
如果先把这些问题写下来,就会更容易读出当前这个数据场景需要哪一种聚类直觉,而不是只顾着记算法名字。
检查清单¶
- 你能说明层次聚类展示的是
什么先合并,而不只是最后分成几个组吗? - 你是否理解:谱聚类更接近重新读取
连接结构,而不是单独重新读取距离本身? - 这是不是一个比起立刻固定聚类数,更想先看什么先靠近的场景?
- 这是不是一个必须先看连接结构,而不只是形状不规则的场景?
- 你能不能不把聚类结果当成唯一答案,而是说明为什么这个方法会先从这个问题里浮现出来?
- 你能不能再用
中心、密度、顺序、连接这四条轴,把 k-means、DBSCAN、层次聚类、谱聚类区分开来?
出处与参考资料¶
- scikit-learn developers,
2.3. Clustering, scikit-learn User Guide. 用于确认 hierarchical clustering、spectral clustering、k-means、DBSCAN 的基本说明和比较轴。确认日期: 2026-07-19. https://scikit-learn.org/stable/modules/clustering.html - Ulrike von Luxburg,
A Tutorial on Spectral Clustering, Statistics and Computing, 2007. 用于确认把 spectral clustering 连接到 graph Laplacian 与连接结构视角的背景。确认日期: 2026-07-19. https://doi.org/10.1007/s11222-007-9033-z