Louvain
Introduce
Louvain算法是社區發現領域中經典的基於模塊度最優化的方法,且是目前市場上最常用的社區發現算法。社區發現旨在發現圖結構中存在的類簇(而非傳統的向量空間)。
Algorithm Theory
-
模塊度(modularity)
要想理解Louvain算法需先理解模塊度,模塊度是衡量一個網絡社區划分好壞的度量指標,可以簡單理解為“給定算法得到的圖中的社區划分D,社區內節點的連邊權重和與對應隨機圖中的連邊權重和的差,可以理解為社區內邊權重之於社區間邊權重的比例,當然,社區內邊權重越大,則模塊度越大,社區中節點聯系更加緊密,社區划分質量越好。”模塊度的公式如下所示:

以下均無向無權圖為例,m為圖中的邊數,2m為圖的總度數,A為鄰接矩陣,當兩個節點直接相連時Aij=1,否則Aij=0,ki為節點i的度,δ(ci,cj)為指示函數,當節點i、j位於同一個社區,其為1,否則為0。
公式中比較難理解的是中括號中的第二項,啥意思呢? 之前提到隨機圖,這邊公式中的第二項指的是隨機圖中度為ki和度為kj的兩個節點相連的概率。得到的社區划分與隨機圖(無規律,且無明顯社區結構)相差越大,則社區內連接越緊密,社區間連接越稀疏(即社區邊界更明顯),發現的社區質量越好。
好了,模塊度就理解到這兒,簡單總結一下,模塊度范圍在[-0.5,1),一般模塊度越高,發現的社區質量越好。(原始模塊度論文表示當模塊度值在0.3~0.7之間時,社區質量好)
-
Louvain Flow Chart:
現在進入正題,Louvain算法的總體框架(流程圖)如下圖所示:

Louvain是一個迭代更新算法(初始每個節點自成一個社區),每個迭代稱為一個pass,每個pass都包括兩個步驟。即Louvain算法等價於不斷迭代以下兩個步驟(階段):
(1)步驟1:首先,為每個節點分配一個單獨的社區。其次對於每個節點i,考慮其鄰居j,計算將節點i歸入節點j所在社區模塊度的增益。考慮節點i的所有鄰居,並且將節點i歸入到模塊度增益的社區最大。如果節點i歸到他鄰居所在社區都沒有模塊度增益(即模塊度增益為0或者負數)的話,那節點i仍然留在他原始的社區中。這個過程反復做,直到改變任何節點的社區標簽都沒有更進一步的模塊度增益就停止,停止之后第一階段就結束了。以上最重要的就是要搞懂模塊度增益這玩意怎么算呢? 模塊度增益可以通過以下公式計算。

啥意思呢?我們可以化簡一下得到如下式子:
\Delta Q =[\frac{k_{i,in}}{2m}-\frac{\sum_{tot}k_i}{2m^2}]括號中第一項的意思可以理解為節點i加入鄰居所在社區之后對應社區內的連邊數。括號中第二項的意思可以理解為結點加入鄰居社區后,對應社區間以及社區內的連邊數。最大化該模塊度增益,就是最大化這個差,這個差大了,就說明節點i加入到這個鄰居社區之后,使得該社區的內聚度更高了,社區結構越明顯了。emmm,模塊度增益最大化大概就是這么個意思了。
(2)步驟2:算法的第二階段做的事情是,結合步驟1得到的初始社區划分建立一個新的網絡,新網絡的節點是在第一階段發現的初始社區(把社區粗化成一個粗化節點),兩個粗化節點之間的邊由兩個社區原始對應的社區間邊的權重和(無向圖即兩個社區間相連的邊數),同一社區節點之間的連邊權重生成這個社區粗化節點的一個自環邊。一旦完成了第二階段,就將構成的新的網絡輸入第一階段再進行迭代(因為粗化(層次的概念),每次網絡中的初始社區數會變小,因此后面迭代的速度會更快)。
至此,Louvain算法介紹結束。
Reference
- Blondel V D, Guillaume J L, Lambiotte R, et al. Fast unfolding of communities in large networks[J]. Journal of statistical mechanics: theory and experiment, 2008, 2008(10): P10008.
- 社區發現算法——louvain完全解讀
- 模塊度與Louvain社區發現算法
