Louvain 算法原理

      Louvain算法是一種基於圖數據的社區發現算法,算法的優化目標爲最大化整個數據的模塊度,模塊度的計算以下:算法

      其中m爲圖中邊的總數量,k_i表示全部指向節點i的連邊權重之和,k_j同理。A_{i,j} 表示節點i,j之間的連邊權重。有一點要搞清楚,模塊度的概念不是Louvain算法發明的,而Louvain算法只是一種優化關係圖模塊度目標的一種實現而已。sql

Louvain算法的兩步迭代設計:
最開始,每一個原始節點都當作一個獨立的社區,社區內的連邊權重爲0.
       算法掃描數據中的全部節點,針對每一個節點遍歷該節點的全部鄰居節點,衡量把該節點加入其鄰居節點所在的社區所帶來的模塊度的收益。並選擇對應最大收益的鄰居節點,加入其所在的社區。這一過程化重複進行指導每個節點的社區歸屬都不在發生變化。
       對步驟1中造成的社區進行摺疊,把每一個社區摺疊成一個單點,分別計算這些新生成的「社區點」之間的連邊權重,以及社區內的全部點之間的連邊權重之和。用於下一輪的步驟1。
該算法的最大優點就是速度很快,步驟1的每次迭代的時間複雜度爲O(N),N爲輸入數據中的邊的數量。步驟2 的時間複雜度爲O(M + N), M爲本輪迭代中點的個數。
迭代過程:優化

1, 假設咱們最開始有5個點,互相之間存在必定的關係(至於什麼關係,先無論),以下:spa

 

2. 假設在進過了步驟1的充分迭代以後發現節點2,應該加入到節點1所在的社區(最開始每一個點都是一個社區,而本身就是這個社區的表明),新的社區由節點1表明,以下:.net

此時節點3,4,5之間以及與節點1,2之間沒有任何歸屬關係。設計

3. 此時應該執行步驟2,將節點1,2組合成的新社區進行摺疊,摺疊以後的社區當作一個單點,用節點1來表明,以下:blog

此時數據中共有4個節點(或者說4個社區),其中一個社區包含了兩個節點,而社區3,4,5都只包含一個節點,即他們本身。get

4. 從新執行步驟1,對社區1,3,4,5進行掃描,假設在充分迭代以後節點5,4,3分別前後都加入了節點1所在的社區,以下:社區

 

5. 進行步驟2,對新生成的社區進行摺疊,新摺疊而成的社區當作一個單點,由節點1表明,結構以下:遍歷

 

      此時因爲整個數據中只剩下1個社區,即由節點1表明的社區。再進行步驟1時不會有任何一個節點的社區歸屬發生變化,此時也就不須要再執行步驟2,至此, 迭代結束。

轉自: https://blog.csdn.net/xsqlx/article/details/79078867

相關文章
相關標籤/搜索