日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

louvain算法

發(fā)布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 louvain算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

社區(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é)

以上是生活随笔為你收集整理的louvain算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。