很多做聚类的人其实都遇到过这么一个问题:用 Spectral Clustering 跑了半天,结果在某个结构稍微不均衡的数据集上,效果还不如一个简单的 KMeans。这时候你大概率会怀疑是自己的图构造没弄好,或者 k 值选错了。但说句实话,问题可能根本不在参数上,而是在谱聚类这个方法的"松弛"上——它为了能求解,把原始离散优化问题放得太松了。NIPS 2011 上那篇《Beyond Spectral Clustering: Tight Relaxations of Balanced Graph Cuts》,讲的就是这件事:它分析清楚了谱聚类到底在哪个环节"松"了,然后提出了更紧的凸松弛。这篇文章我想以复现者的角度,聊聊这套方法背后的逻辑、我在实现中踩过的坑,以及它到底适合用在哪类场景。
1. 谱聚类本质上是个"放松了两次"的离散优化
1.1 平衡图割的数学目标
先回到问题本身。所有基于图割的聚类,核心目标只有一句话:把图切开的代价最小,同时让切出来的两块尽量平衡。这里的"代价"通常用割边权重来衡量,而"平衡"则用块的规模或块的度总和来度量。
最常见的目标函数有三个,虽然长得像,但行为差异很大:
| 目标函数 | 数学形式 | 平衡方式 |
|---|---|---|
| RatioCut | ( \frac{\mathrm{cut}(S,\bar{S})}{ | S |
| NormalizedCut | ( \frac{\mathrm{cut}(S,\bar{S})}{\mathrm{vol}(S)} + \frac{\mathrm{cut}(S,\bar{S})}{\mathrm{vol}(\bar{S})} ) | 用度总和保持平衡 |
| CheegerCut | ( \frac{\mathrm{cut}(S,\bar{S})}{\min(\mathrm{vol}(S), \mathrm{vol}(\bar{S}))} ) | 只惩罚更小的一侧 |
我自己的体会是,Cheeger Cut 在数学性质上最"凶狠",它只关注小块的相对割比,所以它对"从一个大簇里切出一小块离群点"这种事特别敏感。而 NormalizedCut 是两端各打五十大板,反而容易出现某一边莫名被削小的解。
但关键是:所有这些都是离散组合优化,S 是顶点集的一个子集,问题是 NP 难的。你不可能直接枚举。
1.2 特征分解把约束放成了什么样
谱聚类的做法大家应该很熟:先构造图的拉普拉斯矩阵,取前 k 个特征向量,做归一化之后再 k-means。它的每一步推导似乎都很合理,但实际上做了一次非常猛的放松。
原始问题里,每个节点 i 对一个簇的隶属度 (x_i) 是二值的,要么 0,要么 1。到了谱聚类这边的连续松弛里,(x_i) 变成了任意实数;原来那个"每个点必须且只能归一个簇"的约束,被放宽成了 (X^T D X = I) 这种正交归一约束。也就是说,解出来的"簇指示向量"可以是任意实值向量,节点之间甚至能出现中间状态的"半归属"。
这还不是最狠的。更关键的是,谱聚类用的最小化方式是二次型 (x^T L x),这在数学上就等效于在做某种"全局平滑性"的惩罚。它是 L2 的,是平方的,这意味着只要你把某个节点的值从 0 改到 0.3,惩罚会按平方量级变化。对二
