社區劃分問題大多基於這樣一個假設:同一社區內部的節點鏈接較爲緊密,社區之間的節點鏈接較爲稀疏。所以,社區發現本質上就是網絡中結構緊密的節點的聚類。html
從這個角度來講,這跟聚類算法同樣,社區劃分問題主要有兩種思路:算法
(1)凝聚方法(agglomerative method):添加邊網絡
(2)分裂方法(divisive method):移除邊函數
另外一方面,咱們也能夠認爲同一個社區內的節點,之因此可以彙集在一塊兒,是由於它們有類似性。所以只要咱們可以將一個節點很好地表示,成爲一個向量,那麼一樣能夠用類似性大法來尋找社區彙集,不過這點上須要向量對節點的描述足夠好和足夠完備。google
GN算法聽說是社區發現領域的第一個算法,或者說它開啓了這個領域的研究。下面咱們來分別介紹這個領域及其算法是如何演化的。spa
一、GN算法.net
基本思想:vagrant
在一個網絡之中,經過社區內部的邊的最短路徑相對較少,而經過社區之間的邊的最短路徑的數目則相對較多。htm
邊介數(betweenness):blog
網絡中任意兩個節點經過此邊的最短路徑的數目。
算法過程:
(1)計算每一條邊的邊介數;
(2)刪除邊界數最大的邊;
(3)從新計算網絡中剩下的邊的邊階數;
(4)重複(3)和(4)步驟,直到網絡中的任一頂點做爲一個社區爲止。
GN算法是一個基於刪除邊的算法。這種算法相似於分裂同樣,把一個大的網絡,以邊介數爲衡量,去不斷刪除邊,以實現網絡分裂。這種方法的缺點:(1)計算複雜度高,在每次刪除邊了以後都會重複計算剩餘節點的邊介數;(2)算法的終止條件缺少一個衡量的目標,不能控制最後能夠分裂成多少個社區;
如上圖所示,GN算法至關因而一棵自頂向下的層次樹,劃分社區就是層次分裂的過程。
解決的辦法:
引入模塊度Q,模塊度是用來衡量社區劃分好壞的程度的概念。除此以外,我以爲基本上整個算法的思想都反過來了,再也不是從頂層分裂,而是從底層合併聚類,直到最終造成一個大的網絡。每次是根據計算合併後使得模塊度Q的增量最大的社區進行合併,直到收斂。也就是說,是基於增長邊而不是刪除邊了。這種引入模塊度Q來度量社區劃分質量的思想,有點像梯度降低算法,是經過迭代計算來得到定義的目標函數的最優解的。
二、Label Propagation
標籤傳播算法也是一種自底向上的迭代算法。
初始的時候對每個節點給一個類別,之後每次迭代,對於每一個節點,將與它相連的鄰居里面數量最多的類別做爲這個節點的新類別。直到整個網絡的節點類別都再也不變化爲止。
標籤傳播算法(label propagation)的思想基於:類似的數據應該具備相同的label。其具體實現包括兩大步驟:1)構造類似矩陣;2)勇敢的傳播吧。
有向圖的Label Propagation算法:
將有向圖轉換成無向圖,使得節點之間的關係帶權重。
具體是構造一個轉移機率矩陣P,以及一個節點的分類標籤矩陣F。而後計算 F=PF。
三、隨機遊走算法
隨機遊走算法的「隨機」是指:以相同的機率來從一個頂點移動到另外一個頂點。或者說,以某一個定義好的機率做爲轉移機率,以「移動」的概念,比喻節點的狀態的改變。網絡圖中的每個節點表明一種狀態,不一樣狀態之間轉移的機率爲:,其中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 合併爲一個社團,
重複這一步驟直到全部點合併爲一個社團。
隨機遊走算法儘管速度快,可是效果並不太理想(爲何?)。
四、FastUnfolding
不論是GN算法、LPA仍是隨機遊走,它們都有一個缺點,就是沒有一個明確的量化指標用來衡量算法對社區劃分的好壞。也就是說,不知道運算到什麼程度了就是最好的結果。好比GN算法,是自頂向下的分裂,那麼分裂到什麼程度了就能夠中止了呢?再好比LPA,迭代多少次中止才最好呢,當圖中有一些異常的節點或者特殊的節點時,會不會致使標籤一直震盪,以致最後難以獲得最優解?爲了使得社區劃分算法有一個可衡量的標準,提出了「模塊度」的概念。
FastUnfolding就是一種基於模塊度的,自底向上彙集的社區劃分算法。
FastUnfolding的算法步驟:
五、BGLL算法
是基於模塊度Q的兩次啓發式迭代算法。外層是凝聚法,內層是凝聚+節點置換,克服了簡單凝聚法中兩個節點一旦合併就沒法分開的問題。
六、譜聚類
七、其餘的各類聚類算法
參考: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 (介紹了各類社區聚類的算法)