跳转至

P4-17.3 补充学习:层次聚类与谱聚类

Section ID: P4-17.3 Version: 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) 想把噪声单独留下并观察不规则分组时 epsmin_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