轉自本人: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^*}\)