社區發現(Community Detection)算法

做者: peghoty node

出處: http://blog.csdn.net/peghoty/article/details/9286905 算法

 

 

  社區發現(Community Detection)算法用來發現網絡中的社區結構,也能夠看作是一種聚類算法。網絡

如下是個人一個 PPT 報告,分享給你們。框架

 

 

        從上述定義能夠看出:社區是一個比較含糊的概念,只給出了一個定性的刻畫。dom

另外須要注意的是,社區是一個子圖,包含頂點和邊。.net

 

 

 

 

        下面咱們以新浪微博用戶對應的網絡圖爲例,來介紹相應的社區發現算法。3d

 

 

        這裏在相互關注的用戶之間創建鏈接關係,主要是爲了簡化模型,此時對應的圖爲無向圖。blog

固然,咱們也能夠採用單向關注來建邊,此時將對應有向圖。get

 

 

 

        這個定義看起來很拗口,但經過層層推導,能夠獲得以下 (4.2)的數學表達式。定義中的隨機網絡也稱爲Null Model,其構造方法爲:數學

        the null model used has so far been a random graph with the same number of nodes, the same number of edges and the same degree distribution as in the original graph, but with links among nodes randomly placed.

 

 

       注意,(4.2) 是針對無向圖的,所以這裏的 m 表示無向邊的條數,即若節點 i 和節點 j 有邊相連,則節點 (i, j) 對 m 只貢獻一條邊。

 

 

 

        標籤傳播算法(LPA)的作法比較簡單:

第一步: 爲全部節點指定一個惟一的標籤;

第二步: 逐輪刷新全部節點的標籤,直到達到收斂要求爲止。對於每一輪刷新,節點標籤刷新的規則以下:

        對於某一個節點,考察其全部鄰居節點的標籤,並進行統計,將出現個數最多的那個標籤賦給當前節點。當個數最多的標籤不惟一時,隨機選一個。

 

注:算法中的記號 N_n^k 表示節點 n 的鄰居中標籤爲 k 的全部節點構成的集合。

 

 

 

 

       SLPA 中引入了 Listener 和 Speaker 兩個比較形象的概念,你能夠這麼來理解:在刷新節點標籤的過程當中,任意選取一個節點做爲 listener,則其全部鄰居節點就是它的 speaker 了,speaker 一般不止一個,一大羣 speaker 在七嘴八舌時,listener 到底該聽誰的呢?這時咱們就須要制定一個規則。

        在 LPA 中,咱們以出現次數最多的標籤來作決斷,其實這就是一種規則。只不過在 SLPA 框架裏,規則的選取比較多罷了(能夠由用戶指定)。

        固然,與 LPA 相比,SLPA 最大的特色在於:它會記錄每個節點在刷新迭代過程當中的歷史標籤序列(例如迭代 T 次,則每一個節點將保存一個長度爲 T 的序列,如上圖所示),當迭代中止後,對每個節點歷史標籤序列中各(互異)標籤出現的頻率作統計,按照某一給定的閥值過濾掉那些出現頻率小的標籤,剩下的即爲該節點的標籤(一般有多個)。

 

SLPA 後來被做者更名爲 GANXiS,且軟件包仍在不斷更新中......

 

 

        這裏對上面的圖作個簡單介紹:帶問號的節點是待肯定標籤的節點,黑色實心點爲其鄰居節點,它們的標籤是已知的,注意標籤均是由二元數對的序列構成的,序列中每個元素的第一個份量表示其標籤,第二個份量表示該節點屬於該標籤對應社區的可能性(或者說機率,叫作 belonging coefficent),所以對於每一個節點,其機率之和等於 1。

 

        咱們按照如下步驟來肯定帶問號節點的標籤:

 

1. 獲取鄰居節點中全部的互異(distinct) 標籤列表,並累加相應的 belonging coefficent 值。

2. 對 belonging coefficent 值列表作歸一化,即將列表中每一個標籤的 belonging coefficent 值除以 C1 (C1 爲列表中 belonging coefficent 值的最大值)。

3. 過濾。若列表中歸一化後的 belonging coefficent 值(已經介於 0,1 之間)小於某一閥值 p (事先指定的參數),則將對應的二元組從列表中刪除。

4. 再一次作歸一化。因爲過濾後,剩餘列表中的各 belonging coefficent 值之和不必定等於 1,所以,須要將每一個 belonging coefficent 值除以 C2 (C2 表示各 belonging coefficent 值之和)。

 

        通過上述四步,列表中的標籤即肯定爲帶問號節點的標籤。

 

 

 

        這裏,咱們對 Fast Unfolding 算法作一個簡要介紹,它分爲如下兩個階段:

 

第一個階段:首先將每一個節點指定到惟一的一個社區,而後按順序將節點在這些社區間進行移動。怎麼移動呢?以上圖中的節點 i 爲例,它有三個鄰居節點 j1, j2, j3,咱們分別嘗試將節點 i 移動到 j1, j2, j3 所在的社區,並計算相應的 modularity 變化值,哪一個變化值最大就將節點 i 移動到相應的社區中去(固然,這裏咱們要求最大的 modularity 變化值要爲正,若是變化值均爲負,則節點 i 保持不動)。按照這個方法反覆迭代,直到網絡中任何節點的移動都不能再改善總的 modularity 值爲止。

 

第二個階段:將第一個階段獲得的社區視爲新的「節點」(一個社區對應一個),從新構造子圖,兩個新「節點」之間邊的權值爲相應兩個社區之間各邊的權值的總和。

 

咱們將上述兩個階段合起來稱爲一個 pass,顯然,這個 pass  能夠繼續下去。

 

        從上述描述咱們能夠看出,這種算法包含了一種 hierarchy 結構,正如對一個學校的全部初中生進行聚合同樣,首先咱們能夠將他們按照班級來聚合,進一步還能夠在此基礎上按照年級來聚合,兩次聚合均可以看作是一個社區發現結果,就看你想要聚合到什麼層次與程度。

 

 

 

        DCLP 算法是 LPA 的一個變種,它引入了一個參數來限制每個標籤的傳播範圍,這樣可有效控制 Monster (很是大的 community,遠大於其餘 community)的產生。

 

 

        

 

        最後,咱們給出一些實驗結果。

        對比上述兩個表格可知:SDCLP 算法獲得的 top 5 社區更爲均勻。

 

相關文章
相關標籤/搜索