Fast unfolding of communities in large networks

作者:鄭梓豪
鏈接:https://zhuanlan.zhihu.com/p/19769897
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

接着上文,我們需要進一步瞭解Gephi工具計算modularity的算法。在Gephi社區中,有文檔Modularity - Gephi Wiki說明了算法[1]。

What & Why Community Detection

在直接進入文章之前,需要先了解community detection的出發點和意圖。直觀地說,community detection的一般目標是要探測網絡中的“塊”cluster或是“社團”community;這麼做的目的和效果有許多,比如說機房裏機器的連接方式,這裏形成了網絡結構,那麼,哪些機器可以視作一個“塊”?進一步地,什麼樣的連接方式纔有比較高的穩定性呢?如果我們想要讓這組服務癱瘓,選擇什麼樣的目標呢?How can Modularity help in Network Analysis


我們再看一個例子,word association network。即詞的聯想/搭配構成的網絡:

我們用不同的顏色對community進行標記,可以看到這種detection得到的結果很有意思。這個網絡從詞bright開始進行演化,到後面分別形成了4個組:Colors, Light, Astronomy & Intelligence。可以說以上這4個詞可以較好地概括其所在community的特點;另外,community中心的詞,比如color, Sun, Smart也有很好的代表性。

你或許也已發現,那些處在交疊位置的詞呢?比如Bright、light等詞,他們是義項比較多的詞。這個圖也揭示出了這一層含義。*以上給出的例子均是來自文章[2]

好,我們現在正式開始讀文章!

算法思路概要

我們回憶一下,或者問自己:什麼樣的東西能成爲團?嗯,對,同一團內的節點連接更緊密,即具有更大的density。那麼,什麼樣的metrics可以用來描述這種density?好了,假設我們有了這個density定義了,要怎樣繼續下去呢?

嗯,這就是所謂method based on modularity optimization


Our method is a heuristic method that is based on modularity optimization.

optimization體現在哪?前面我們提到過density,那麼,一個最完美的方案是什麼樣的?當然便是每個節點都找到了最好的去處,同時使得一個community間的緊密度最大!

Modularity & Density

這個問題,一方面是網絡的拆分partition,另一方面是衡量這組partition的quality。我們用modularity of the partition來表示這組拆分的quality:

其中A_{ij}代表節點i,j間連接的權重,k_i = \sum_jA_{ij}即與節點i相連的所有邊的權重之和,c_i, c_j表示節點i, j的commnity index;接下來的函數\delta(c_i, c_j)表示節點i,j是否在同一個community中(相同時取1,否則取0),最後m = \frac{1}{2}\sum_{ij}A_{ij}表示整個網絡的連接權重總和。

注意到,Q的取值範圍是在[-1,1]之間的。當i,j沒有邊相連,我們便可以認爲A_{ij}=0,然而其他項是可能大於0的;這個設定意味着,這樣加入一個節點(但這個節點與該community中的某些點沒有連接),會帶來負的作用。

可以看到,這個定義,是通過link來描述的。我們下面直觀地給出一個例子,來計算一下該分割的quality(也叫modularity):

可以看到,這種分割方式是使Q最大的,即模塊化程度越高越好(不超過1)。好了,我們在前面說過了模型的思路,有了一個overview以後,我們接下來把整個模型求解學習一下。

Method

算法可分爲兩個階段,並不斷重複迭代。例如我們有N個節點的網絡:

  1. 爲每一個節點都分配一個community index,即此時網絡有N個community。此爲初始狀態
  2. 對每個節點i,我們考慮它的鄰接節點j;我們讓i的community變成j的,看這個動作對modularity的值有怎樣的作用。如果這個變動帶來的\Delta Q是正的,那我們就接納這個變動,否則就保持原來的分配方式

好,第一個phase就是這樣。當整個過程做到無法再提升的時候便停止。這裏需要再注意一點,就是...初始點要怎麼選?文章提到,初始點的選擇對整個結果不會有太大影響,然而對整個計算時間有很大影響。

下面這個式子給出了“將節點i加入community C帶來的modularity的變動:


其中\sum_{in}是該community內部的連接權重總和,\sum_{tot}是所有與該community相連的邊之權重和。


第二個phase在第一步結果的基礎上繼續進行:

首先我們有一個原始的網絡,然後在第一階段,使用Modularity Optimization給出一個劃分。隨後將同一個community進行摺疊,摺疊後形成一個新的網絡,其中:

  • community間的連接權重爲連接兩個community的節點之權重和
  • community內部的連接形成一個自環,其權重爲該community內部連接的和


這兩個phase做完一輪後,稱作pass;顯然每次pass都會讓community的數量變小,不過,這個過程其實也是在建立節點間的層次結構hierarchical structure。如下面這個圖的例子,雖然左邊這個網絡是分成了2個組,但其中的一部分可以繼續劃分。


對此,作者這樣說道:
The algorithm is reminiscent of the self-similar nature of complex networks and naturally incorporates a notion of hierarchy, as communities of communities are built during the process


------------

那麼現在我們就用站上的數據來做一些preliminary analysis

我們做這個事情,大概有兩種思路:一是沿用話題樹的結構做連接,二是對問題中的tags作爲連接標準。這次我們先做第一種情況。


全站話題結構


可以看到大部分節點都是整合起來的,所謂stongly-connected;顏色代表了不同的community。圖太大了,我們選其中一個community來看看。

其中一個community


同一個community仍可以繼續進行劃分

這裏的節點大小是根據Betweenness Centrality調節的...挺有趣的結果。下一次,我們將用另一種方法進行實驗。

爲什麼要做這些?

這樣做的目的,大概是爲了找到一把適度的尺子,爲後面的文本分類做一種標準。

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