圖計算:社區發現算法

  社區劃分問題大多基於這樣一個假設:同一社區內部的節點鏈接較爲緊密,社區之間的節點鏈接較爲稀疏。所以,社區發現本質上就是網絡中結構緊密的節點的聚類。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的算法步驟:

  1. 初始化,將每一個點劃分在不一樣的社區中;
  2. 對每一個節點,將每一個點嘗試劃分到與其鄰接的點所在的社區中,計算此時的模塊度,判斷劃分先後的模塊度的差值ΔQ是否爲正數,若爲正數,則接受本次的劃分,若不爲正數,則放棄本次的劃分;
  3. 重複以上的過程,直到不能再增大模塊度爲止;
  4. 構造新圖,新圖中的每一個點表明的是步驟3中劃出來的每一個社區,繼續執行步驟2和步驟3,直到社區的結構再也不改變爲止。

 

五、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  (介紹了各類社區聚類的算法)

相關文章
相關標籤/搜索