重讀網絡挖掘中community detection 文章--Fast unfolding of communities in large networks

community detection 是源於複雜網絡領域的關於網絡節點的社團劃分的工作。

複雜網絡學科大量的實證研究發現很多網絡存在聚簇效應,比如常見的社交網絡。正所謂人以羣分,物以類聚。

community detection 方法分爲很多種,分裂方法,聚合方法等等。community detection 一個分支是重疊社區的發現(比如社交網絡,一個節點可能屬於多個社區),這個我這裏暫時不累述,這個和非重疊社區識別方法有一定不同。這裏主要說下非重疊社區劃分方法。

community detection優化的目標大多是模塊度指標,模塊度越高,社團劃分越好。


我最早接觸的方法是NewMan組提出的Finding community structure in very large networks【1】文章提出的方法,這個可以處理百萬規模的數據,但是,其實單機的話,20w上以上其實已經比較慢了。他這個方法是聚合方法,每個節點剛開始是單獨社團,然後合併,每次取使模塊度增大節點合併。具體細節參考文章本身。

後面接觸的是label propagation方法:Near linear time algorithm to detect community structures in large-scale networks【2】這個方法是每次用戶獲取鄰居中出現頻次最高的社區標籤作爲自己的標籤,反覆迭代,直到收斂。這個算法一般使用異步更新節點社區標籤,因爲如果網絡出現局部二部圖結構,會出現震盪。他這個不是直接優化模塊度的,時間很快,線性時間複雜度,但是經常出現不收斂情況,如果應用的話,需要做調整。

圖例如下:


算法過程如下:



現在主要說下Fast unfolding of communities in large networks【3】

這個算法速度也很快,效率很高,處理的節點的規模可以很大。

這個方法分兩步:

(1)從節點合併開始, 構建第一步社團劃分結果。每個節點根據模塊度增益決定是否加入到鄰居節點的社團中和到底加入到哪個鄰居節點的社團中。每個節點按序執行該過程。

(2)重新構建網絡。把第一步每個社團單做一個節點,邊是原來社團之間鏈接邊權的和。

迭代(1),(2),直到收斂。

其中模塊度增益如下:


networkx包的community detection使用的方法就是這種方法。

算法過程的圖例如下:



我在普通c用戶的轉賬關係網絡中嘗試過這種方法,幾十萬節點很快,劃分效果也很不錯,不用自己設定社團大小。


參考文獻:

[1] Clauset A, Newman M E J, Moore C. Finding community structure in very large networks[J]. Physical review E, 2004, 70(6): 066111.

[2] Near linear time algorithm to detect community structures in large-scale networks

[3] Fast unfolding of communities in large networks


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章