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社群發現演算法