網絡,數學上稱為圖,最早研究始於1736年歐拉的哥尼斯堡七橋問題,但是之后關於圖的研究發展緩慢,直到1936年,才有了第一本關於圖論研究的著作。20世紀60年代,兩位匈牙利數學家Erdos和Renyi建立了隨機圖理論,被公認為是在數學上開創了復雜網絡理論的系統性研究。之后的40年里,人們一直講隨機圖理論作為復雜網絡研究的基本理論。然而,絕大多數的實際網絡並不是完全隨機的。1998年,Watts及其導師Strogatz在Nature上的文章《Collective Dynamics of Small-world Networks》揭示了復雜網絡的小世界性質。隨后,1999年,Barabasi及其博士生Albert在Science上的文章《Emergence of Scaling in Random Networks》又揭示了復雜網絡的無標度性質(度分布為冪律分布),從此開啟了復雜網絡研究的新紀元。
隨着研究的深入,越來越多關於復雜網絡的性質被發掘出來,其中很重要的一項研究是2002年Girvan和Newman在PNAS上的一篇文章《Community structure in social and biological networks》,指出復雜網絡中普遍存在着聚類特性,每一個類稱之為一個社團(community),並提出了一個發現這些社團的算法。從此,熱門對復雜網絡中的社團發現問題進行了大量研究,產生了大量的算法,本文試圖簡單整理一下復雜網絡中聚類算法,希望對希望快速了解這一部分的人有所幫助。本文中所謂的社團跟通常我們將的聚類算法中類(cluster)的概念是一致的。
0. 預備知識
為了本文的完整性,我們首先給出一些基本概念。
一個圖通常表示為G=(V,E),其中V表示點集合,E表示邊集合,通常我們用n表示圖的節點數,m表示邊數。一個圖中,與一個點的相關聯的邊的數量稱為該點的度。對於一個圖,圖中所有點的度的和恰好等於邊數的兩倍。圖通常用鄰接矩陣A表示,鄰接矩陣的(i,j)位置元素是1表示點i到點j右邊,0表示無邊。
本文中我們會用到隨機圖的概念,所謂隨機圖,就是指一個圖中任何兩個點之間連邊的概率相等。首先確定n個點,然后以固定概率p去給圖中的一對頂點連邊,就形成了一個隨機圖。在研究中,隨機圖通常用來作為一個null model來與實際網絡進行比較,從而得出一些性質結論。
研究社團的划分,一個需要解決的問題是,如何來衡量一個社團的划分的好壞?一個比較簡單直觀的原則是使得社區內部的邊盡可能地多,社區之間的邊間可能地少。另外一個稍微復雜點但是更為常用的度量是Newman等人提出的模塊度(modularity)的概念,基本的想法是這樣的:我們假設在隨機圖中是不存在這種社團結構的,將實際網絡跟其相應的隨機網絡進行比較,如果一個網絡跟隨機網絡之間的差異越大,表示社團結構越明顯。這樣,我們對划分后的每一個子網絡計算一個“密度”,然后計算該子網絡隨機情況下的“密度”,這兩個“密度”存在一個差值,表示了該子網絡偏離隨機情況的一種程度,並且這個值越大表示這個子網絡相對隨機網絡越稠密。一個網絡中包含的所有子網絡的這個差值加到一起的和就是這個復雜網絡的模塊度,數學公式表示如下:
其中Aij表示圖的鄰接矩陣,ki 表示點i 的度,m是圖的邊數,ki*kj/2m表示點 i 和點 j之間邊的期望。進一步將模塊度可以化為等式右邊的形式,nc是社團的總個數,lc是社團c內的邊數,dc是社團內的點的度數之和 (note: 社團內的每一個點可能跟本社團內部的點有邊,也可能有跟其他社團點連邊,故通常 dc> lc)
有了這些知識,我們來看一下復雜網絡社團划分的各種算法吧。
1. 圖的剖分
把一個網絡划分成多個社團就是把一個圖剖分成多個圖,圖的剖分問題是圖論中一個比較難的問題,也是研究比較多的問題,理論上是NP-hard的。因此,人們通常研究比較簡單的情況:圖的二剖分,即把一個圖分成兩個(一般要求大小相等)的圖,比較有名的算法是Kernighan-Lin 算法和譜平分法。
1.1 Kernighan-Lin 算法[1]
思想:不斷交換兩個子圖中的點,使得兩個子圖之間的邊盡可能地少
定義增益函數: Q=兩個社團內的邊數-社團之間的邊數
算法步驟:
Step1 隨機划分為已知大小的兩個社團
Step2 從兩個社團各取一個點,嘗試交換並計算ΔQ = Q交換后-Q交換前,選擇使ΔQ最大的一對節點對交換
Step3 規定每個節點只能交換一次,對剩余節點重復step2, 直到 ΔQ <0,或者某個子圖的所有節點都被交換了一次為止。
Step4 允許每個節點的第二次交換,開始新一輪迭代,直到沒有節點對可以交換
1.2 譜平分法
所謂“譜”,就是矩陣的特征值;所謂“平分”,就是將一個圖分成大小相等的兩個子圖。譜平分法就是利用圖的拉普拉斯矩陣的第二小特征向量來進行聚類的一種方法。 這里暫且先放一下,下面介紹完譜算法之后再回頭具體介紹譜平分法。
1.3 總結
圖的剖分常常需要制定子圖的個數(否則,整體作為一個),甚至每個子圖的大小(否則,常常會將一個點分為一個子圖)。但是如果已知一個圖就是兩個社團組成,譜評分法往往可以得到很好的效果。
2. 凝聚法
這是一大類算法,總體思想是尋找社團“最中心”的邊,不斷地把最相似的兩個點聚到一起,從點聚到小社團,再聚成大社團。根據定義兩個點的相似性的不同,產生了很多不同的算法。有的算法並不直接計算相似性,而是看兩個點合並到一起后模塊度的變化情況,根據變化的大小來選擇需要合並的兩個點。比較有代表性的算法是Newman在2004年的一個算法[2]
2.1 Newman算法
思想:不斷地選擇是模塊度增長最大的兩個社團進行合並
算法步驟:
Step1. 每個點當作一個社團
Step2. 計算兩個社團合並后模塊度的變化(增長) ΔQ,選取使得ΔQ最大的兩個社團進行合並
Step3. 重復step2直到最后合並為一個社團
2.2 Newman算法的優化
Newman算法復雜性是O((m+n)n),Clause,Newman和Moore利用最大堆將該算法復雜度降低為O(n(logn)^2)[3]
對於該算法, 人們想出了很多改進措施,例如以下兩個策略:
1. multistep貪婪算法:每次迭代合並多個社團
2. 歸一化ΔQ,消除社團大小的影響
2.3 總結
凝聚法優點是簡單,限制少,不需要預先指定社團個數,可以發現社團的層次關系。缺點是缺乏全局目標函數; 兩個點一旦合並,就永遠在一個社團中了,無法撤消;另外,這種算法往往對單個的點比較敏感
3. 分裂法
分裂法的基本思想是找出最有可能位於社團之間的邊,把這些邊去掉,就自然產生了不同的社團。代表性的算法是Girvan 和Newman在2002年的一個算法 [4].
3.1 GN 算法[4]
首先給出介數(etweenness)的定義,一個邊的介數(edge betweenness)是指通過該邊的最短路的條數。
直觀上,社團之間的邊有較高的betweenness,而社團內部的邊betweenness相對較小,這樣,通過逐個去掉這些高betweenness的邊,社團結構就會逐步顯現出來。
算法步驟:
Step1. 計算每條邊的介數 (O(nm) with BFS)
Step2. 去掉具有最高介數的邊
Step3. 如果滿足了社團划分的要求, stop; 否則, 轉step1.
利用各種其他度量(如邊聚類系數等)來代替邊介數,該算法也產生了各種各樣的變種。
3.2 其他分裂方法
分裂法還有很多,如MST,JP算法等等,在此就不一一描述了。
3.3 總結
凝聚法跟分裂法是對應的,一個自下而上,一個自上而下,一個不斷把點連在一起,一個不斷去邊把點分開。分裂法的優缺點跟凝聚法類似。
4. 譜算法
首先給出一個概念——圖的Laplacian 矩陣(L-矩陣)。設A為圖的鄰接矩陣; D為一個對角陣(對角元素為點 i 的度),則圖的Laplacian矩陣L=D-A。關於L-矩陣,有很多性質,如:(1) 矩陣的每一行的元素之和為0 ,由此可以知道該矩陣至少一個0特征值,並且0特征值對應的特征向量為全1向量(1,1,...,1)。(2)0 特征向量的個數與連通分支的個數相同;如果一個圖是連通的,那么其Laplacian矩陣只有一個0特征值,其余特征值都是正的。(3)不同特征值的特征向量正交的。
所謂譜,就是指矩陣的特征值。譜算法就是利用鄰接矩陣或者拉普拉斯矩陣的特征向量,將點投影到一個新的空間,在新的空間用傳統的聚類方法(如k-means)來聚類。
譜算法的一般步驟是:
Step1. 計算相似矩陣(如鄰接矩陣A)的前 s 個特征向量
Step2. 令 U 是一個 n× s 矩陣,每一列是一個特征向量
Step3. U 的第 i 行作為點 i 的坐標,用層次聚類法或者k-means等得到最終的社團
需要說明一點是: 如果是計算鄰接矩陣的特征值,一般取最大的s個特征值;如果是計算Laplacian矩陣的特征值,則是計算最小的(除0外)s個特征值。
前面我們提到過譜平分法,就是利用Laplacian矩陣倒數第二個小的特征值對應的特征向量(稱為Fiedler 向量)來聚類的。因為需要把一個圖平分成兩個子圖,因此就把Fiedler向量中正的分量對應的點分成一類,負的分量對應的點分成另一類。
譜算法的計算瓶頸是計算矩陣的特征值,因為少數的幾個特征向量就可以得到很好的聚類,所以只需要計算最大的幾個特征值既可以,可以考慮用Lanczos method。
5. 矩陣分解
譜算法的實質是矩陣分解,其他的矩陣分解方法還有SVD 和 NMF 等,矩陣分解的整體思想就是把點從一個空間映射到另一個空間,在新的空間利用傳統的聚類方法來聚類。
6. 標簽傳播算法
標簽傳播(Label propagation)算法是由Zhu X J於2002年提出[5],它是一種基於圖的半監督學習方法,其基本思路是用已標記節點的標簽信息去預測未標記節點的標簽信息。2007年,Raghavan U N等最早提出將LPA最早應用於社區發現,該算法被簡稱為RAK算法[6]
思想: 每個節點賦予一個標簽標志着其所在社區,每次迭代,每個節點標簽根據其大多數鄰近節點的標簽而修改,收斂后具有相同標簽的節點屬於同一個社區。
算法步驟:
Step1 給每一個節點隨機生成一個標簽
Step2 隨機生成一個所有節點的順序,按照該順序將每一個節點的標簽修改為其大多數鄰居節點的標簽。
Step3 重復step2,直到每個節點的標簽都不再變化,具有相同標簽的節點組成了一個社區。
7. 隨機游走
隨機游走: 從一個頂點向下一個頂點移動時,以相等的概率來選擇當前頂點的一個鄰居作為下一個頂點。
基本思想: 社團時相對比較稠密的子圖,因此在圖中進行隨機游走時很容易“陷入”一個社團中。
隨機游走的過程構成了一個Markov鏈。圖中每一個頂點對應一種狀態;不同狀態之間的轉移概率為
t 步隨機游走從 i 到 j 的概率是 Pij 的t次冪
下面我們介紹一個代表性的隨機游走算法,叫做Walktrap 算法[7]
Walktrap 算法
定義如下距離:
頂點 i 和 j 的距離:
社團C到點j的距離:
社團C1到C2的距離:
算法步驟:
Step1 每一個點當做一個社區,計算相鄰的點(社團)之間的距離
Step2 選取使得下式最小的兩個社團C1和C2 合並為一個社團,
重復這一步驟直到所有點合並為一個社團。
標簽傳播算法盡管速度快,但是效果並不太理想。
8. Louvain (BGLL) 算法
Louvain (BGLL) 算法[8]是一個基於模塊度最優化的啟發式算法,算法兩層迭代,外層的迭代是自下而上的凝聚法,內層的迭代是凝聚法加上交換策略,避免了單純凝聚方法的一個很大的缺點(兩個節點一旦合並,就沒法再分開)。
算法步驟:
Step1 每一個點初始時被看作一個社團, 按一定次序依次遍歷每一個頂點. 對每一個頂點i ,考慮將 i 移至其鄰居頂點 j 的社團中模塊度的變化ΔQ 。如果 ΔQ>0,將 頂點i 移至使得ΔQ變化最大的頂點的社團中; 否則,頂點 i 保持不動。重復這個過程,直到任何頂點的移動都不能使模塊度增大。
Step2 將step1得到的每一個社團看作一個新的頂點,開始新的一輪迭代,直到模塊度不再變化。
該算法簡單、直觀,容易實現;速度快,並且效果也很好。綜合效率和效果兩方面考慮,該算法應該是目前最好的方法之一。
9.Canopy算法 + K-Means
9.1 Canopy算法
思想:選擇計算代價較低的方法計算相似性,將相似的對象放在一個子集中,這個子集被叫做Canopy,不同Canopy之間可以是重疊的
算法步驟:
Step1 設點集為 S,預設兩個距離閾值 T1和 T2(T1>T2);
Step2 從S中任選一個點P,用低成本方法快速計算點P與所有Canopy之間的距離,將點P加入到距離在T1以內的Canopy中;如果不存在這樣的Canopy,則把點P作為一個新的Canopy的中心,並與點P距離在 T2 以內的點去掉;
Step3 重復step2, 直到 S 為空為止。
該算法精度低,但是速度快,常常作為“粗”聚類,得到一個k值,再用k-means進一步聚類,不屬於同一Canopy 的對象之間不進行相似性計算。
9.2 K-Means
K-Means大家都比較熟悉,基本思想是首先找各個社團的“中心點”, 然后就近分配每個頂點
算法步驟:選取k個點作為 k個社團的初始中心點
Step1. 把每個點分配到最近的中心點所在的社團;
Step2. 重新計算中心點,如果中心點不變, stop; 否則, 轉 step1.
K-Means算法計算量相對比較大,效果往往還不錯,但是使用前要考慮一點:通過各個分量求平均得到的中心點是否有意義, 也就是說在你的問題中歐式距離是否有意義。
10. 基於密度的快速聚類
今年science上有一篇關於聚類的文章[9],提出一種快速的聚類方法,基本思想是: 找出每個類的中心點,將剩余的點按一定策略分配到每個類中。思想很簡單,但是文中找每個類中心點的做法還是很有新意的。
算法步驟
Step1 對每一個點i,計算兩個量:點i的密度 和點 i 到比其密度更高的其他所有點的最小距離
Step2 選取 都較大的點作為每一社團的中心點(背后的思想是:類的中心應該密度比較大,不同類的中心相互之間應該離的比較遠)
Step3 對於剩余的非中心點,分配給離它最近且密度比它高的鄰點所坐在的社團
參考文獻
[1].Kernighan & Lin ,An efficient heuristic procedure for partitioning graphs. Bell System Technical Journal 49: 291–307,1970.
[2] Newman. Fast Algorithm for Detecting Community Structure in Networks. Phy.Rev.E, 2004.
[3] Clauset et al. Finding community structure in very large networks, Phy.Rev.E, 2004.
[4] Girvan& Newman,Community structure in social and biological networks, PNAS, 2002
[5] Zhu et al . Learning From Labeled and Unlabeled Data With Label Propagation, Technical Report, CMU-CALD-02-107,2002
[6] Raghavan et al. Near linear time algorithm to detect community structures in large-scale networks, Phy.Rev.E., 2007.
[7] P. Pons et al. Computing communities in large networks using random walks. Journal of Graph Algorithms and Applications,2006.
[8] Vincent D. Blondel et al, Fast Unfolding of Communities in Large Networks, Phy.Rev.E, 2008
[9] Rodriguez & Laio, Clustering by fast search and find of density peaks. Science.2014