社區划分問題大多基於這樣一個假設:同一社區內部的節點連接較為緊密,社區之間的節點連接較為稀疏。因此,社區發現本質上就是網絡中結構緊密的節點的聚類。
從這個角度來說,這跟聚類算法一樣,社區划分問題主要有兩種思路:
(1)凝聚方法(agglomerative method):添加邊
(2)分裂方法(divisive method):移除邊
另一方面,我們也可以認為同一個社區內的節點,之所以能夠聚集在一起,是因為它們有相似性。因此只要我們能夠將一個節點很好地表示,成為一個向量,那么同樣可以用相似性大法來尋找社區聚集,不過這點上需要向量對節點的描述足夠好和足夠完備。
GN算法據說是社區發現領域的第一個算法,或者說它開啟了這個領域的研究。下面我們來分別介紹這個領域及其算法是如何演化的。
1、GN算法
基本思想:
在一個網絡之中,通過社區內部的邊的最短路徑相對較少,而通過社區之間的邊的最短路徑的數目則相對較多。
邊介數(betweenness):
網絡中任意兩個節點通過此邊的最短路徑的數目。
算法過程:
(1)計算每一條邊的邊介數;
(2)刪除邊界數最大的邊;
(3)重新計算網絡中剩下的邊的邊階數;
(4)重復(3)和(4)步驟,直到網絡中的任一頂點作為一個社區為止。
GN算法是一個基於刪除邊的算法。這種算法類似於分裂一樣,把一個大的網絡,以邊介數為衡量,去不斷刪除邊,以實現網絡分裂。這種方法的缺點:(1)計算復雜度高,在每次刪除邊了之后都會重復計算剩余節點的邊介數;(2)算法的終止條件缺乏一個衡量的目標,不能控制最后可以分裂成多少個社區;
如上圖所示,GN算法相當於是一棵自頂向下的層次樹,划分社區就是層次分裂的過程。
解決的辦法:
引入模塊度Q,模塊度是用來衡量社區划分好壞的程度的概念。除此之外,我覺得基本上整個算法的思想都反過來了,不再是從頂層分裂,而是從底層合並聚類,直到最終形成一個大的網絡。每次是根據計算合並后使得模塊度Q的增量最大的社區進行合並,直到收斂。也就是說,是基於增加邊而不是刪除邊了。這種引入模塊度Q來度量社區划分質量的思想,有點像梯度下降算法,是通過迭代計算來獲得定義的目標函數的最優解的。
2、Label Propagation
標簽傳播算法也是一種自底向上的迭代算法。
初始的時候對每一個節點給一個類別,以后每次迭代,對於每個節點,將與它相連的鄰居里面數量最多的類別作為這個節點的新類別。直到整個網絡的節點類別都不再變化為止。
標簽傳播算法(label propagation)的思想基於:相似的數據應該具有相同的label。其具體實現包括兩大步驟:1)構造相似矩陣;2)勇敢的傳播吧。
有向圖的Label Propagation算法:
將有向圖轉換成無向圖,使得節點之間的關系帶權重。
具體是構造一個轉移概率矩陣P,以及一個節點的分類標簽矩陣F。然后計算 F=PF。
3、隨機游走算法
隨機游走算法的“隨機”是指:以相同的概率來從一個頂點移動到另一個頂點。或者說,以某一個定義好的概率作為轉移概率,以“移動”的概念,比喻節點的狀態的改變。網絡圖中的每一個節點代表一種狀態,不同狀態之間轉移的概率為:,其中A是鄰接/相似度矩陣,D是度矩陣,di是節點i的度。t 步隨機游走從 i 到 j 的概率是 Pij 的t次冪,表示為Ptij。
隨機游走中的一個經典算法,叫做WalkTrap算法。
定義一些距離:
(1)定點i和j的距離: (由轉移概率的定義得到)
(2)社團C到點j的距離:
(3)社團C1到C2的距離: (由(1)(2)式得到)
算法步驟:
Step1 每一個點當做一個社區,計算相鄰的點(社團)之間的距離
Step2 選取使得下式最小的兩個社團C1和C2 合並為一個社團,
重復這一步驟直到所有點合並為一個社團。
隨機游走算法盡管速度快,但是效果並不太理想(為什么?)。
4、FastUnfolding
不管是GN算法、LPA還是隨機游走,它們都有一個缺點,就是沒有一個明確的量化指標用來衡量算法對社區划分的好壞。也就是說,不知道運算到什么程度了就是最好的結果。比如GN算法,是自頂向下的分裂,那么分裂到什么程度了就可以停止了呢?再比如LPA,迭代多少次停止才最好呢,當圖中有一些異常的節點或者特殊的節點時,會不會導致標簽一直震盪,以至最后難以得到最優解?為了使得社區划分算法有一個可衡量的標准,提出了“模塊度”的概念。
FastUnfolding就是一種基於模塊度的,自底向上聚集的社區划分算法。
FastUnfolding的算法步驟:
- 初始化,將每個點划分在不同的社區中;
- 對每個節點,將每個點嘗試划分到與其鄰接的點所在的社區中,計算此時的模塊度,判斷划分前后的模塊度的差值ΔQ是否為正數,若為正數,則接受本次的划分,若不為正數,則放棄本次的划分;
- 重復以上的過程,直到不能再增大模塊度為止;
- 構造新圖,新圖中的每個點代表的是步驟3中划出來的每個社區,繼續執行步驟2和步驟3,直到社區的結構不再改變為止。
5、BGLL算法
是基於模塊度Q的兩次啟發式迭代算法。外層是凝聚法,內層是凝聚+節點置換,克服了簡單凝聚法中兩個節點一旦合並就無法分開的問題。
6、譜聚類
7、其他的各種聚類算法
參考:http://blog.csdn.net/aspirinvagrant/article/details/45599071 (GN算法)
http://blog.csdn.net/google19890102/article/details/48660239 (FastUnfolding算法)
http://blog.csdn.net/google19890102/article/details/51558148 (Label Propagation 算法)
http://www.cnblogs.com/tychyg/p/5277137.html (介紹了各種社區聚類的算法)