1. 程式人生 > >網路社區劃分演算法

網路社區劃分演算法

網路社區劃分演算法

目錄

  [隱藏

簡介

使用許多網際網路資料,我們都可以構建出這樣的網路,其節點為某一種資訊資源,如圖片,視訊,帖子,新聞等,連邊為使用者在資源之間的流動。對於這樣的網路,使用社區劃分演算法可以揭示資訊資源之間的相關性,這種相關性的發現利用了使用者對資訊資源的處理資訊,因此比起單純使用資源本身攜帶的資訊來聚類(例如,使用新聞包含的關鍵詞對新聞資源進行聚類),是一種更深刻的知識發現。

構建一個點選流網路

假設我們手頭有一批使用者在一段期間內訪問某類資源的資料。為了減少資料數理規模,我們一般只考慮最經常被訪問的一批資源。因此在資料處理中,我們考慮UV(user visit)排名前V的資源,得到節點集合|V|,然後對於一個使用者i在一段時間內(例如一天)內訪問的資源,選擇屬於|V|的子集vi。如果我們有使用者訪問資源的時間,就可以按照時間上的先後順序,從vi中產生vi-1條有向邊。如果我們沒有時間的資料,可以vi兩兩間建立聯絡,形成vi(vi-1)/2條無向邊。因為後者對資料的要求比較低,下文中,暫時先考慮後者的情況。 對於一天內的n個使用者做這個操作,最後將得到的總數為 的連邊裡相同的邊合併,得到|M|個不同的邊,每條邊上都帶有權重資訊。這樣,我們就得到了V個節點,M條邊的一個加權無向網路,反應的是在一天之內使用者在主要的資訊資源間的流動情況。在這個網路上,我們可以通過社區劃分的演算法對資訊資源進行分類。

網路社區劃分的兩種主要思路:拓撲分析和流分析

社區劃分的演算法比較多,但我個人認為大致可以分為兩大類:拓撲分析和流分析。前者一般適用於無向無權網路,思路是社群內部的連邊密度要高於社群間。後者適用於有向有權網路,思路是發現在網路的某種流動(物質、能量、資訊)中形成的社群結構。這兩種分析各有特點,具體應用取決於網路資料本身描述的物件和研究者想要獲得的資訊。


Community figure 1.png

 

我們可以將已知的一些演算法歸入這兩類:

演算法 優化目標 計算複雜度 適用情況 侷限
拓撲分析        
Q Modularity 最大化Q-modularity V|^2 無向無權多分量 不適用小網路
Edge-Betweenness 最小化社群間連邊的betweenness V|*|E|^2 有向有權多分量
Leading Eigenvector 對拉普拉斯矩陣第二小特徵根對應的特徵向量聚類 V|^2+ |E| 無向無權多分量  
Fast Greedy 使用社群合併演算法來快速搜尋最大Q-modularity E|*log(|V|) 無向有權多分量 不適用小網路
Multi Level 使用社群展開演算法來快速搜尋最大Q-modularity V| 無向有權多分量 不適用小網路
流分析        
Walk Trap 最大化社群間的流距離 E|*|V|^2 無向有權單分量  
Label Propagation 每個節點取鄰居中最流行的標籤,迭代式收斂 V| + |E| 無向有權單分量 結果不穩定
Info map 最小化隨機流的編碼長度 V|*(|V|+|E|) 有向有權單分量  
Role-based community 劃分出在流中地位類似的節點 V|^3 有向有權單分量 結果不穩定

 

上表中的分量(component)指在網路中的獨立“團塊”。有向網路裡,分量有強弱之分,強分量(strong component )中任意一個節點都可到達另外一個節點,弱分量(weak component)中如果忽略連邊方向,則構成強分量。無向網裡分量沒有強弱之分。在網路中識別強分量的演算法有Kosaraju演算法,Tarjan演算法及其變形Gabow演算法等。在這裡不展開敘述。 接下來,我們逐一討論拓撲分析和流分析中的各種演算法的具體思路。

拓撲分析

計算網路的模組化程度Q-Modularity

Q-Modularity是一個定義在[-0.5,1)區間內的指標,其演算法是對於某一種社群結構,考慮每個社群內連邊數與期待值之差。實際連邊越是高於隨機期望,說明節點越有集中在某些社群內的趨勢,即網路的模組化結構越明顯。Newman在2004年提出這個概念最初是為了對他自己設計的社區劃演算法進行評估,但因為這個指標科學合理,而且彌補了這個方面的空白,迅速成為一般性的社區劃分演算法的通用標準。 Q的具體計算公式如下: Community figure 2.png

其中A是網路G對應的鄰接矩陣,如果從i到j存在邊,則Aij=1,否則為0。m是總連線數,2m是總度數,Aij/2m是兩節點之間連線的實際概率。Ki和kj分別是i和j的度數。如果我們保持一個網路的度分佈但對其連邊進行隨機洗牌,任意一對節點在洗牌後存在連線的概率為kikj/(2m)2。上式中中括號表達的就是節點之間的實際連邊概率高於期待值的程度。後面跟著一個二元函式,如果節點ij屬於同一個社群,則為1,否則為0,這就保證了我們只考慮社群內部的連邊。剛才這個定義是以節點為分析單位。實際上,如果以社群為分析單位看Q指標,可以進一步將其化簡為eii和ai之間的差。其中eii是在第i個社群內部的link佔網絡總link的比例,ai是第i個社群和所有其他社群的社群間link數。

上式已經清楚定義了Q,但在實際計算裡,上式要求對社群及其內部節點進行遍歷,這個計算複雜度是很大的。Newman(2006)對上式進行了化簡,得到矩陣表達如下: 我們定義Sir為n * r的矩陣,n是節點數,r是社群數。如果節點i屬於社群r,則為1,否則為0。則有Community figure 3.png

於是有

Community figure 4.png

其中B是modularity matrix,其元素為

Community figure 5.png

該矩陣的行列和都是0,因為實際網路和隨機洗牌後的網路度分佈是不變的。特別地,在僅僅有兩個社群的情況下(r=2),可以s定義為一個n長的向量,節點屬於一個社群為1,屬於另一個社群為-1,Q可以寫成一個更簡單的形式:

Community figure 6.png

通過對社群的劃分可能空間進行搜尋,可以得到最大化Q值的社區劃分。在這個過程會涉及數值優化的部分,例如表一中的fast greedy和multilevel就是用不同方法進行快速搜尋的例子。以fast greedy為例Newman(2006),它通過不斷合併社群來觀察Q的增加趨勢,得到了一個在最差的情況下複雜度約為O( |E|*log(|V|) ),在最好的情況下接近線性複雜度的演算法。

計算網路的連邊緊密度Edge betweenness

這個思路出現得比較早(Newman, 2001)。Freeman (1975) 提出過一個叫betweenness的指標,它衡量的是網路裡一個節點佔據其他n-1節點間捷徑的程度。具體而言,首先對每一對節點尋找最短路徑,得到一個n * (n-1)/2的最短路徑集合S,然後看這個集合中有多少最短路徑需要通過某個具體的節點。Newman借鑑了這個標準,但不是用來分析節點而是分析連邊。一個連邊的edge betweenness就是S集合裡的最短路徑包含該連邊的個數。 定義了連邊的betweenness後,就可以通過迭代演算法來進行社區劃分了。具體做法是先計算所有連邊的betweenness,然後去除最高值連邊,再重新計算,再去除最高值連邊,如此反覆,直到網路中的所有連邊都被移除。在這個過程中網路就逐漸被切成一個個越來越小的component。在這個過程中,我們同樣可以用Q-modularity來衡量社區劃分的結果。這種演算法定義比較清晰,也不涉及矩陣數學等運算,但問題是計算複雜度比較大。

計算網路拉普拉斯矩陣的特徵向量Leading eigenvector

一個有n個節點的網路G可以被表達為一個n x n的鄰接矩陣(adjacency matrix)A。在這個矩陣上,如果節點i和j之間存在連邊,則Aij=1,否則為0。當網路是無向的時候,Aij=Aji。另外我們可以構造n x n的度矩陣(degree matrix)D。D對角線上的元素即節點度數,例如Dii為節點i的度數,所有非對角線的元素都是0。無向網的分析不存在度數的選擇問題,有向網則要根據分析目標考慮使用出度還是入度。將度數矩陣減去鄰接矩陣即得到拉普拉斯矩陣,即L = D-A。

L的特徵根\lambda_0 <= \lambda_1 <= ...<= \lambda_{n-1}存在一些有趣性質。首先,最小的特徵根總等於0。因為如果將L乘以一個有n個元素的單位向量,相當於計算每一行的和,剛好是節點的度的自我抵消,結果等於0。其次,特徵根中0 的個數即無向網G中分量的個數。這意味著如果除了最小特徵根,沒有別的特徵根為0,則整個網路構成一個整體。

在這些特徵根裡,第二小的特徵根(或者最小的非零特徵根)\lambda_1又叫做代數連通性(algebraic connectivity),其對應的特徵向量叫做Fidler vector。當\lambda_1 >0,說明網路是一個整體。\lambda_1越大,說明網路彼此間的連結越緊密。從這個定義來看,非常像前面討論的Q-Modularity,實際上在Newman2006的文章裡,確實討論了二者在數學上的對應關係。例如對示例網路所對應的進行分析,可以得到拉普拉斯矩陣如下:

Community figure 7.png


這個矩陣的特徵根如下:{5.5, 4.5, 4.0, 3.4, 2.2, 1.3, 1.0, 0}。取\lambda_1 =1時, Fidler vector={0.29, 0.00, 0.29, 0.29, 0.29, -0.58, -0.58, 0.00}。因為Fidler vector的值分別對應著圖裡的節點,於是可以寫成{a:0.29, b: 0.00, c:0.29, d:0.29, e:0.29, f:-0.58, g:-0.58, h:0.00}。僅僅從元素的正負號就可以看出,該分析建議我們把f和g節點與其他節點分開,更細緻的,對元素值大小的考察則建議把矩陣分成三個社群,{{a, c, d, e}, {b, h}, {e, f}}。回到圖中考察,我們發現這個社群分類基本是合理的。

通過fast greedy方法搜尋網路模組化程度Q-Modularity的最大值

通過multi level方法搜尋網路模組化程度Q-Modularity的最大值

因為以上兩種方法都是基於Q-modularity的,只不過是搜尋策略的不同,所以在此不展開討論。

流分析

隨機遊走演算法Walk Trap

P. Pons 和 M. Latapy 2005年提出了一個基於隨機遊走的網路社區劃分演算法。他們提出可以使用兩點到第三點的流距離之差來衡量兩點之間的相似性,從而為劃分社群服務。其具體過程如下:首先對網路G所對應的鄰接矩陣A按行歸一化,得到概率轉移矩陣(transition matrix)P。使用矩陣計算表達這個歸一化過程,可以寫作

Community figure 8.png

其中A是鄰接矩陣,D是度矩陣。利用P矩陣的馬可夫性質可知,它的t次方的元素Pijt就代表著隨機遊走的粒子經過t步從節點i到j的概率。其次,定義兩點ij間的距離如下:

Community figure 9.png

其中t是流的步長。步長必須恰當選擇,因為如果t太小,不足以體現網路的結構特徵,如果t太大,則Pijt趨近於與j的度數d(j)成正比, 隨機游出發點i的拓撲資訊被抹去。作者建議的t經驗值為3到5之間。k是某一個目標節點。所以這個公式描述的是經過t步,ij到目標節點k的平均流轉移概率(因為這個概率與中間節點k的度數d(k)成正比,所以要除以d(k)來去除這個影響)。ij到網路所有其他點之間的距離差別越小,說明ij很可能位於及其類似的位置上,彼此之間的距離也越接近。值得注意的是,這個思路如果只考慮一個或少數的目標節點,是不合適的。因為rij實際上只是結構對稱性。有可能ij在網路的兩端,距離很遠,但到中間某個節點的距離是相等的。但因為公式要求k要遍歷網路中除了ij以外的所有節點,這個時候ij如果到所有其他節點的流距離都差不多,比較可能是ij本身就是鄰居,而不僅僅是結構上的對稱。如公式所示,rij表達可以寫成矩陣表達,其中Pti•是第P的t次方後第i行。

定義了任意兩點之間的距離rij後,就可以將其推廣,得到社群之間的距離rc1c2了:

Community figure 10.png

容易看出,這個距離與節點之間的距離很相似,只不過這次是計算兩個社群分別到目標節點k的流距離,而計算單個社群C到節點k的流距離時,又是對社群C內所有節點到k流距離取平均。

一旦從流結構中提取了節點相似性,社區劃分就是一個比較簡單的聚類問題。例如可以採取合併式聚類法如下:先將每個節點視為一個社群,然後計算所有存在連邊的社群之間的流距離。然後,取兩個彼此連線且流距離最短社群進行合併,重新計算社群之間的距離,如此不斷迭代,直到所有的節點都被放入同一個社群。這個過程社群的數目不斷減小,導致出現一個樹圖分層(dendrogram)結構。在這個過程中,可以使用Q-modularity的變化來指導搜尋的方向。

標籤擴散演算法label propagation

這種演算法的思路源於馮諾依曼在50年代提出的元胞自動機模型(cellular automata)和Bak等人在2002年左右做的沙堆模型。該演算法的基本原理如下:首先,給全網每個節點分配一個不重複的標籤(label);其次,在迭代的每一步,讓一個節點採用在它所有的鄰居節點中最流行的標籤(如果最佳候選標籤超過一個,則在其中隨機抽一個),;最後,在迭代收斂時,採用同一種標籤的節點被歸入同一個社群。 這個演算法的核心是通過標籤的擴散來模擬某種流在網路上的擴散。其優勢是演算法簡單,特別適用於分析被流所塑造的網路。在大多數情況下可以快速收斂。其缺陷是,迭代的結果有可能不穩定,尤其在不考慮連邊的權重時,如果社群結構不明顯,或者網路比較小時,有可能所有的節點都被歸入同一個社群。

流編碼演算法 the Map Equation

Rosvall和Axelsson 2009年提出了一種很有意思的方法來研究網路中的流動。其核心思想是,好的社區劃分要令網路上流的平均描述長度最短。他們認為,分析有向加權網路的一個好的視角是觀察某類實體(貨幣、能量、資訊)在網路上的流動。即使沒有實體流動的資料,我們也可以根據網路的基本結構來推測隨機遊走的粒子的軌跡,然後對得到的“平均流”進行資訊編碼。對“平均流”的描述長度最短的編碼機制,就對應著對社群的一種最有效劃分。

首先要討論的是節點層編碼。最簡單的方式是給每個節點分配一個獨特的二進位制簽名。但這種編碼方式並不高效,因為節點被訪問的概率並不一樣。為了改進,我們可以引入一個Huffman編碼表(code book),在這個編碼表上,每個節點都對應一個獨立的二進位制編碼,但碼長與節點被訪問的概率(通過轉移矩陣P在無窮步後的收斂結果來計算)相反。這樣,“平均流”的資訊長度就大大被降低了。 其次,我們還可以通過引入兩層編碼,節點編碼和社群編碼,來進一步降低資訊長度。有了社群編碼的好處是,兩個或多個社群內部的節點編碼是可以重複的,這就進一步降低了資訊長度。需要注意的是,兩層編碼並不意味著像國際電話區號那樣,在每個節點前加一個社群字首碼,因為這樣的話其實就和單層編碼沒有什麼區別了。這裡的兩層編碼實際上是在利用流的“局域性”。只需要我們標識出社群的入口(即社群編碼)和出口(定義在社群間連邊上的編碼),在此區域內訪問的節點,可以直接使用節點層的編碼,不用考慮社群編碼。例如:11-0000-11-01-101-100-101-01-0001-0-110-011-00-110-00-111-… 在這個流中,加粗的0前面,節點都在一個社群裡遊走,所以直接使用節點編碼,0001是一個社群出口連邊(exit)編碼,使用了這個編碼意味著節點要跳轉社群,接下來0這個社群編碼被使用,意味著流進入0社群,在這裡面再次直接使用節點編碼,直到跳出0社群(0社群的exit被使用)。

在這個兩層編碼體系中,包括三類碼錶(code book)。第一個是主碼錶(master code book),決定每個社群的編碼;第二個是傳送門碼錶(exit code book),決定每個社群的出口連邊的編碼;第三個是節點碼錶(node code book),決定每個社群內的節點的編碼。一旦對網路的社區劃分P(partition)給定,就存在一個社群碼錶,一個傳送門碼錶,和m個節點碼錶,其中m是社群的個數。最後,社區劃分的目標就是要最小化所有碼錶的總長,或者按論文中的說法,平均隨機遊走中的一步所耗費的資訊成本。 這個思路以一種很有趣的方式利用了網路社群的定義。網路社群的存在,意味著社群內的流動較多,跨越社群的流動較少。因此,一個好的社區劃分意味著主碼錶和傳送門碼錶被呼叫的次數都很少,描述的資訊配額(quota)主要用於描述社群內的流動。相反,如果待分析的是一個隨機的網路,或者研究者構造了一種低效的社區劃分,那麼主碼錶和傳送門碼錶被呼叫的次數將會很多。特別是傳送門碼錶,也就是錯誤的社區劃分會大大加大這個碼長。

一個總結了以上思想的公式可以表達如下,作者稱之為the map equation。

Community figure 11.png

其中M即對網路的某種社區劃分得到m個社群。L是該劃分所對應的資訊描述長度。qi->代表進出第i個社群的概率(先考慮無向網路),因此q->代表社群間跳轉的總概率。H(Q)是社群間跳轉行為的夏農資訊量。Pi->代表第i個社群內節點間跳轉的總概率,H(Pi)是第i個社群內節點間跳轉行為的夏農資訊量。在公式的兩個部分,資訊量都用其被使用的頻率進行加權。經過展開化簡,可以得到簡化形式如下:

Community figure 12.png

最後,使用某種社區劃分的搜尋策略(主要有細分與合併兩種)來尋找該描述長度的最小值即可。值得注意的是,在實際計算中,節點層的資訊量(第三項)是不需要考慮的。

流層級演算法 Role-based Similarity

Cooper和Barahona 在2010年提出了一個演算法,可以揭示網路中流的層級關係。他們認為,通過對網路的鄰接矩陣A進行分析,可以得到一個節點從一步到k步的出流或入流的畫像(flow profile),在任意兩個節點之間比較這種流畫像,就可以得到節點之間的相似性,從而為社區劃分服務。

具體過程如下:先得到網路的鄰接矩陣A,這個時候V=AKI中的元素Vi就代表第i個節點在k步的所有出流之和。類似地,U=(AT)KI中的元素Ui就代表第i個節點在k步的入流之和。

Community figure 13.png

如公式所示,我們可以構造n * k的矩陣Xin,其元素Xinij代表第i個節點在第k步的入流;也可以構造Xout,其元素Xoutij代表第i個節點在第k步的出流。把Xin和Xout橫著拼在一起,就是X。其維度為n * 2k。在X矩陣上,第i行正好描述了節點i在k步內的所有入流和出流的資訊。因此,可以通過計算第i行和j行的Cosine距離或者Manhattan距離等來定義節點相關性rij,最後得到的相關性矩陣,就可以用於聚類。

Community figure 14.png

圖3展示了將role-based similarity方法用於分析一個示例流網路的結果。發現分類的結果確實反映了流的層級關係。值得注意的是,雖然在論文中作者建議使用Cosine距離,但我發現在這個例項網路上,使用Manhattan距離的結果能更清晰地揭示流層級結構。因此,具體的分析要看資料的情況,這也是應用這種演算法需要考慮的侷限之一。

總結

Community figure 15.png


本文中我們總結了構建點選流網路之後,使用社區劃分演算法來對點進行聚類的不同思路。主要可以分為拓撲分析和流分析兩種,從數學角度看,前者以頻譜分析(Spectral analysis)為主要手段,後者以馬可夫鏈(Markov chain)為主要建模工具。其中流編碼演算法較為獨特,以資訊理論為主要工具。但值得注意的是,由於編碼演算法仍然是在處理流,所以本質上只是對馬可夫鏈的一種處理。例如在圖4中,編碼演算法沒有能區分開節點,而是將所有的節點歸為一個區,每個節點被訪問的流概率恰好等於其Page rank值(與節點的大小和顏色深度成正比)。而我們知道Page rank也仍然是基於馬可夫鏈的。這個時候平均每走一步要消耗2.71位元資訊。