社區發現 louvain(fast unfolding)算法

整個算法是基於Modularity的計算,然後就是迭代,社區改變,然後收縮,繼續迭代,社區改變,然後收縮,如此以往。
這裏貼上算法的流程:

算法形式化描述
1)初始化:
將圖中的每個節點看成一個獨立的社區,社區的數目與節點個數相同;

2)開始first phase迭代 - 社區間節點轉移:
對每個節點i,依次嘗試把節點 i 分配到其每個鄰居節點所在的社區,計算分配前與分配後的模塊度變化ΔQ

3)重複2)- 繼續進行社區間節點轉移評估:
直到所有節點的所屬社區不再變化,即社區間的節點轉移結束,可以理解爲本輪迭代的 Local Maximization 已達到;

4)second phase - Rebuilding Graph:
因爲在這輪的first phase中,社區 C 中新增了一個新的節點 i,而 i 所在的舊的社區少了一個節點,因此需要對整個圖進行一個rebuild。

對圖進行重構,將所有在同一個社區的節點重構成一個新社區,社區內節點之間的邊的權重更新爲新節點的環的權重,社區間的邊權重更新爲新節點間的邊權重;

5)重複2)- 繼續開始下一輪的first/second phase:
直到整個圖的模塊度不再發生變化。
(https://www.cnblogs.com/LittleHann/p/9078909.html)

然後其實關於louvain算法,基本理解用自己的話來重複一遍。
每次找一個節點,算它分配到鄰居的社區的ΔQ,將其改爲選最大的的那個社區,這樣找一輪下來,(不過不知道這裏是同步還是異步的,應該是同步的,及時改變及時用),一輪找下來,每個節點所屬的社區肯定有所變化,再來一輪,再來一輪,直到現在的Q不會再改變,即每個節點的所屬社區不再變化,則進入第二階段。
第二個階段是將之前形成的社區縮成一個節點,比如原本網絡中有200個節點(初始是每個節點一個社區),經過了第一個階段,形成了45個社區,那麼第二階段就會將整個網絡轉化成45個節點的網絡(依然是每個節點一個社區),社區內的邊權變成該節點的自環。從而轉換完成。
下面繼續進行第一階段,直到不變。
然後再第二階段,直到不變。

至於louvain算法能夠檢測層次性社區,是因爲比如對於社區1,它在第一階段之後,它有20個節點,然後在第二階段縮成一個節點,依然代表社區1。然後繼續第一階段。然後發現此時有社區1有3個節點。那麼社區1就有層次性了,其中一開始20個是第一層,而後來新增的兩個節點包含的多個節點就是第二層了。如是便是層次性的體現。

在算法執行過程中,很明顯的就是一開始較爲複雜,因爲涉及到的節點多,每次都要計算與改變到鄰接節點的ΔQ,計算量比較大。
而一旦涉及到第二階段,再執行第一階段,所有的節點和邊的數目就變小了,所以計算量會變小。
總體來看,越往後,計算量越來越小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章