上节课讲到了如何进行社区发现或者检测算法,而这节课会继续这个话题,同时也会和第三课里面的Motif的概念有联系。本节课主要关注的是和谱相关的聚类算法。
课程里说的“频谱”,按Jure的说法,就是发现相邻矩阵的特征值和特征向量,基于此来对图的结构进行学习。具体的3个步骤就先不说了,先把问题定义出来。
图分片(Graph Partitioning)
给定一个图 G ( V , E ) G(V,E) G(V,E),把节点分解成2个不相连的组 A , B A, B A,B。
为了解决这个问题,我们需要先定义2个问题:
这个分片的标准其实和聚类算法标准的思想很类似,即: 最大化片内连接量,最小化片间连接量。具体的数学衡量的指标就是"cut",即“边剪切”。
边剪切:两个端点分别处于两个分片的边的集合,如果是带权重的边,则是权重的集合。
c u t ( A , B ) = ∑ i ∈ A , j ∈ B W i j cut(A, B)=\displaystyle \sum_{i\in A, j\in B} W_{ij} cut(A,B)=i∈A,j∈B∑Wij,如果是不带权重的边,则 W i j W_{ij} Wij就只是 ( 0 , 1 ) (0,1) (0,1)。
虽然上面的标准好像很明确,但是这里面会有一个问题,即如果我就随便找一个边缘的节点,然后cut掉它,那么cut的值就只有1,但是这显然不是一个好的解决方案,如下图所示。
之所以仅仅最小化cut不好,是因为这个值只是最小化了片间的连接,但是并没有考虑最大化片内连接量。修改后的优化标准是:Conductance, ϕ ( A , B ) \phi(A, B) ϕ(A,B)。
ϕ ( A , B ) = c u t ( A , B ) m i n ( v o l ( A ) , v o l ( B ) ) \phi(A,B)=\dfrac{cut(A,B)}{min(vol(A),vol(B))} ϕ(A,B)=min(vol(A),vol(B))cut(A,B),其中, v o l ( A ) vol(A) vol(A)是分片 A A A里面,所有的点的加权的度的和,可以理解为这个片的密度。 v o l ( A ) = ∑ i ∈ A k i vol(A)=\sum_{i\in A} k_i vol(A)=∑i∈Aki, k i k_i ki是点 i i i的加权度。
用Conductance可以比较好地平衡片内和片间的关系,解决上图里面的极端有问题的情况,让分区更加得平衡。但是计算Conductance是一个NP-hard的问题,因此如何才能高效地发现好的分区?频谱分区算法可以近似这个Conductance的标准,完成分区。
频谱分区使用到了矩阵的特征值和特征向量。这里就用无向图的邻接矩阵的特征值和特征向量来进行频谱分区。下面先给出相应的公式定义:
邻接矩阵 A ∈ R n × n A \in R^{n × n} A∈Rn×n,其中 A i j = 1 A_{ij}=1 Aij=1如果节点 i i i和 j j j之间有边连接。
向量 x ∈ R n x \in \mathfrak{R}^{n} x∈Rn,形式是 ( x 1 , x 2 , … , x n ) (x_1, x_2, \dots, x_n) (x1,x2,…,xn)。可以把 x x x看成是节点的标签或者特征。
那么 A × x A × x A×x代表什么意思?
[ a 11 … a 1 n ⋅ … ⋅ a n 1 … a n n ] × [ x 1 ⋅ x n ] = [ y 1 ⋅ y n ] \begin{bmatrix} a_{11} & \dots & a_{1n} \\ \cdot & \dots & \cdot \\ a_{n1} & \dots & a_{nn} \end{bmatrix} ×\begin{bmatrix} x_1 \\ \cdot \\ x_n\end{bmatrix} = \begin{bmatrix} y_1 \\ \cdot \\ y_n\end{bmatrix} ⎣⎡a11⋅an1………a1n⋅ann⎦⎤×⎣⎡x1⋅xn⎦⎤=⎣⎡y1⋅yn⎦⎤
其中, y i = ∑ j = 1 n A i j x i = ∑ ( i , j ) ∈ E x j y_i = \displaystyle \sum_{j=1}^n A_{ij}x_i = \sum_{(i,j)\in E} x_j yi=j=1∑nAijxi=(i,j)∈E∑xj。通过 y i y_i yi的计算公式可以看出,它就是节点 i i i的邻居的标签或者特征的和。
上面的矩阵乘法如果换成 A × x = λ × x A \times x = \lambda \times x A×x=λ×x,就形成了矩阵 A A A的特征值 λ \lambda λ和特征向量 x x x的标准表达式。其含义是,找到一个特殊的向量 x x x,用它和邻接矩阵相乘,即让每个节点都把它的邻居节点的 x x x值求和,就相当于自身的 x x x值乘以 λ \lambda λ,进行缩放。那这样的 x x x和 λ \lambda λ也就是邻接矩阵 A A A的一组特征向量和特征值。
图上的频谱理论是对图的邻接矩阵进行分析的理论。在继续之前需要对频谱进行定义:
图的频谱:图的邻接矩阵的特征向量 x i , i ∈ ( 0 , n ) x^{i}, i \in (0,n) xi,i∈(0,n),且其对应的特征值 λ i \lambda_i λi按照升序排列: Λ = { λ 1 , λ 2 , … , λ n } \Lambda =\{\lambda_1, \lambda_2, \dots, \lambda_n\} Λ={ λ1,λ2,…,λn},且 λ 1 ⩽ λ 2 ⩽ … , ⩽ λ n \lambda_1 \leqslant \lambda_2 \leqslant \dots, \leqslant \lambda_n λ1⩽λ2⩽…,⩽λn
课程里面讲这个部分并不是很清楚。需要学生有一定的线性代数的基础。这里要能明白对于无向图,它的邻接矩阵是一个对称阵,因此可以进行特征分解。
为了更好地理解图的频谱所对应的特征向量和特征值,课程里介绍了几个例子。主要就是均匀度的图。
均匀度的图
设一个图里所有的点的度都一样为 d d d,且图是连通的,则这个图被叫做 d d d规则化的图。那么对于这样的图,它的一个特征向量和特征值是什么?
由于所有节点的度相同,所以一个很简单的设想就是: x = ( 1 , 1 , … , 1 ) x= (1, 1, \dots , 1) x=(1,1,…,1)。这时候,按照上面的特征值的定义,可得到: λ = d \lambda = d λ=d。同时, d d d也是最大的一个特征值。
关于 d d d是最大的特征值的证明,没怎么看懂。卡在,如果 x = ( 2 , 2 , … , 2 ) x= (2, 2, \dots , 2) x=(2,2,…,2),那么 λ = 2 d \lambda = 2d λ=2d,这时候不就是大于 d d d了? 后面看到特征向量需要相互正交的特点,明白了用一个常数乘全一向量获得的向量就不再是特征向量了。但是下面的特征向量又违反了这个要求,为啥啊?!
例一里面,我们假设图是连通的。那么如果图不是连通的,会怎么样?课程里给的例子是图 G G G里面有两个不相连的分片。每个分片都具有相同的点的度 d d d。那么对应于2个分片的节点,可以使用两个向量:
X ′ = ( 1 , … , 1 , 0 … , 0 ) T X'= (1, \dots, 1, 0 \dots, 0)^T X′=(1,…,1,0…,0)T 和 X ′ ′ = ( 0 , … , 0 , 1 … , 1 ) T X''= (0, \dots, 0, 1 \dots, 1)^T X′′=(0,…,0,1…,1)T
这两个特征向量的特征值都是 λ = d \lambda=d λ=d。
这个地方Jure七七八八讲了一堆的和拉普拉斯矩阵相关的特征向量和特征值的内容,看的云山雾罩。但是在跳过后就会发现,其实都是为了讲一个结论:
根据第二点结论,由于特征向量的维度就和图里面的点的数量是一样的,所以就可以根据每个点对应的特征向量的值的正负性,从而对节点进行分区。同时,不仅仅是第二小的特征向量,第三小,第四小,…后面的特征向量的值都可以帮助划分节点的分区。
这里有一个证明部分,说明这种方法获得的第二小的特征值 λ 2 \lambda_2 λ2比最优的Conductance( β \beta β)的2倍要小,即 λ 2 ≤ 2 β \lambda_2 \le 2\beta λ2≤2β。从而说明这是一个近似最优解。
这个部分的讲解占了整个第五课的接近1/4的时间,我是没怎么看懂,只记下了结论。有能力的同学自己去啃吧。
到这里为止,我们已经有了:(1)- 衡量图分区好坏的标准;(2)- 实现高效发现近似最优的方法。下面就是具体如何采用这个方法来做对图的频谱分区。
三个基本步骤:
这里面的第一和第二步没有什么问题,但是第三步怎么做确是可以有不同的方法的。课程给了一些之前的算法,基本思想就是:把多个特征值聚合成一个值,赋给节点。然后,再排序。排完序后,找到合适的分割点,把图分片。
那么一个拍脑门的分割点就是0或者均值。还有更复杂的方法,比如,找到1维空间里的最优的分割点。
课程里给出了前3小的特征值对应的特征向量的值的例子,如下图所示:
从图中可以看出,最小的特征值没有任何的区分能力,因为值都一样。而第二和第三小,甚至其他的特征向量值都具有一定的区分分片的能力。同时,也可以对图进行多分片的分割,比如分割成K片。
对于 k k k分割,一种方法是递归二分,形成层级化分割。但是这个方法的效率低下,且分片的结果不稳定。
更常用和课程推荐的方法是Shi-Malik在2000年发的论文,提出的多特征向量聚类法:即,使用多个最小特征向量(比如 m m m个),这样每个节点的特征就变成 m m m维。然后计算节点间相似度,再用K-means完成聚类。
这个算法的好处是能更好的发现数据的多种分布,放大了簇内的相似性,同时稀释了簇间的相似。多个特征向量更好地避免了采用部分特征向量所造成的信息损失,从而使得分片的结果更稳定。由于使用了K-means,那么不可避免的一个问题就是如何选择 k k k。这里的肘拐点是通过计算特征值的差( Δ k = λ k − λ k − 1 \Delta_k = \lambda_k - \lambda_{k-1} Δk=λk−λk−1)来选择的。一般是选择最大的 Δ k \Delta_k Δk的那个 1 ~ k 1~k 1~k个特征向量。这里是有数学证明的,不用太担心。
上面就是基于特征值和特征向量的图频谱分片算法。这种方法对于规模不大的图还好,可以对于大图,进行矩阵的特征分解是个相当费时的任务,所以还是慎重选择吧。
除了基于特征分解的方法,还有一种基于前面课程所介绍的Motif的频谱分片的算法。
基于Motif的分片算法的基本思路和纯频谱分片一致。都是需要一个好的分片的标准,一个近似找到最优化标准的算法,然后如何更具优化结果进行划分。
对于频谱分片算法,其中的分片的标准是基于边(边的权重)的特征,然后计算Conductance。而基于Motif的分片就是拿特定的一个(一些)Motif作为特征,再计算它们的Conductance。如下图所示:
这里面需要注意的是,计算volumn的时候,是统计的节点的数量,而cut对应的是Motif的个数,所以才有视频里面的例子 Φ M ( S ) = 1 10 _{\varPhi M}(S)=\cfrac{1}{10} ΦM(S)=101。因为10个点都和给出的Motif相关,而cut只涉及到一个Motif。
由于原理是一样的,所以最小化基于Motif的Conductance也是一个NP-Hard的问题,因此也就可以借鉴上的特征分解的方法来找到近似最优解。具体算法如下:
课程里没有给证明,但是可以得到使用这个方法得到的Conductance是一个近似最优解。即,
Φ M ( S ) ≤ 4 Φ M ∗ _{\Phi M}(S) \le 4\sqrt{\Phi^*_M} ΦM(S)≤4ΦM∗
其中,左边是使用特征分解方法得到的Conductance,而右边根号里面的则是最优的基于Motif的Conductance。
课程最后给了两个是用Motif算法进行图分片的例子。一个是不知道感兴趣的Motif的例子,用多个Motif分别进行分片的佛罗里达海湾水生动物链;一个是知道感兴趣的Motif的例子,如基因交换关系、酶交互网、药物效果关系等。这里就不再更多的记录了。
我感兴趣的是最后一页里面介绍的其他的分片算法,或者叫社区发现算法。因为第一个METIS算法是我们目前使用的对大图进行分片的算法,在实际效果上很不错。第三个是曾经使用过的发现欺诈团伙的方法,但是当时在图规模到百万条边后,单机就已经不行了。这些算法如图:
第五课就记录到这里,花了很多的时间在理解特征分解那个地方。但是发现这个学习方法不好,应该快速先过2遍,再去看一些难懂的地方,可能会节省更多的时间。先到这里吧。