圖計算:社區發現算法


  社區划分問題大多基於這樣一個假設:同一社區內部的節點連接較為緊密,社區之間的節點連接較為稀疏。因此,社區發現本質上就是網絡中結構緊密的節點的聚類。

  從這個角度來說,這跟聚類算法一樣,社區划分問題主要有兩種思路:

           (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的算法步驟:

  1. 初始化,將每個點划分在不同的社區中;
  2. 對每個節點,將每個點嘗試划分到與其鄰接的點所在的社區中,計算此時的模塊度,判斷划分前后的模塊度的差值ΔQ是否為正數,若為正數,則接受本次的划分,若不為正數,則放棄本次的划分;
  3. 重復以上的過程,直到不能再增大模塊度為止;
  4. 構造新圖,新圖中的每個點代表的是步驟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  (介紹了各種社區聚類的算法)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM