圖論和網絡科學都會涉及到大量對圖的特性的統計計算,一般將與圖數據相關的統計、挖掘、可視化統稱為圖處理。本系列文章主要希望探討多方面的圖處理理論與方法,包括圖的統計性質、表示方法、計算算法、計算模型以及基於圖論的數據挖掘等內容。文章只有在必要的情況下區分圖和網絡的概念,所以文章術語中的圖與網絡將混用。
1.圖處理引擎
目前通用的圖處理軟件主要包括兩種。一種主要基於遍歷算法、實時的圖數據庫,如 Neo4j , OrientDB , DEX , 和 InfiniteGraph .另一種則是以圖頂點為中心的消息傳遞批處理的並行引擎,如Hama , Golden Orb , Giraph , 和 Pregel .前者基本都基於tinkerpop的圖基礎框架,tinkerpop項目關系如圖1所示:
圖1 thinkerpop項目框架
其后者則主要是基於BSP模型所實現的並行圖處理包。BSP是由哈佛大學Viliant和牛津大學Bill McColl提出的並行計算模型。一個BSP模型由大量相互關聯的處理器(processor)所組成,它們之間形成了一個通信網絡。每個處理器都有快速的本地內存和不同的計算線程。一次BSP計算過程包括一系列全局超步組成,超步就是計算中一次迭代。每個超步主要包括三個組件:
- 並發計算(Concurrent computation):每個參與的處理器(processor)都有自身的計算任務,它們只讀取存儲在本地內存的值。這些計算都是異步並且獨立的。
- 通訊(Communication): 處理器群相互交換數據,交換的形式:由一方發起推送(put)和獲取(get)操作。
- 柵欄同步(Barrier synchronisation): 當一個處理器遇到路障,會等到其他所有處理器完成它們的計算步驟。每一次同步也是一個超步的完成和下一個超步的開始。
2.網絡生成
現實世界的復雜網絡包括無標度網絡(Scale-free Network)、隨機網絡(Random Network),依賴網絡(Dependency network)等。其中無標度網絡是由匈牙利物理學家Albert-László Barabási在繪制互聯網拓撲的研究中所提出的概念,他發現隨機網絡(社會、生物網絡)中一些節點(hubs)有比其它節點更多的連接,從而整個網絡服從冪次定律(power-law)分布。於是Barabási和Albert提出了無標度網絡的生成機制--“優先連接”,用於解釋冪次定律分布的現象。因而優先連接算法生成的網絡能夠模擬現實世界的網絡,我們采用R來實現BA 模型的網絡生成,采用的igraph包。
igraph是一個開源的圖(有向、無向圖)生成和操作的類庫,它底層由C實現,並實現了python, R語言的發行包,覆蓋全平台(linux,window,MacOS)。它能夠生成正則圖(regular graphs)、隨機圖(random graphs)等,能給頂點和邊賦值,還可以計算不同的結構屬性、圖同構等。igraph支持的格式包括:Edge list,Pajek,GraphML等。Edge list是簡單的txt文件,使用頂點id來定義邊。GraphML基於XML,用來存儲圖的邊和頂點屬性。更多的格式內容請參考igraph幫助文檔。用法如下所示:
barabasi.game(n, power = 1, m = NULL, out.dist = NULL, out.seq = NULL, out.pref = FALSE, zero.appeal = 1, directed = TRUE, algorithm = c("psumtree", "psumtree-multiple", "bag"), start.graph = NULL)
power: 優先連接的冪,默認為1.即線性優先連接。m:數值常數,這個值控制每次時間步長添加的邊。只有在 out.dist 和 out.seq都為空的時候生效。無標度網絡生成的R代碼如下:
> library("igraph") > g <- simplify(barabasi.game(100000, m=10)) > length(V(g)) [1] 100000 > length(E(g)) [1] 999945 > E(g)[1:5] Edge sequence: [1] 2 -> 1 [2] 3 -> 1 [3] 3 -> 2 [4] 4 -> 1 [5] 4 -> 2 > write.graph(g, '/tmp/barabasi.xml', format='graphml')
barabasi.game()函數,生成ba模型的無標度網絡,每次添加的邊為10(m=10).write.graph()函數將生成的網絡以graphml的格式保存在磁盤中。
3.圖入度計算
頂點的度(degree)是圖最基本的結構,是指與它關聯的邊的數量。有向圖會區分入度(in-degree)和出度(out-degree).圖的度分布(degree distribution)是所有頂點的概率分布。igraph中只需要使用degree函數可以計算頂點的度,用法如下所示:
degree(graph, v=V(graph), mode = c("all", "out", "in", "total"), loops = TRUE, normalized = FALSE) degree.distribution(graph, cumulative = FALSE, ...)
我們通過改變圖生成算法的冪,觀察圖的入度分布。R代碼如下:
library(igraph) g <- barabasi.game(100000) d <- degree(g, mode="in") dd <- degree.distribution(g, mode="in", cumulative=TRUE) alpha <- power.law.fit(d, xmin=20) plot(dd, log="xy", xlab="degree", ylab="cumulative frequency", col=1, main="Nonlinear preferential attachment") lines(10:500, 10*(10:500)^(-coef(alpha)+1)) powers <- c(0.9, 0.8, 0.7, 0.6) for (p in seq(powers)) { g <- barabasi.game(100000, power=powers[p]) dd <- degree.distribution(g, mode="in", cumulative=TRUE) points(dd, col=p+1, pch=p+1) } legend(1, 1e-5, c(1,powers), col=1:5, pch=1:5, ncol=1, yjust=0, lty=0)
結果如下圖所示:

本作品由VentLam創作,采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可。



