社区发现算法——Louvain 算法
Louvain 算法
原始論文為:《Fast unfolding of communities in large networks》。
所以又被稱為Fast unfolding算法。
Louvain算法是一種基于模塊度的社區發現算法。其基本思想是網絡中節點嘗試遍歷所有鄰居的社區標簽,并選擇最大化模塊度增量的社區標簽。在最大化模塊度之后,每個社區看成一個新的節點,重復直到模塊度不再增大。
首先復習下模塊度:
這里引入了權重方便擴展到有權圖,但其實對于無權圖,可以看做所有邊權重為1,這時候就等于用節點的度計算,用度理解一樣。
算法詳述:
模塊度優化階段:每個節點將自己作為自己社區標簽。每個節點遍歷自己的所有鄰居節點,嘗試將自己的社區標簽更新成鄰居節點的社區標簽,選擇模塊度增量最大(貪婪思想)的社區標簽,直到所有節點都不能通過改變社區標簽來增加模塊度。
也就是說,首先將每個節點指定到唯一的一個社區,然后按順序將節點在這些社區間進行移動。怎么移動呢?假設有一節點 i ,它有三個鄰居節點 j1, j2, j3,我們分別嘗試將節點 i 移動到 j1, j2, j3 所在的社區,并計算相應的 modularity 變化值ΔQ,哪個變化值最大就將節點 i 移動到相應的社區中去(當然,這里我們要求最大的 modularity 變化值要為正,如果變化值均為負,則節點 i 保持不動)。按照這個方法反復迭代,直到網絡中任何節點的移動都不能再改善總的 modularity 值為止。
移動到一個社區C中所獲得的模塊化Q增益可以很容易地計算出來:
=12m(ki,in?Σtotkim)\frac{1}{2m}(k_{i,in}-{Σ_{tot}ki\over m})2m1?(ki,in??mΣtot?ki?)
其中ΣinΣ_{in}Σin?是在社區C內的鏈路的權重總和(權重為1時就等于度數),如果是初始情況,即一個節點作為一個社區時,它就為這個節點自己到自己的連接,這時候仍然需要起點加weight,終點加weight(即使這個時候起點和終點為同一節點,對于無環圖權為0)
ΣtotΣ_{tot}Σtot?是關聯到C中的節點的鏈路上的權重的總和
ki是關聯到節點i的鏈路的權重的總和
ki,in是從節點i連接到C中的節點的鏈路的總和
m是網絡中的所有鏈路的權重的總和
網絡凝聚階段:每個社區合并為一個新的超級節點,超級節點的邊權重為原始社區內所有節點的邊權重之和,形成一個新的網絡。
將第一個階段得到的社區視為新的“節點”(一個社區對應一個),重新構造子圖,兩個新“節點”之間邊的權值為相應兩個社區之間各邊的權值的總和。如這個圖所示,如果第一個階段得到的社區有以下三個,那么第二個階段的任務就是將這三個社分別看一個新的節點,然后將任意兩個新節點之間的所有連線的權重相加得到的和,作為這兩個新節點之間的連線的權重。
上述兩個階段迭代進行,直到模塊度不再增大。
??下圖很好的描述了這兩個階段。第一次迭代,經過模塊度優化階段,總的 modularity 值不再改變,算法將16個節點劃分成4個社區;在網絡凝聚階段,4個社區被凝聚成4個超級節點,并重新更新了邊權重。之后就進入第二次迭代中。
算法通過引入分步迭代的思想(類比EM算法),避免陷入貪婪思想導致的局部最優。
算法流程:
1、初始時將每個頂點當作一個社區,社區個數與頂點個數相同。
2、依次將每個頂點與之相鄰頂點合并在一起,計算它們最大的模塊度增益是否大于0,如果大于0,就將該結點放入模塊度增量最大的相鄰結點所在社區。
3、迭代第二步,直至算法穩定,即所有頂點所屬社區不再變化。
4、將各個社區所有節點壓縮成為一個結點,社區內點的權重轉化為新結點環的權重,社區間權重轉化為新結點邊的權重。
5、重復步驟1-3,直至算法穩定。
可以看到Louvain 算法與FN算法非常相似,我覺得最大的不同時Louvain 算法在凝聚階段是將整個社區看做一個新的超節點來看,而FN算法是以社區的觀點來凝聚。
算法優缺點
優點
1、時間復雜度低,適合大規模的網絡。
??2、社區劃分結果穩定,有具體指標能夠評估社區劃分好壞。
??3、消除了模塊化分辨率的限制。由于模塊度是全局指標,最大化的時候很難發現小型的社區,很容易將小型社區合并。而算法第一次迭代是以單個節點作為社區的粒度,規避了這種問題。
??4、天然自帶層次化的社區劃分結果,每一次迭代的社區劃分結果都可以保留下來,作為社區劃分的中間結果,可供選擇。
缺點
1、社區過大,不能及時收斂。如果我們將模塊度類比為損失函數的話,Fast Unfolding在模塊度優化階段采用的貪婪思想很容易將整個社區劃分“過擬合”。因為Fast Unfolding是針對點遍歷,很容易將一些外圍的點加入到原本緊湊的社區中,導致一些錯誤的合并。這種劃分有時候在局部視角是優的,但是全局視角下會變成劣的。
??
??Python代碼如下:代碼與數據下載
參考結果如下:
社區 1 [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 16, 17, 19, 21]
社區 2 [32, 33, 8, 14, 15, 18, 20, 22, 26, 29, 30]
社區 3 [23, 24, 25, 27, 28, 31]
0.388560157790927
算法執行時間0.002000093460083008
總結
以上是生活随笔為你收集整理的社区发现算法——Louvain 算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSV出力ボタンラッパー(asp.net
- 下一篇: POJ 3608 Bridge Acro