1. 程式人生 > >基於GN演算法的網路通聯關係社團發現(Python)

基於GN演算法的網路通聯關係社團發現(Python)

一、什麼是社團?

社團是具有某些共同特徵的人相聚而成的互益組織。隨著社交網路的快速發展,人類社會對網路的依賴程度也越來越高,特別是基於網路的社交工作層出不窮,通過網路分析人類現實社會關係的可能性和可行性大大增強。

二、什麼是GN演算法?

GN 演算法是由Grivan和Newman所提出的一種圖論經典演算法。基本思想就是:社團之間成員的聯絡多,不同社團的成員之間聯絡少。社團之間所存在的少數幾個連線是社團間通訊的瓶頸,是社團間通訊時資料流的必經之路。按照某種形式的通訊關係並且尋找到具有最高通訊經過的邊,該邊就應該是連線不同社團的通道。將這樣的邊全部去掉後,就獲得了社團的最高分解形式。為了衡量一條邊具有的最高通訊經過的程度,引入了邊介數(betweenness)的概念,這是在點介數基礎上的推廣應用。邊介數指的是所有節點對之間的雖短路徑中經過該邊的最短路徑數。

GN演算法的主要步驟:計算網路中每條邊的邊介數,去掉邊介數最大的那條邊。重複進行直至網路中沒有任何邊存在。

但GN演算法也存在2點不足。一是該演算法無法預知網路最終應該分裂成多少社團;二是計算速度緩慢,在一個具有m條邊和n個節點的圖中計算出每條邊的介數所需時間為O(mn)。

為了解決第一個問題,Newman在2004年的一片論文中又提出了模組度(Modularity)的概念。

三、什麼是模組度?

模組度又稱模組化度量值,是目前常用的一種衡量網路社群結構強度的方法,其定義為“Modularity is the fraction of the edges that fall within the given groups minus the expected such fraction if edges were distributed at random.”(來自wiki),其公式為:

這個式子是合併後的形式,在理解的過程中應當將中括號去掉,做一個分配率的變化,如下圖。


模組度值Q的大小主要取決於網路中節點的社群分配C,即網路的社區劃分情況,可以用來定量的衡量網路社區劃分質量,其值越接近1,表示網路劃分出的社群結構的強度越強,也就是劃分質量越好。因此可以通過最大化模組度Q來獲得最優的網路社區劃分。


這個公式解釋一下,A是網路的鄰接矩陣的一個元素,v和w是網路中的兩個點,如果這兩個點之間有邊存在的話,Avw=1,否則等於0。而δvw的取值定義為:若兩者在同一個社群內,δvw為1,否則為0。kvkw的代表i點和j點的度,m為網路中邊的總數。這個式子表示在同一社群內的邊的數量佔所有邊數量的比例,乘以1/2則是因為在鄰接矩陣中每條邊都計算了兩次。


後一個式子表示的是將對網路的邊進行隨機分配,需要將每條邊切斷一分為二,這樣m條邊就會產生2m個末梢點,隨機的將這2m個末梢點進行連線,包括同一節點擁有的末梢點的自連線。這樣可以保持每個節點原有的度不變的條件下,可以得到一個完全隨機網路。在這樣的隨機網路下,任意兩點v、w連線邊數的期望值是kvkw/2m。

總的來說,模組度的大小就是社群內部的總邊數和網路中總邊數的比例減去一個期望值,該期望值是將網路設定為隨機網路時同樣的社群分配所形成的社群內部的總邊數和網路中總邊數的比例的大小。

通過這樣的計算得出模組值Q的取值範圍為[-0.5,1),有可能取到負值。

四、有了Q值之後的GN演算法

有了Q值之後,我們只要將整個網路不停地分割下去,每次分割都計算一次Q值,最終,輸出Q值最高時的社團分類就行了。

具體演算法為:

1.計算當前網路的邊介數和Q值,並存儲Q值和當前網路中社團分割情況;

2.出去邊介數最高的邊;

3.計算當前網路的Q值,如果此Q值比原來的大,則將現在的Q值和網路中社團分割情況儲存更新,否則,進行下一次網路分割;

4.所有邊分割完畢,返回當前的Q值和社團分割情況。

Python演算法實現等下篇再更新