louvain算法
社區(qū)發(fā)現(xiàn)算法簡介
社區(qū)發(fā)現(xiàn)的算法多種思路,比較常見的有兩種:一種是分離的思路,就是找出社區(qū)之間的邊,把這些邊從圖中移除;另一種是聚合思路,將聯(lián)系緊密的節(jié)點聚合為一個社區(qū),并通過優(yōu)化某個相關(guān)變量的函數(shù)來實現(xiàn)聚合。 前人已在兩個思路上有了大量的研究,而根據(jù)這兩類算法的結(jié)果看,聚合的思路比分離思路好,且算法的效率也比較高。因此,聚合算法吸引了很多學(xué)者做了大量相關(guān)研究,逐步形成了現(xiàn)在的社區(qū)發(fā)現(xiàn)算法。比如密歇根大學(xué)的M.E.J.Newman和康奈爾大學(xué)的M.Girvan,他們在2003年提出了一個基于模塊屬性的測量方法。他們在算法中引入了一個變量【模塊度】,用于衡量社區(qū)劃分結(jié)果的合理性。其原理是用某種劃分結(jié)果的模塊內(nèi)聚性與隨機劃分結(jié)果的內(nèi)聚性的差異,對劃分結(jié)果進行評估,找到模塊內(nèi)聚性最優(yōu)的劃分。雖然尋找最優(yōu)隨機劃分往往非常困難,但這個思路給大家指引了優(yōu)化方向。模塊度的思路對后來的社區(qū)發(fā)現(xiàn)算法有很重要的影響,很多有影響的算法都是基于該特性進行算法設(shè)計的。 2008年,以比利時魯汶大學(xué)的Vincent D.Blondel為主的幾位學(xué)者,提出了基于模塊度的一個快速算法:Louvain算法。該算法可以快速處理具有數(shù)以億計節(jié)點的網(wǎng)絡(luò),用模塊度度對社區(qū)劃分的質(zhì)量進行評估
2.模塊度
上述公式簡化:
模塊度增益
上式可以理解為: 括號內(nèi)第一項ki,in表示實際節(jié)點i(或社區(qū)A)與要移入社區(qū)B之間的連接邊的權(quán)重之和, tot ki/m 則為隨機情況下節(jié)點i(或社區(qū)A)在總的加權(quán)度為 tot ki的情況下與當(dāng)前graph上任意 的節(jié)點或社區(qū)連接的邊的權(quán)重的期望. 第一項若比第二項大則說明節(jié)點i(或社區(qū)A)與該社 區(qū)B的連接程度是具有顯著的意義的, 那么便加入到該社區(qū), 反之則不加入。 模塊度是評估一個社區(qū)網(wǎng)絡(luò)劃分好壞的度量方法,可以看出,它是一種相對性的指標(biāo)。
LOUVAIN算法的兩個階段
初始化
將社團中每個節(jié)點都看做一個單獨的社區(qū)。
階段1:節(jié)點合并
遍歷所有節(jié)點,計算當(dāng)前節(jié)點脫離當(dāng)前社區(qū),且加入到鄰居節(jié)點所在社區(qū)時,帶來的模塊度增益,把當(dāng)前節(jié)點移動到增益最大的鄰居節(jié)點社區(qū)中。
每次計算節(jié)點 i 從社團 D 移動到社團 C 中時,根據(jù)模塊度計算公式可知,此時產(chǎn)生的模塊度變化只與當(dāng)前C、D社區(qū)相關(guān),不與其他社區(qū)相關(guān),因此計算成本較低,將節(jié)點 i 從社區(qū) D 轉(zhuǎn)移到 C 中帶來的模塊度增益為:
ΔQ=ΔQ(D→i)+ΔQ(i→C)
直至節(jié)點移動不再產(chǎn)生增益,階段1停止
**階段2:**社區(qū)聚合
將同一個社區(qū)的多個節(jié)點,融合為一個新的節(jié)點,社區(qū)內(nèi)節(jié)點之前的權(quán)重后續(xù)不再使用,當(dāng)前社區(qū)與其他社區(qū)之間的權(quán)重為兩個社區(qū)所有節(jié)點的權(quán)重和,從而構(gòu)建出新的圖結(jié)構(gòu)。回到階段1不斷迭代,直至圖結(jié)構(gòu)不再產(chǎn)生改變。
實例
這是初始的graph,A到F一共6個節(jié)點:
初始階段,節(jié)點之間的合并,以節(jié)點A為例:
A→B:
Q_AB=5?10?7/30=2.667
A→C:
Q_AC=4?10?13/30=?0.333
A→E:
Q_AE=1?10?9/30=?2
同理:
B → C:
Q_BC=?1.033
C → D:
Q_CD=2.667
D → F:
Q_DF=?0.667
E → F:
Q_EF=4.7
小于0則不進行社區(qū)劃分,大于0則取最大的模塊度增益對應(yīng)節(jié)點進行合并,合并之后我們得到:
Orange → Green:
Q_{Or,Gr}=6?7?9/10=?0.3
Orange → Yellow:
Q_{Or, Ye}=1?7?4/10=?1.8
Green → Yellow:
Q_{Gr, Ye}=3?9?4/10=?0.6
根據(jù)上面的計算可以知道模塊度增益
都是小于0的,迭代停止,
此時即為最終的社區(qū)劃分的結(jié)果;
總結(jié)
louvain是針對于無向圖的,模塊度的定義是針對于無向圖的,但是實際上對于有向圖而言也可以直接適配,主要原因在于模塊度的優(yōu)化是一個相對的過程,改變部分常量的比例不會影響相對優(yōu)化的過程
louvain的缺點以及解決方案
從公式和上述的例子可以看出為什么louvain可能出現(xiàn)分離群合并的傾向,舉一個極端的例子,假設(shè)某個小群X和某個大群Y之間只有一條權(quán)重為1的邊連接,小群除了這一條邊之外就沒有和任何其它的節(jié)點或者社群連接了,此時上式括號里的第二項的計算結(jié)果會非常小,
以上圖為例,社區(qū)16和社區(qū)14之間的權(quán)重為1,社區(qū)16和其它社區(qū)連接的邊的權(quán)重之和為 4,則4/(1+3+1+1+4)小于1(注意louvain是迭代計算的,每一次迭代,圖的結(jié)構(gòu)都會發(fā)生變化,公式中的參數(shù)的取值都會發(fā)生變化),二者合并。但其實我們并不希望他們合并,直觀上二者已經(jīng)是獨立的社群了不需要進一步合并。
解決這個問題的方法有3種:
1、過濾掉權(quán)重比較弱的邊,直接將弱邊的權(quán)重置為0,即去掉這些邊;
2、修改模塊度增益的公式,設(shè)置一個最小閾值,即模塊度增益必須大于某個閾值才會發(fā)生合并;
3、使用分層louvain,即假設(shè)louvain迭代了十次,則我們可以取第8次的迭代結(jié)果,可以通過可視化每次迭代的modulairty來實現(xiàn),當(dāng)modularity收斂不再發(fā)生變化時,取那一次對應(yīng)的迭代結(jié)果
總結(jié)
- 上一篇: tar只解压tar包中某个文件
- 下一篇: 富士通台式电脑_电脑bios怎么进入-电