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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

louvain算法

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

社區發現算法簡介

社區發現的算法多種思路,比較常見的有兩種:一種是分離的思路,就是找出社區之間的邊,把這些邊從圖中移除;另一種是聚合思路,將聯系緊密的節點聚合為一個社區,并通過優化某個相關變量的函數來實現聚合。 前人已在兩個思路上有了大量的研究,而根據這兩類算法的結果看,聚合的思路比分離思路好,且算法的效率也比較高。因此,聚合算法吸引了很多學者做了大量相關研究,逐步形成了現在的社區發現算法。比如密歇根大學的M.E.J.Newman和康奈爾大學的M.Girvan,他們在2003年提出了一個基于模塊屬性的測量方法。他們在算法中引入了一個變量【模塊度】,用于衡量社區劃分結果的合理性。其原理是用某種劃分結果的模塊內聚性與隨機劃分結果的內聚性的差異,對劃分結果進行評估,找到模塊內聚性最優的劃分。雖然尋找最優隨機劃分往往非常困難,但這個思路給大家指引了優化方向。模塊度的思路對后來的社區發現算法有很重要的影響,很多有影響的算法都是基于該特性進行算法設計的。 2008年,以比利時魯汶大學的Vincent D.Blondel為主的幾位學者,提出了基于模塊度的一個快速算法:Louvain算法。該算法可以快速處理具有數以億計節點的網絡,用模塊度度對社區劃分的質量進行評估

2.模塊度


上述公式簡化:

模塊度增益


上式可以理解為: 括號內第一項ki,in表示實際節點i(或社區A)與要移入社區B之間的連接邊的權重之和, tot ki/m 則為隨機情況下節點i(或社區A)在總的加權度為 tot ki的情況下與當前graph上任意 的節點或社區連接的邊的權重的期望. 第一項若比第二項大則說明節點i(或社區A)與該社 區B的連接程度是具有顯著的意義的, 那么便加入到該社區, 反之則不加入。 模塊度是評估一個社區網絡劃分好壞的度量方法,可以看出,它是一種相對性的指標。

LOUVAIN算法的兩個階段

初始化
將社團中每個節點都看做一個單獨的社區。
階段1:節點合并

遍歷所有節點,計算當前節點脫離當前社區,且加入到鄰居節點所在社區時,帶來的模塊度增益,把當前節點移動到增益最大的鄰居節點社區中。

每次計算節點 i 從社團 D 移動到社團 C 中時,根據模塊度計算公式可知,此時產生的模塊度變化只與當前C、D社區相關,不與其他社區相關,因此計算成本較低,將節點 i 從社區 D 轉移到 C 中帶來的模塊度增益為:

ΔQ=ΔQ(D→i)+ΔQ(i→C)

直至節點移動不再產生增益,階段1停止

**階段2:**社區聚合

將同一個社區的多個節點,融合為一個新的節點,社區內節點之前的權重后續不再使用,當前社區與其他社區之間的權重為兩個社區所有節點的權重和,從而構建出新的圖結構。回到階段1不斷迭代,直至圖結構不再產生改變。

實例

這是初始的graph,A到F一共6個節點:

初始階段,節點之間的合并,以節點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則不進行社區劃分,大于0則取最大的模塊度增益對應節點進行合并,合并之后我們得到:

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
根據上面的計算可以知道模塊度增益
都是小于0的,迭代停止,
此時即為最終的社區劃分的結果;

總結

louvain是針對于無向圖的,模塊度的定義是針對于無向圖的,但是實際上對于有向圖而言也可以直接適配,主要原因在于模塊度的優化是一個相對的過程,改變部分常量的比例不會影響相對優化的過程

louvain的缺點以及解決方案

從公式和上述的例子可以看出為什么louvain可能出現分離群合并的傾向,舉一個極端的例子,假設某個小群X和某個大群Y之間只有一條權重為1的邊連接,小群除了這一條邊之外就沒有和任何其它的節點或者社群連接了,此時上式括號里的第二項的計算結果會非常小,

以上圖為例,社區16和社區14之間的權重為1,社區16和其它社區連接的邊的權重之和為 4,則4/(1+3+1+1+4)小于1(注意louvain是迭代計算的,每一次迭代,圖的結構都會發生變化,公式中的參數的取值都會發生變化),二者合并。但其實我們并不希望他們合并,直觀上二者已經是獨立的社群了不需要進一步合并。
解決這個問題的方法有3種:

1、過濾掉權重比較弱的邊,直接將弱邊的權重置為0,即去掉這些邊;

2、修改模塊度增益的公式,設置一個最小閾值,即模塊度增益必須大于某個閾值才會發生合并;

3、使用分層louvain,即假設louvain迭代了十次,則我們可以取第8次的迭代結果,可以通過可視化每次迭代的modulairty來實現,當modularity收斂不再發生變化時,取那一次對應的迭代結果

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。