转自本人:https://blog.csdn.net/New2World/article/details/105372317算法
前面的课程说到了 community detection 并介绍了两种算法。此次来讲说另一类作社区聚类的算法,谱聚类。这种算法通常分为三个步骤网络
在介绍具体操做前咱们先了解几个概念app
图的划分就是将节点分到不一样的组内,若是分为两个组就是二分。划分的目的其实就是找社区,那如何判断一个划分的质量呢?回顾以前说到的社区的特色,即社区内部链接丰富而社区间链接稀疏。所以咱们但愿咱们的划分能最大化每一个划份内的链接并最小化划分间的链接数。咱们用割这个概念来描述不一样划分间的链接数 \(cut(A,B)=\sum\limits_{i\in A,j\in B}w_{ij}\)。对于无权图这里的 \(w\) 就是 \(\{0,1\}\)。但这个定义并不完美,由于这样并不能保证划分均匀。例如,一个图中有一个节点的度为 \(1\) 那么只要把这个节点和其他节点分开就能保证 cut 为 \(1\)。所以咱们将划分后不一样组内节点的度归入考虑就能较为全面的评估一个划分的好坏了,即 Conductance,其中 \(vol\) 是划份内全部节点的度之和。ide
然而直接最小化 conductance 是个 NP-hard 的问题。那接下来就进入今天的正题:谱聚类。ui
首先复习一下线性代数,给定一个图的邻接矩阵 \(A\),那 \(i\) 行表示节点 \(i\) 的全部出度,\(j\) 列表示节点 \(j\) 的全部入度。在无向图上出度入度同样,所以 \(A^T=A\),。考虑无向图,那 \(Ax\) 表明什么?\(Ax\) 的输出是一个向量,而向量的每个元素是矩阵的行和向量 \(x\) 的内积。若是将 \(x\) 看做图中每一个节点的分类标签,那获得的结果向量的每一个元素表明了每一个节点全部邻接节点的标签之和。
而特征值的定义是 \(Ax=\lambda x\),而谱聚类就是研究根据特征值 \(\lambda\) 升序排序后的特征向量。(这里规定 \(\Lambda=\{\lambda_1,\lambda_2,...,\lambda_n\}\) 且 \(\lambda_1\leq\lambda_2 \leq...\leq\lambda_n\))spa
如今给出一个特殊的连通图 \(G\),图中全部节点的度都为 \(d\)。而后令 \(x=(1,1,...,1)\) 那么 \(Ax=(d,d,...,d)=\lambda x\),所以 \(\lambda=d\)。能够证实 \(d\) 是最大的特征值。.net
证实:
由于咱们但愿特征值为 \(d\),那对向量 \(x\) 必须有 \(x_i=x_j\)。也就是说 \(x=c\cdot(1,1,...,1)\)
那么对于任意不知足 \(c\cdot(1,1,...,1)\) 的向量 \(y\),说明并不是全部节点都为 \(1\)。令不为 \(1\) 的节点集为 \(S\),显然并不是全部节点都在 \(S\) 中。
这样一来一定存在节点 \(j\),其邻接节点不属于 \(S\)。这样一来在节点 \(j\) 这里获得的内积值一定严格小于 \(d\)
所以 \(y\) 不是特征向量,且 \(d\) 是最大的特征值blog
以上是针对连通图。若是图不连通而是有两个部分,且每部分都是 \(d\)-regular 的。咱们作相似处理,不过对 \(x\) 的定义会适当改变。排序
这样一来对应的特征值仍然是 \(\lambda=d\),但这个最大特征值对应了两个特征向量。递归
为何不继续用 \(x=(1,1,...,1)^T\)?
你试试 \(Ax=\lambda x\) 对得上不?
以下图稍微推广一下,第一种不连通状况下,最大和第二大的特征值相等。第二种状况属于存在明显社区结构,此时图实际上是连通的,但最大和第二大的特征值差异不大。而 \(\lambda_{n-1}\) 能告诉咱们两个社区的划分状况。
那为何说 \(\lambda_{n-1}\) 能告诉咱们划分状况?首先咱们知道特征向量是互相垂直的,即两个特征向量的内积为 \(0\)。所以在已知 \(x_n=(1,1,...,1)^T\) 的状况下,\(x_nx_{n-1}=0\) 说明 \(\sum_ix_{n-1}[i]=0\)。所以,在 \(x_{n=1}\) 内一定有正有负。那咱们就能够依此将图中的节点分为两组了。(这是大体思路,还有不少细节须要考虑)
那考虑无向图,咱们定义如下几个矩阵
这里有个定理:对任意对称矩阵 \(M\) 有
\(w_1\) 是最小特征值对应的特征向量。分析一下这个表达式
由于度矩阵 \(D\) 是对角矩阵,因此上面才会化简为 \(D_{ii}\)。 由于这里的求和是针对每条边,而每条边有两个端点,所以第三步是 \(x_i^2+x_j^2\)。化简了定理里的表达式能看出什么?\(\lambda_2\) 是特征向量里各元素的差的平方(距离)的最小值。这与咱们找最小割目的不谋而合,即最小化各部分间的链接数。
这样获得的 \(x\) 叫 Fiedler vector。然而直接用离散的标签 \(\{-1,1\}\) 太硬核了,咱们考虑容许 \(x\) 为知足约束的实数。即 \(\sum_ix_i=0, \sum_ix_i^2=1\)
其实这里偷换了概念。表达式里应该将 \(x\) 替换为 \(y\)。由于分析的时候咱们将 \(y\) 视为划分后的标签,而特征值 \(x_2\) 只是这个标签 \(y\) 的最优解而已。
这里提到了 approx. guarantee,若是将网络划分为 \(A\) 和 \(B\),那能够保证 \(\lambda_2\) 和 conductance \(\beta\) 存在关系 \(\lambda_2\leq2\beta\) (证实略,本身看 slide 吧)
根据这种方法获得的结果仍是不错的。若是网络中包含了不止一个划分,咱们能够递归地使用上述算法,即先划分为两部分,而后对两部分分别再用使用一次或屡次谱聚类。除此以外还可使用 \(x_3,x_4,...\) 等特征向量一块儿进行聚类,这样一来至关于将每一个点表示为 \(k\) 维的向量进行聚类。通常来讲多用几个特征向量能避免信息丢失,获得更好的聚类结果。那这个 \(k\) 怎么选呢?看 \(\Delta_k=|\lambda_k-\lambda_{k-1}|\)。选令 eigengap 最大的 \(k\) 就好。(注意!!这里的特征值又是按降序排列的了)[1]
上面的谱聚类是基于边实现的,若是咱们想针对某种特定的结构进行划分呢?天然而然的想到以前介绍的 motif。基于 motif 也就是说在一个划份内特定的 motif 广泛出现。相似对边的划分,咱们定义 \(vol_M(S)\) 为在划分 \(S\) 里的 motif 的端点个数,\(\phi(S)=\frac{\#(motifs\ cut)}{vol_M(S)}\)。固然这也是 NP-hard 的。
走流程,首先咱们须要定义矩阵 \(W^{(M)}\)。这里矩阵内每一个元素表明了对应边被几个 motif 共享。而后是度矩阵 \(D^{(M)}=\sum_jW_{ij}^{(M)}\) 和拉普拉斯矩阵 \(L^{(M)}=D^{(M)}-W^{(M)}\)。求特征值和特征向量后取第二小的特征值对应的特征向量 \(x_2\)。按升序对 \(x_2\) 各元素大小排序,并依次经过计算 motif conductance 来找最佳的划分。(前 \(k\) 小的元素为 \(x_2^{(1)},x_2^{(2)},...,x_2^{(k)}\),而后计算 conductance。取令 conductance 最小的 \(k\) 值)[2]
固然这个算法也只是一个近似,它能保证 \(\phi_M(S)\leq4\sqrt{\phi_M^*}\)