目录
从零开始介绍谱聚类(Spectral Clustering)是什么、它想解决什么问题,以及它背后的“优化过程”到底在做什么。
一、什么是谱聚类,为什么要用它?
1.1 聚类的背景
- 聚类(Clustering) 是一种常见的数据分析方法,它的目标是“把一堆数据点分成若干组(或者类),使得同一组里的点彼此相似,不同组的点相对不那么相似”。
- 现实中,常见的例子:比如同学们的成绩单,有些人成绩分布很像(都很擅长某些科目),就会聚到一起;或者把大量的图片分成几类,猫狗一类,人一类,风景一类……
1.2 谱聚类的概念
- “谱”这个词来自“特征值谱(Eigen Spectrum)”。在数学中,一个矩阵的特征值往往被称为它的“谱”。
- 谱聚类(Spectral Clustering) 是利用一个特殊矩阵(叫做“图拉普拉斯矩阵”)的特征值和特征向量,来帮助把数据分群(聚类)。
- 跟其他聚类方法(比如常见的 k-means)相比,谱聚类在“复杂数据分布”或“非凸形状分布”的情景下,往往能有更好的效果。
1.3 数据可以看成“图”
- 谱聚类的一个重要观点是:把数据之间的相似度用“图”来表示。
- 可以想象成,每个数据点就是图中的一个“顶点” (vertex)。
- 如果两个数据点(顶点)彼此相似度很大,就在它们之间连上一条“边” (edge),并用数值(权重)表示它们有多相似。
- 这样,就把一堆数据用“图”这种结构表示了。在后面内容,将使用“图论”的概念(邻接矩阵、度矩阵、拉普拉斯矩阵)来做分析。
二、走进谱聚类:一步步构造过程
通常,谱聚类可以分为以下几个主要步骤:
- 构造相似度矩阵(邻接矩阵)
- 构造度矩阵
- 构造拉普拉斯矩阵
- 做特征值分解(找到拉普拉斯矩阵的若干特征向量)
- 在特征向量空间中做聚类
最终,就得到了对数据的分组结果。
接下来,要先把这些矩阵背后的概念说清楚,然后再结合案例或思路来看它怎么帮助我们完成“最小化某些损失(最小割)”这样的优化过程。
三、准备知识:向量、矩阵、特征值、特征向量
3.1 向量(Vector)
3.1.1 什么是向量?
- 在高中里,把向量理解成“既有大小又有方向的量”,比如平面上一个箭头。
- 在更高维度,向量就是一个有序的数字列表,比如 [ 1 3 5 ] \begin{bmatrix}1 \\ 3 \\ 5\end{bmatrix} 135 。
- 可以把“向量”想成“数据点”的坐标。例如,一个同学的“语数英”三门成绩,就可以放进向量 [ 语文 数学 英语 ] \begin{bmatrix}\text{语文} \\ \text{数学} \\ \text{英语}\end{bmatrix} 语文数学英语 里。
3.1.2 向量间的距离
- 如果有两个向量
x
=
(
x
1
,
x
2
)
\mathbf{x} = (x_1, x_2)
x=(x1,x2) 和
y
=
(
y
1
,
y
2
)
\mathbf{y} = (y_1, y_2)
y=(y1,y2),它们之间的距离可以用勾股定理计算:
d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 d(\mathbf{x}, \mathbf{y}) = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2} d(x,y)=(x1−y1)2+(x2−y2)2 - 在更高维里也是同理,只是多了几个平方项而已。
(这个距离概念对于后面“计算相似度”也很重要:距离小往往意味着相似度大,反之相似度小。)
3.2 矩阵(Matrix)
3.2.1 什么是矩阵?
- 在高中课本里,矩阵是一张二维数表,里面摆满了数字:
[ 1 2 3 4 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} [1324] - 你也可以把矩阵理解为“线性变换的工具”,它能把一个向量乘起来变成另一个向量,涉及到一些线性代数思想。
3.2.2 在图中,矩阵可以表示哪些信息?
- 邻接矩阵( A A A):如果有 n n n 个顶点,就会有一个 n × n n \times n n×n 的矩阵 A A A。第 i i i 行,第 j j j 列上的数字表示第 i i i 个顶点和第 j j j 个顶点之间的“相似度”或“连接强度”。
- 度矩阵( D D D):度矩阵是一个对角矩阵,每个顶点的“度”放在对角线上。这里,“度”就是该顶点与其它顶点连接的“总相似度”。
- 拉普拉斯矩阵( L L L):这是谱聚类的核心,用来反映图的结构特性(哪些点联系紧密、哪些点孤立)。
3.3 特征值(Eigenvalue)和特征向量(Eigenvector)
3.3.1 初步认识
- 对一个矩阵
M
M
M,如果我们找到一个向量
v
\mathbf{v}
v,并且有
M v = λ v , M \mathbf{v} = \lambda \mathbf{v}, Mv=λv,
其中 λ \lambda λ 是一个数字,那么 λ \lambda λ 就叫做这个矩阵的“特征值”, v \mathbf{v} v 就叫这个矩阵的“特征向量”。 - 通俗解释:假设 M M M 代表一种“线性变换”,当这个变换作用在某些特殊向量上时,只会让这些向量变长或缩短,而不会旋转方向。这些特别的向量就是“特征向量”,拉伸/收缩的倍数就是“特征值”。
3.3.2 为什么谱聚类要用它?
- 拉普拉斯矩阵 L L L 的一些最小特征值对应的特征向量,可以帮我们把数据从“很难直接看出分组”转到“比较容易分出分组”的空间。
- 简单来讲,不同特征向量会揭示图里“不同的分割线索”,从而帮助区分数据的不同聚类。
四、谱聚类的算法流程(与知识点的关联)
现在准备开始真正的“谱聚类”过程。
步骤1:构造相似度矩阵(邻接矩阵 A A A)
- 对于每对数据点 ( i , j ) (i, j) (i,j),先算它们的距离。如果距离小,就表示它们很相似;如果距离大,就不相似。
- 根据需要,“相似度”可以用高斯函数 exp ( − ∥ x i − x j ∥ 2 / 2 σ 2 ) \exp(-\|x_i - x_j\|^2 / 2\sigma^2) exp(−∥xi−xj∥2/2σ2)(看不懂没关系,你可以把它理解成“距离越小,指数值越大”);也可以用简单的方法:如果距离 < 某个阈值,就记 1;否则记 0。
- 最终得到一个 n × n n\times n n×n 矩阵 A A A: A i j A_{ij} Aij 表示第 i i i 个点和第 j j j 个点的相似度。
知识点:这是在用二维或多维坐标求距离,再用一个函数把距离映射到0到1之间,形成“相似度”。
步骤2:构造度矩阵 D D D
-
degree
(
i
)
\text{degree}(i)
degree(i) 表示第
i
i
i 个点与其它所有点的“相似度之和”。
d i = ∑ j = 1 n A i j . d_i = \sum_{j=1}^n A_{ij}. di=j=1∑nAij. - 把所有点的度放到对角线上,形成度矩阵
D
D
D。
D = [ d 1 0 … 0 0 d 2 … 0 ⋮ ⋮ ⋱ ⋮ 0 0 … d n ] . D = \begin{bmatrix} d_1 & 0 & \dots & 0 \\ 0 & d_2 & \dots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \dots & d_n \end{bmatrix}. D= d10⋮00d2⋮0……⋱…00⋮dn .
知识点:对角矩阵,就是除了主对角线有数字外,其它位置都是零;这里的 d i d_i di 就在第 i i i 行、第 i i i 列的位置。
步骤3:构造拉普拉斯矩阵 L L L
- 常用的拉普拉斯矩阵有两种主要形式:
- 未经归一化的: L = D − A L = D - A L=D−A。
- 归一化的: L sym = D − 1 / 2 ( D − A ) D − 1 / 2 L_{\text{sym}} = D^{-1/2}(D - A)D^{-1/2} Lsym=D−1/2(D−A)D−1/2 (如果看不懂,不必太纠结,只要知道它也是从 D D D 和 A A A 演变来的就行)。
- 只需要知道:拉普拉斯矩阵综合了“相似度”和“度”的信息,是图结构的一个核心表达。
知识点:矩阵的加减法是对应元素相加减,这里就不难理解;而 D − 1 / 2 D^{-1/2} D−1/2 表示对角线上元素取倒数的平方根,对角矩阵这样操作仍然很简单。
步骤4:对拉普拉斯矩阵 L L L 做特征值分解
- 求出 L L L 的前 k k k 个最小特征值(即最小的 λ \lambda λ)和对应的特征向量。为什么是最小的?因为在拉普拉斯矩阵里,最小特征值往往携带最主要的“分割信息”。
- 把这些特征向量合在一起,形成一个新的“坐标系”或者“特征空间”。
4.1 举个直观例子(不一定严谨)
- 如果图有两个明显的连通分支A和B(彼此边很少),那么对应的拉普拉斯矩阵会有一个很小的特征值,表示你可以用对应的特征向量把A和B区分开。
- 在一般的场景中,我们可能想分成 k k k 类,就取前 k k k 个最小特征值的特征向量。
知识点:特征值、特征向量的概念已做过介绍。计算它们需要一些线性代数方法,手算可能很麻烦,但在电脑中可以用库函数得到。
步骤5:在特征向量空间里做聚类
- 我们把每个点在这 k k k 个特征向量上得到的“坐标”当作新的表示。
- 然后,就用一个简单的聚类方法(比如 k-means)去把这些新的坐标分成 ( k (k (k 类。
- 这样得到的分组,映射回原本的数据点,就完成了谱聚类的任务:把原数据分成 k k k 个簇。
高中知识点:k-means是一种几何算法,反复把点分到最近的中心,再更新中心位置。这里的中心只需要在新的特征坐标系下计算就可以。
五、谱聚类在优化什么?(深层原理)
到这里,你可能会问:“好啊,我知道算法是怎么做的,可它到底在优化什么?为什么要找拉普拉斯矩阵的最小特征向量呢?”
在更高阶的数学里,有一个概念叫做 “图割”(Graph Cut):
- 如果想把图分成两个部分,就势必要切断一些“边”。我们希望在“割”掉的边数(或边权重)最小的情况下,把图分成两块(或更多块)。
- 这个“最小割(Min Cut)”或“归一化割(Normalized Cut)”的问题,在数学上常是一个比较难的“离散优化”。
- 谱聚类提供了一个思路:把这个离散问题松弛成一个“连续问题”,就是去寻找拉普拉斯矩阵的一些特征向量来近似求解。最后再把它“离散化”成真正的两(或多)块划分。
5.1 最小割(Min Cut)的直觉
- 设想你想让“同一簇里的点”尽可能彼此距离近、而跨簇的距离远,那就等价于说“把图切开时,要切的边数或权重要尽可能小”。
- 从而,你希望找到一个“最优分割”使割掉的总边权很小。
5.2 拉普拉斯矩阵最小特征向量与最小割的关系
- 有数学定理(用到了二次型和 Rayleigh Quotient 等概念)表明:
“寻找能让 v T L v \mathbf{v}^T L \mathbf{v} vTLv(相当于割)最小的某些 v \mathbf{v} v,和找拉普拉斯矩阵的最小特征向量是一致的方向”。 - 对于两个连通分支完全不连通的情况,拉普拉斯矩阵会有一个 0 特征值,对应的特征向量可以完美区分两个分支。
5.3 概括
谱聚类 就是 “把一个离散且复杂的‘最小割’或‘归一化割’问题,通过研究图拉普拉斯矩阵的特征值与特征向量来得到近似解的一种方法”。
六、一个“小案例”串联全流程
下面用一个非常简单的示例来感受一下(只体现主要逻辑,不深入大规模计算)。
6.1 数据和相似度构造
- 我们有 4 个点:
(
0
,
0
)
(0,0)
(0,0),
(
1
,
0
)
(1,0)
(1,0),
(
0
,
1
)
(0,1)
(0,1),
(
5
,
5
)
(5,5)
(5,5)。
- 前三个点互相距离都比较近, ( 5 , 5 ) (5,5) (5,5) 离其它三点就很远。
- 计算距离:
- d ( ( 0 , 0 ) , ( 1 , 0 ) ) = 1 d((0,0),(1,0)) = 1 d((0,0),(1,0))=1
- d ( ( 0 , 0 ) , ( 0 , 1 ) ) = 1 d((0,0),(0,1)) = 1 d((0,0),(0,1))=1
- d ( ( 1 , 0 ) , ( 0 , 1 ) ) = 2 ≈ 1.41 d((1,0),(0,1)) = \sqrt{2}\approx1.41 d((1,0),(0,1))=2≈1.41
- d ( ( 5 , 5 ) , 前面任意一点 ) ≈ 7 或 6.4 d((5,5),\text{前面任意一点})\approx 7 \text{ 或 }6.4 d((5,5),前面任意一点)≈7 或 6.4
- 如果我们用“距离 ≤ 2 \leq 2 ≤2 就记相似度=1,否则=0”的简单阈值,相似矩阵 A A A 就会是:
A
=
[
0
1
1
0
1
0
1
0
1
1
0
0
0
0
0
0
]
.
A = \begin{bmatrix} 0 & 1 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix}.
A=
0110101011000000
.
(对角线为0,因为自己跟自己可以忽略。
A
i
j
=
1
A_{ij}=1
Aij=1 表示它们距离<2)
6.2 度矩阵
- 第1行(对应第1个点)与其它点的相似度之和是(1+1+0=2),第2行也是2,第3行也是2,第4行是0。
D = [ 2 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 ] D = \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} D= 2000020000200000
6.3 拉普拉斯矩阵
- L = D − A L = D - A L=D−A:
L = [ 2 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 ] − [ 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 ] = [ 2 − 1 − 1 0 − 1 2 − 1 0 − 1 − 1 2 0 0 0 0 0 ] L = \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} - \begin{bmatrix} 0 & 1 & 1 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} = \begin{bmatrix} 2 & -1 & -1 & 0 \\ -1 & 2 & -1 & 0 \\ -1 & -1 & 2 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} L= 2000020000200000 − 0110101011000000 = 2−1−10−12−10−1−1200000
6.4 求拉普拉斯矩阵的特征值、特征向量(只看概念)
- 不展开繁琐细节,最终我们会发现:
- 它有一个 0 特征值,对应特征向量如 [ 1 1 1 0 ] \begin{bmatrix}1\\1\\1\\0\end{bmatrix} 1110 ,表示前3个点是一伙;
- 另一份 0 特征值对应 [ 0 0 0 1 ] \begin{bmatrix}0\\0\\0\\1\end{bmatrix} 0001 ,表示第4个点独立成一伙。
- 这正好揭示“ ( 0 , 0 ) (0,0) (0,0), ( 1 , 0 ) (1,0) (1,0), ( 0 , 1 ) (0,1) (0,1)” 与 “ ( 5 , 5 ) (5,5) (5,5)”这两块分别是各自连通分量。
6.5 在特征向量空间聚类
-
如果我们只取最小的2个特征值对应的特征向量,排成矩阵:
V = [ 1 0 1 0 1 0 0 1 ] V = \begin{bmatrix} 1 & 0 \\ 1 & 0 \\ 1 & 0 \\ 0 & 1 \end{bmatrix} V= 11100001 -
这时候,每个点在这个空间的坐标就是:
- ( 1 , 0 ) (1,0) (1,0)
- ( 1 , 0 ) (1,0) (1,0)
- ( 1 , 0 ) (1,0) (1,0)
- ( 0 , 1 ) (0,1) (0,1)
-
用 k-means(设 k = 2 k=2 k=2)一聚,自然发现前三个在一起,一个单独一类。
这完美符合我们的直观判断。
七、总结
-
谱聚类的思路:
- 把数据视为图,用“相似度”构造邻接矩阵;
- 用度矩阵得到拉普拉斯矩阵;
- 通过特征值分解(尤其是最小特征值对应的特征向量),找到最容易分割的方向;
- 在该特征子空间里用简单的聚类方法,把数据自动分出若干簇。
-
它在优化什么?
- 谱聚类实际上在近似求解“最小割”或“归一化割”之类的图划分问题:让同簇点之间的连线尽量多,簇与簇之间的连线尽量少,从而实现“内部紧密、外部稀疏”的聚类效果。
-
需要具备的知识:
- 向量与矩阵:知道它们是什么、怎么加减、怎么乘;
- 特征值与特征向量:理解这是“方向不变、只有长度变”的特殊向量;
- 函数与距离:对距离公式、指数函数(若采用高斯核)有概念就可以。
-
真正的数学:
- 背后会用到更多的线性代数(特征分解、奇异值分解、正交基等)和图论(最小割、度、连通分量)知识;
- 但理解其大概机理,不一定要手算特征值——知道“用矩阵特征分解帮助做优化”即可。
额外说明(如果还想更深入一点点)
- 指示向量(Indicator Vector):在图划分的理论里,常把“某个子集S里的顶点记1、外面顶点记0”做成一个向量,称作指示向量。最小割问题可用这个离散向量来表达。但离散的0/1问题往往不好直接求解,因此引入连续的特征向量来做近似。
- 归一化拉普拉斯矩阵:为了平衡节点度数差异,实际中会用归一化版本做特征分解;这不影响主要思路,依然是“找拉普拉斯谱中最小特征值的方向”。
最后结论
- 谱聚类是把数据点相似度看成一张“加权图”,再通过拉普拉斯矩阵的特征值分析来找到一个较优的划分方式。
- 从一般水平理解:
- 只要会算距离(判断相似度),知道矩阵里每行每列代表什么,就能跟上大部分过程;
- 记得特征值、特征向量会提供找“分割方向”的线索;
- 剩下的就是在那个特征空间上做一个普通的聚类(如 k-means)就行。
这样,就能大致明白谱聚类在做什么,以及它背后的优化思想“最小割 + 连通结构”的原理了。