在做東西的時候用到了社區發現的算法,因此查找了好多人的文章,發現一個不錯的總結,先轉載過來
原文出處http://blog.csdn.net/aspirinvagrant/article/details/45577033
在社區發現算法中,幾乎不可能先確定社區的數目,於是,必須有一種度量的方法,可以在計算的過程中衡量每一個結果是不是相對最佳的結果。
模塊度(Modularity)用來衡量一個社區的划分是不是相對比較好的結果。一個相對好的結果在社區內部的節點相似度較高,而在社區外部節點的相似度較低。
全局模塊度
設AVW 為網絡的鄰接矩陣的一個元素,定義為:
假設cv和cw分別表示點v和點w所在的兩個社區,社區內部的邊數和網絡中總邊數的比例:
函數δ(cv,cw)的取值定義為:如果v和w在一個社區,即cv=cw,則為 1,否則為 0。m 為網絡中邊的總數。
模塊度的大小定義為社區內部的總邊數和網絡中總邊數的比例減去一個期望值,該期望值是將網絡設定為隨機網絡時同樣的社區分配所形成的社區內部的總邊數和網絡中總邊數的比例的大小,於是模塊度Q為:
其中kv表示點v的度。
設eij表示社區i和社區j內部邊數目的和與總邊數的比例,ai表示社區i內部的點所關聯的所有的邊的數目與總邊數的比例。
為了簡化Q的計算,假設網絡已經划分成n個社區,這個時候就有一個 n維矩陣,Q 的計算可以變成:
在進行每次划分的時候計算Q值,Q取值最大的時候則是此網路較理想的划分。Q值的范圍在0-1之間,Q值越大說明網絡划分的社區結構准確度越高,在實際的網絡分析中,Q值的最高點一般出現在0.3-0.7之間。
局部模塊度
有時候,可能不知道全網絡的數據,可以用局部社區的局部模塊度的方式來檢查社區的合理性。假設有一個已經檢測出來的社區,社區的節點的集合為V,這些節點所有的鄰接節點而加入到集合當中來,形成新的集合V*。定義V*的鄰接矩陣為:
於是,和全局模塊度相似的是,可以用節點集V*全部屬於節點集V中的元素所占的比例的大小來衡量一個社區的好壞:
其中,δ(i,j)表示的是如果i,j都是V中則值為1,否則為0。m*表示的是鄰接矩陣內邊的數目。
局部模塊度比全局模塊度要快的多,因為局部模塊度的計算只需要用到局部的網絡信息,只需要在剛剛開始的時候掃描一下整個網絡。對於中小規模的網絡可能局部模塊度的效果要低於全局模塊度,但是而且對於中等或者大規模的社會網絡來說,局部模塊度的效果可能還要好一些。
參考資料:
Finding community structure in very large networks
社區發現算法(一)
圖分割方法大多是基於迭代二分法的,基本思想是將圖分割成兩個子圖,然后迭代,最后得出要求的子圖數。經典的算法有Kernighan-Lin算法和譜二分算法。
K-L(Kernighan-Lin)算法
K-L(Kernighan-Lin)算法是一種將已知網絡划分為已知大小的兩個社區的二分方法,它是一種貪婪算法。它的主要思想是為網絡划分定義了一個函數增益Q,Q表示的是社區內部的邊數與社區之間的邊數之差,根據這個方法找出使增益函數Q的值成為最大值的划分社區的方法。具體策略是,將社區結構中的結點移動到其他的社區結構中或者交換不同社區結構中的結點。從初始解開始搜索,直到從當前的解出發找不到更優的候選解,然后停止。
K-L算法的缺陷是必須先指定了兩個子圖的大小,不然不會得到正確的結果,實際應用意義不大。
譜二分算法
當網絡中存在兩個社區結構時,就能夠根據非零特征值所對應的特征向量中的元素值進行結點划分。把所有正元素對應的那些結點划分為同一個社區結構,而所有負元素對應的結點划分為另外一個社區結構。
譜二分算法利用的是Laplace矩陣的特征值和特征向量的性質來做社區划分。Laplace矩陣的第二小特征值λ2的值越小,划分的效果就越好。所以譜二分法使用Laplace矩陣的第二小特征值來划分社區。
譜平分法的缺陷是,一次只能划分2個社區,如果需要划分多個,需要執行多次。如果只需要划分兩個社區,譜平分法的效率比較高,但是要划分多個社區的時候,鋪平分法的效率就不高了,它的優點也不能得到充分的體現,而且准確度也可能會降低。
社區發現算法(二)
GN算法
本算法的具體內容請參考Finding and evaluating community structure in networks(Newman and Girvan)。
重要概念
邊介數(betweenness):網絡中任意兩個節點通過此邊的最短路徑的數目。
GN算法的思想:
在一個網絡之中,通過社區內部的邊的最短路徑相對較少,而通過社區之間的邊的最短路徑的數目則相對較多。下圖中展示了變得強度以及邊介數在現實網絡中的分布情況。GN算法是一個基於刪除邊的算法,本質是基於聚類中的分裂思想,在原理上是使用邊介數作為相似度的度量方法。在GN算法中,每次都會選擇邊介數高的邊刪除,進而網絡分裂速度遠快於隨機刪除邊時的網絡分裂。
GN算法的步驟如下:
(1)計算每一條邊的邊介數;
(2)刪除邊界數最大的邊;
(3)重新計算網絡中剩下的邊的邊階數;
(4)重復(3)和(4)步驟,直到網絡中的任一頂點作為一個社區為止。
GN算法示例:
GN算法計算邊界數的時間復雜度為 O(m*n),總時間復雜度在m條邊和n個節點的網絡下為 O(m2*n)。
GN算法的缺陷:
(1)不知道最后會有多少個社區;
(2)在計算邊介數的時候可能會有很對重復計算最短路徑的情況,時間復雜度太高;
(3)GN算法不能判斷算法終止位置。
為了解決這些問題,Newman引入了模塊度Q的概念,它用來一個評價社區結構划分的質量。網絡中的社區結構之間的邊數並不是絕對數量上的少,而是應該比期望的邊數要少。關於模塊度的概念請參考社區划分的標准--模塊度。
GN算法具體實現借助基於R的圖挖掘庫igraph。
數據集為Karate數據集:
Zachary空手道俱樂部成員關系網絡是復雜網絡、社會學分析等領域中最常用的一個小型檢測網絡之一。從1970到1972年,Zachary觀察了美國一所大學空手道俱樂部成員間的社會關系,並構造出了34個成員,78條成員關系的社會關系網。兩個成員經常一起出現在俱樂部活動之外的其他場合,就認為兩個成員間有邊。該俱樂部因為主管(節點34)與教練(節點1)之間的爭執而分裂成2個各自為核心的小俱樂部。結構如下圖所示。具體請參考An information flow model for conflict and fission in small groups。
GN算法的R分析代碼
> library("igraph")
> karate <- graph.famous("Zachary")
> ebc <- edge.betweenness.community(karate)
> ebc
Graph community structure calculated with the edge betweenness algorithm
Number of communities (best split): 5
Modularity (best split): 0.4012985
Membership vector:
[1] 1 1 2 1 3 3 3 1 4 5 3 1 1 1 4 4 3 1 4 1 4 1 4 4 2 2 4 2 2 4 4 2 4 4
> modularity(ebc)
[1] 0.4012985
> membership(ebc)
[1] 1 1 2 1 3 3 3 1 4 5 3 1 1 1 4 4 3 1 4 1 4 1 4 4 2 2 4 2 2 4 4 2 4 4
> plot(ebc,karate)
Newman快速算法
本算法的具體內容請參考Fast algorithm for detecting community structure in networks(Newman)。
GN算法通過模塊度可以准確的划分網絡,但它只適用於中小型規模的網絡。Newman提出一種基於貪心的快速社區發現算法,算法的基本思想是:首先將網絡中的每個頂點設為一個單獨社區,然后選出使得模塊度Q的增值最大的社區對進行合並;如果網絡中的頂點屬於同一個社區,則停止合並過程。整個過程是自底向上的過程,且這個過程最終得到一個樹圖,即樹的葉子節點表示網絡中的頂點,樹的每一層切分對應着網絡的某個具體划分,從樹圖的所有層次划分中選擇模塊度值最大的划分作為網絡的有效划分。
設網絡有n個節點,m條邊,每一步合並對應的社區數目為r,組成一個r*r矩陣e,矩陣元素eij表示社區i中的節點與社區j中節點之間連邊的數目在網絡總變數的百分比。
主要步驟:
(1) 初始化網絡,開始網絡有n 個社區,初始化的eij和ai為:
(2)依次按照∆Q的最大或者最小的方向進行合並有邊相連的社區對,並計算合並后的模塊度增量∆Q:
(3)合並社區對以后修改對社區對稱矩陣e 和社區i和j對應的行列;
(4)重復執行步驟(2)和(3),不斷合並社區,直至整個網絡合並成一個社區為止。
Newman快速算法的R分析代碼
> karate <- graph.famous("Zachary")
> fc <- fastgreedy.community(karate)
> dendPlot(fc)
參考資料:
Social and Information Network Analysis Jure Leskovec, Stanford University