Spectral Clustering 从入门到入门
0x00 Introduction
写这篇文章的由头是因为自己前一阵读了Thomas N. Kipf, Max Welling大佬的Semi-Supervised Classification with Graph Convolutional Networks 这篇文章。 文章核心在于怎么用数学的方式减小用在Graph数据上神经网络的运算量。因为之前所接触的神经网络限于Andrew NG的两门课,故而没接触过处理Graph的情况。这里的Graph指点集,边集构成的图。这篇文章并非paper的讲解。只是记录一下我关于Graph Clustering这个领域的入门心得。![]() |
Figure 1 |
0x01 Graph Clustering
直觉上: Graph Clustering是把一个大的图分割成多个子图。如图Figure 1 所示,我们希望cluster之间的相似度尽可能小,希望同一个cluster里点的相似度尽可能大。数学上: 我们可以写出这样的函数:
Cut(A_1,A_2,...,A_k) := \frac{1}{2} \sum_{i=1}^{k}W(A_i,\bar A_i)
这里的\bar A_i 表示集合A的补集, W(A,B) 代表对所有属于A集合的点i 到所有属于B集合的点j 相似度求和。
W(A,B) := \sum_{i\in A,j\in B}w_{ij}
但是可以想象如果把每个节点都设为一个cluster的话Cut函数一定会取得最小值,但这并不是我们想要的。
改进:
直觉上:我们希望每个cluster尽可能大。
数学上:我们可以加上一个约束项,对于'大'的不同理解我们有两种改进方式。
RatioCut(A_1,A_2,...,A_k) := \frac{1}{2}\sum_{i=1}^{k}\frac{W(A_i,\bar A_i)}{\left | A_i \right |} = \sum_{i=1}^{k}\frac{cut(A_i,\bar A_i)}{\left | A_i \right |}
Ncut(A_1,A_2,...,A_k) := \frac{1}{2}\sum_{i=1}^{k}\frac{W(A_i,\bar A_i)}{vol(A_i)} = \sum_{i=1}^{k}\frac{cut(A_i,\bar A_i)}{vol(A_i)}
RatioCut 认为集合里面包含的点的数量多叫做'大';
Ncut认为集合里面边权重和越大,那么集合越'大';
0x02 Laplacian Matrix
需要先把刚才的内容放在一边,生硬的先讲拉普拉斯矩阵。根据定义 L= D - A ,L就是拉普拉斯矩阵。
![]() |
Figure 2 |
定义里面D 代表一个图的Degree Matrix,A代表图的Adajacency Matrix.
Degree Matrix, D:
\begin{bmatrix} 2 &0 & 0 & 0 & 0 &0 \\ 0& 3 & 0 & 0 & 0 & 0\\ 0& 0& 2 & 0 & 0 &0 \\ 0& 0 & 0 &3 & 0 &0 \\ 0& 0& 0& 0 &3 &0 \\ 0& 0& 0 &0 & 0 &1 \end{bmatrix}
Adajacency Matrix, A:
\begin{bmatrix} 0 & 1 & 0 & 0 & 1 &0 \\ 1& 0 & 1 & 0 & 1 & 0\\ 0& 1& 0 & 1 & 0 &0 \\ 0& 0 & 1 &0 & 1 &1 \\ 1& 1& 0& 1 &0 &0 \\ 0& 0& 0 & 1 & 0 &0 \end{bmatrix}
Then D - A = L , L:
\begin{bmatrix} 2 & -1 & 0 & 0 & -1 &0 \\ -1& 3 & -1 & 0 & -1 & 0\\ 0& -1& 2 & -1 & 0 &0 \\ 0& 0 & -1 &3 & -1 &-1 \\ -1& -1& 0& -1 &3 &0 \\ 0& 0& 0 & -1 & 0 &1 \end{bmatrix}
\begin{bmatrix} 2 &0 & 0 & 0 & 0 &0 \\ 0& 3 & 0 & 0 & 0 & 0\\ 0& 0& 2 & 0 & 0 &0 \\ 0& 0 & 0 &3 & 0 &0 \\ 0& 0& 0& 0 &3 &0 \\ 0& 0& 0 &0 & 0 &1 \end{bmatrix}
Adajacency Matrix, A:
\begin{bmatrix} 0 & 1 & 0 & 0 & 1 &0 \\ 1& 0 & 1 & 0 & 1 & 0\\ 0& 1& 0 & 1 & 0 &0 \\ 0& 0 & 1 &0 & 1 &1 \\ 1& 1& 0& 1 &0 &0 \\ 0& 0& 0 & 1 & 0 &0 \end{bmatrix}
Then D - A = L , L:
\begin{bmatrix} 2 & -1 & 0 & 0 & -1 &0 \\ -1& 3 & -1 & 0 & -1 & 0\\ 0& -1& 2 & -1 & 0 &0 \\ 0& 0 & -1 &3 & -1 &-1 \\ -1& -1& 0& -1 &3 &0 \\ 0& 0& 0 & -1 & 0 &1 \end{bmatrix}
拉普拉斯矩阵有如下性质:
- L是对称半正定矩阵 (symmetric and positive semi-definite matrix),对于每个 f \in \mathbb{R}^n ,下面式子成立:
f'L f=\frac{1}{2}\sum_{i,j=1}^{N}w_{ij}(f_i-f_j)^2
Proof :
f'Lf
= f'Df - f'Wf
= \sum_{i=1}^{n}d_if_i^2 - \sum_{i,j=1}^{n}f_if_jw_{ij}
=\frac{1}{2}(\sum_{i=1}^{n}d_if_i^2 - 2\sum_{i,j=1}^{n}f_if_jw_{ij} + \sum_{j=1}^{n}d_jf_j^2 )
=\frac{1}{2}\sum_{i,j=1}^{n}w_{ij}(f_i-f_j)^2
- L有n个非负,实数特征值,最小的为0, 最小的特征值0所对应的特征向量是\vec{1}
0=\lambda_1 \leq \lambda_2 ... \leq \lambda_n
0x03 Eigenvalue & Eigenvectors 特征值 & 特征向量
这里A是一个矩阵,\vec{v}是一个向量,\lambda是一个实数
A\vec{v} = \lambda\vec{v}
满足上式的\vec{v}是特征向量,\lambda为其对应的特征值0x04 Connect RatioCut to Laplacian Matrix
目标是 min RatioCut(A_1,A_2...A_j...A_k)
为此我们引入{A_1,A_2...A_j...A_k}的指示向量 h_j = \{h_1,h_2...h_i...h_n\} , j = 1...k, i = 1... N; j表示子集下标, i 表示样本下标, 具体的值为:
h_{j,i}=\begin{cases} \frac{1}{\sqrt{|A_j|}} & \text{ if } v_i \in A_j\\ 0 & \text{ if } v_i \notin A_j \end{cases}
每一个子集A_j对应一个指示向量h_j,每个h_j里面有N个元素分别代表N个样本点的指示结果。如果在原始数据中第i个样本被分割到了子集A_j中,那么h_j的第i个元素值为\frac{1}{\sqrt{|A_j|}},否则为0.
这里h_j是一个长度为N的向量
\begin{align*} h_j^TLh_j &=h_j^T(D-W)h_j \\ &=h_j^TDh_j - h_j^TWh_j \\ &= \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}D_{m,n} -\sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} \\ &=\sum_{m=1}h_{j,m}^2D_{m,m} - \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} \\ &= \frac{1}{2}(\sum_{m=1}h_{j,m}^2D_{m,m} - 2 \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}h_{j,n}^2D_{n,n}) \end{align*}
步骤解释:
第一第二步:拉普拉斯变换
第三步:把矩阵的乘法变成element-wise乘法
第四步:由于D是对角阵,非主对角线元素为0。
第五步:代数变换
然后:
\begin{align*} h_j^TLh_j &= \frac{1}{2}(\sum_{m=1}h_{j,m}^2D_{m,m} - 2 \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}h_{j,n}^2D_{n,n}) \\ &=\frac{1}{2}(\sum_{m=1}\sum_{n=1}h_{j,m}^2w_{m,n} - 2\sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}\sum_{m=1}h_{j,n}^2w_{n,m})\\ &=\frac{1}{2}\sum_{m=1}\sum_{n=1}(h_{j,m}-h_{j,n})^2 \end{align*}
步骤解释:
第一步到第二步:D_{m,m} = \sum_{n=1}w_{m,n},即把Degree 矩阵还原成邻接矩阵来表达
第二步到第三步:对于w矩阵而言,里面的元素非0即1;二次展开
进一步, 把h_{j,i} 代入上式:
\begin{align*} h_j^T L h_j &=\frac{1}{2}\sum_{m=1}\sum_{n=1}(h_{j,m}-h_{j,n})^2 \\ &=\frac{1}{2}(\sum_{m \in A_j,n \in \bar A_j}w_{m,n}(\frac{1}{\sqrt{|A_j|}} - 0)^2 + \sum_{m \in \bar A_j,n \in A_j}w_{m,n}( 0 - \frac{1}{\sqrt{|A_j|}})^2) \\ &=\frac{1}{2}(\sum_{m \in A_j,n \in \bar A_j}w_{m,n} \frac{1}{|A_j|} + \sum_{m \in \bar A_j,n \in A_j}w_{m,n} \frac{1}{|A_j|}) \\ &= \frac{1}{2} (cut(A_j,\bar A_j) \frac{1}{|A_j|}+ cut(\bar A_j,A_j)\frac{1}{|A_j|})\\ &= \frac{cut(A_j,\bar A_j)}{|A_j|} \\ &= RatioCut(A_j,\bar A_j) \end{align*}
推到这里,很显然h_{j,i}的奇怪的值是为了得到这个结果而凑出来的。(摊手)
进一步,因为在引入指示变量的时候,每一个元素都只能放在一个类里面,所以可以得到这个性质:h_i \ast h_j = 0, i \neq j , 且 h_i \ast h_i = 1,即指示向量之间正交,于是:
\begin{align*} RatioCut(A_1,A_2...A_k) &= \sum_{i=1}^kh_i^T L h_i\\ &=\sum_{i=1}^k(H^TLH)_{ii} \\ &= Tr(H^TLH) \end{align*}
这里随后一步解释一下,Tr ()表示求矩阵的Trace的和,H^TLH 是一个k*k 的矩阵。一个矩阵的Trace等于这个矩阵特征值的总和。[5]
另外一个需要解释的点在于:
Lh_j = \lambda h_j 这里h_j, \lambda可以理解为L的一组特征值特征向量,在等式两个都左乘一个h_j^{'} 即 h_j的转置:
h_j^{'} L h_j = \lambda h_j^{'} h_j \\ (Here : h_j^{'} h_j = 1 ) \\ h_j^{'} L h_j = \lambda
所以我们可以用特征值求和,也就是Trace,来代表RatioCut(A_1,A_2...A_k)
所以现在的问题从 arg\min_{H}Ratiocut(A_1,A_2...A_k) 变为 arg\min_{H}Tr(H^TLH) , s.t. H^TH = I
在之前的推导过程中我们人为设定了一组特征向量, 即指示向量h_j,其中的元素要么是0,要么是\frac{1}{\sqrt{|A_j|}},如果我们用同样的方式去求H,那为了得到最优解,需要遍历(C_k^1)^N 种情况。
于是我们想不通过特征向量,直接求特征值。
既然我们要分成k类,那我们就对L求前k个特征值,这里说的前后指的是把特征值按大小排序,取前k小的。然后求和以后就是最有的RatioCut解,然后我们根据这个特征值再去得到特征向量。根据特征向量来决定聚类。
但是这时候对应的特征向量, 比如h_j里面的元素就不是离散的值了,而是连续的值。
解决这个问题的一个方式是,我们得到了h_1,h_2...h_k 之后用对于h_j 里面的元素,看它距离0或者\frac{1}{\sqrt{|A_j|}}哪个近,就改成哪个值。在变换完之后,我们相当于得到了k个中心,然后把N个点和k个中心 进行一次K-means。
类似的对于N-Cut的推导在[3]里面可以看到。
ref:
[1] https://blog.csdn.net/v_JULY_v/article/details/40738211h_{j,i}=\begin{cases} \frac{1}{\sqrt{|A_j|}} & \text{ if } v_i \in A_j\\ 0 & \text{ if } v_i \notin A_j \end{cases}
每一个子集A_j对应一个指示向量h_j,每个h_j里面有N个元素分别代表N个样本点的指示结果。如果在原始数据中第i个样本被分割到了子集A_j中,那么h_j的第i个元素值为\frac{1}{\sqrt{|A_j|}},否则为0.
这里h_j是一个长度为N的向量
\begin{align*} h_j^TLh_j &=h_j^T(D-W)h_j \\ &=h_j^TDh_j - h_j^TWh_j \\ &= \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}D_{m,n} -\sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} \\ &=\sum_{m=1}h_{j,m}^2D_{m,m} - \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} \\ &= \frac{1}{2}(\sum_{m=1}h_{j,m}^2D_{m,m} - 2 \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}h_{j,n}^2D_{n,n}) \end{align*}
步骤解释:
第一第二步:拉普拉斯变换
第三步:把矩阵的乘法变成element-wise乘法
第四步:由于D是对角阵,非主对角线元素为0。
第五步:代数变换
然后:
\begin{align*} h_j^TLh_j &= \frac{1}{2}(\sum_{m=1}h_{j,m}^2D_{m,m} - 2 \sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}h_{j,n}^2D_{n,n}) \\ &=\frac{1}{2}(\sum_{m=1}\sum_{n=1}h_{j,m}^2w_{m,n} - 2\sum_{m=1}\sum_{n=1}h_{j,m}h_{j,n}w_{m,n} + \sum_{n=1}\sum_{m=1}h_{j,n}^2w_{n,m})\\ &=\frac{1}{2}\sum_{m=1}\sum_{n=1}(h_{j,m}-h_{j,n})^2 \end{align*}
步骤解释:
第一步到第二步:D_{m,m} = \sum_{n=1}w_{m,n},即把Degree 矩阵还原成邻接矩阵来表达
第二步到第三步:对于w矩阵而言,里面的元素非0即1;二次展开
进一步, 把h_{j,i} 代入上式:
\begin{align*} h_j^T L h_j &=\frac{1}{2}\sum_{m=1}\sum_{n=1}(h_{j,m}-h_{j,n})^2 \\ &=\frac{1}{2}(\sum_{m \in A_j,n \in \bar A_j}w_{m,n}(\frac{1}{\sqrt{|A_j|}} - 0)^2 + \sum_{m \in \bar A_j,n \in A_j}w_{m,n}( 0 - \frac{1}{\sqrt{|A_j|}})^2) \\ &=\frac{1}{2}(\sum_{m \in A_j,n \in \bar A_j}w_{m,n} \frac{1}{|A_j|} + \sum_{m \in \bar A_j,n \in A_j}w_{m,n} \frac{1}{|A_j|}) \\ &= \frac{1}{2} (cut(A_j,\bar A_j) \frac{1}{|A_j|}+ cut(\bar A_j,A_j)\frac{1}{|A_j|})\\ &= \frac{cut(A_j,\bar A_j)}{|A_j|} \\ &= RatioCut(A_j,\bar A_j) \end{align*}
推到这里,很显然h_{j,i}的奇怪的值是为了得到这个结果而凑出来的。(摊手)
进一步,因为在引入指示变量的时候,每一个元素都只能放在一个类里面,所以可以得到这个性质:h_i \ast h_j = 0, i \neq j , 且 h_i \ast h_i = 1,即指示向量之间正交,于是:
\begin{align*} RatioCut(A_1,A_2...A_k) &= \sum_{i=1}^kh_i^T L h_i\\ &=\sum_{i=1}^k(H^TLH)_{ii} \\ &= Tr(H^TLH) \end{align*}
这里随后一步解释一下,Tr ()表示求矩阵的Trace的和,H^TLH 是一个k*k 的矩阵。一个矩阵的Trace等于这个矩阵特征值的总和。[5]
另外一个需要解释的点在于:
Lh_j = \lambda h_j 这里h_j, \lambda可以理解为L的一组特征值特征向量,在等式两个都左乘一个h_j^{'} 即 h_j的转置:
h_j^{'} L h_j = \lambda h_j^{'} h_j \\ (Here : h_j^{'} h_j = 1 ) \\ h_j^{'} L h_j = \lambda
所以我们可以用特征值求和,也就是Trace,来代表RatioCut(A_1,A_2...A_k)
所以现在的问题从 arg\min_{H}Ratiocut(A_1,A_2...A_k) 变为 arg\min_{H}Tr(H^TLH) , s.t. H^TH = I
在之前的推导过程中我们人为设定了一组特征向量, 即指示向量h_j,其中的元素要么是0,要么是\frac{1}{\sqrt{|A_j|}},如果我们用同样的方式去求H,那为了得到最优解,需要遍历(C_k^1)^N 种情况。
于是我们想不通过特征向量,直接求特征值。
既然我们要分成k类,那我们就对L求前k个特征值,这里说的前后指的是把特征值按大小排序,取前k小的。然后求和以后就是最有的RatioCut解,然后我们根据这个特征值再去得到特征向量。根据特征向量来决定聚类。
但是这时候对应的特征向量, 比如h_j里面的元素就不是离散的值了,而是连续的值。
解决这个问题的一个方式是,我们得到了h_1,h_2...h_k 之后用对于h_j 里面的元素,看它距离0或者\frac{1}{\sqrt{|A_j|}}哪个近,就改成哪个值。在变换完之后,我们相当于得到了k个中心,然后把N个点和k个中心 进行一次K-means。
类似的对于N-Cut的推导在[3]里面可以看到。
ref:
[2] https://arxiv.org/pdf/0711.0189.pdf
[3] https://blog.csdn.net/yc_1993/article/details/52997074
[4] https://www.cnblogs.com/xingshansi/p/6702174.html
[5] https://zh.wikipedia.org/wiki/%E8%B7%A1
Comments
Post a Comment