python下的復雜網絡編程包networkx的使用(摘抄)


NetworkX是一個用Python語言開發的圖論與復雜網絡建模工具,內置了常用的圖與復雜網絡分析算法,可以方便的進行復雜網絡數據分析、仿真建模等工作。我已經用了它一段時間了,感覺還不錯(除了速度有點慢),下面介紹我的一些使用經驗,與大家分享。

一、NetworkX及Python開發環境的安裝

首先到 http://pypi.python.org/pypi/networkx/下載networkx-1.1-py2.6.egg,到 http://sourceforge.net/projects/pywin32/下載pywin32-214.win32-py2.6.exe。如果要用Networkx的制圖功能,還要去下載matplotlib和numpy,地址分別在 http://sourceforge.net/projects/matplotlib/http://sourceforge.net/projects/numpy/files/。注意都要用Python 2.6版本的。

上邊四個包中,pywin32、matplotlib和numpy是exe文件,按提示一路next,比較容易安裝。而NetworkX是個egg文件,安裝稍微麻煩,需要用easyinstall安裝。具體方法:

啟動DOS控制台(在“運行”里輸入cmd),輸入C:\Python26\Lib\site-packages\easy_install.py C:\networkx-1.1-py2.6.egg,回車后會自動執行安裝。注意我是把networkx-1.1-py2.6.egg放到了C盤根目錄,讀者在安裝時應該具體根據情況修改路徑。

安裝完成后,啟動 “開始 - 程序 - ActiveState ActivePython 2.6 (32-bit) - PythonWin Editor”,在shell中輸入:

import networkx as nx
print nx

如果能輸出:



說明Networkx已經安裝好了,可以正常調用。

關於Python語言,如果沒有接觸過可以找一本Python的語法書來看看(推薦《Python 精要參考(第二版)》,網上有電子版)。這個語言很簡單易學,只要有點編程基礎,幾天就可以學會它,然后就可以自如的運用它調用NetworkX了。


二、建立圖或網絡

1、無向圖

在PythonWin 的Shell里輸入:

import networkx as nx                            #導入NetworkX包,為了少打幾個字母,將其重命名為nx
G = nx.Graph()                                        #建立一個空的無向圖G
G.add_node(1)                                        #添加一個節點1
G.add_edge(2,3)                                     #添加一條邊2-3(隱含着添加了兩個節點2、3)
G.add_edge(3,2)                                     #對於無向圖,邊3-2與邊2-3被認為是一條邊
print G.nodes()                                       #輸出全部的節點: [1, 2, 3]
print G.edges()                                       #輸出全部的邊:[(2, 3)]
print G.number_of_edges()                    #輸出邊的數量:1 

這樣就可以建立一個簡單的無向圖了。如果你的數據是存在文件里的,可以循環從文件中讀取節點和邊添加到G中。

2、有向圖

有向圖的建立方式和無向圖基本類似,只是在上述代碼的第二行,將G = nx.Graph() 改為 G = nx.DiGraph() 。需要注意的是,此時再添加邊3-2與邊2-3,則被認為是兩條不同的邊(可以試着運行上述代碼,自己查看結果)。

同時,有向圖和無向圖是可以相互轉化的,分別用到Graph.to_undirected() 和 Graph.to_directed()兩個方法。

3、加權圖(網絡)

有向圖和無向圖都可以給邊賦予權重,用到的方法是add_weighted_edges_from,它接受1個或多個三元組[u,v,w]作為參數,其中u是起點,v是終點,w是權重。例如:

G.add_weighted_edges_from([(0,1,3.0),(1,2,7.5)])

添加0-1和1-2兩條邊,權重分別是3.0和7.5。

如果想讀取權重,可以使用get_edge_data方法,它接受兩個參數u和v,即邊的起訖點。例如:
print G.get_edge_data(1,2)                   #輸出{'weight': 7.5},這是一個字典結構,可以查看python語法了解它的用法。

三、調用圖算法

NetworkX提供了常用的圖論經典算法,例如DFS、BFS、最短路、最小生成樹、最大流等等,非常豐富,如果不做復雜網絡,只作圖論方面的工作,也可以應用NetworkX作為基本的開發包。具體的算法調用方法我就不一一介紹了,可以瀏覽NX的在線手冊http://networkx.lanl.gov/reference/algorithms.html,對每個算法都提供了詳細的幫助文檔和示例。下面只給出一個最短路算法的例子:

path=nx.all_pairs_shortest_path(G)     #調用多源最短路徑算法,計算圖G所有節點間的最短路徑
print path[0][2]                                     #輸出節點0、2之間的最短路徑序列: [0, 1, 2]

四、小結

作為NetworkX學習筆記的第一部分,今天先簡單介紹下NetworkX的安裝與基本使用方法。后邊有時間會陸續介紹:用NetworkX進行復雜網絡拓撲結構統計指標計算、典型復雜網絡建模(隨機圖、小世界、無標度等)以及復雜網絡可視化的方法等,請感興趣的朋友關注並提出批評與意見。
 
 

復雜網絡分析庫NetworkX學習筆記(2):統計指標計算

無論是實際網絡還是對模型網絡進行分析,都離不開對網絡拓撲統計指標的計算。反映網絡結構與動力學特性的統計指標有很多,Costa等的 Characterization of Complex Networks: A Survey of measurements一文對此有全面的綜述,本文僅介紹一些常用的統計指標在NetworkX中如何計算。

一、度、度分布

NetworkX可以用來統計圖中每個節點的度,並生成度分布序列。下邊是一段示例代碼(這段代碼可以在Shell里一行一行的輸入,也可以將其保存為一個以py結尾的純文本文件后直接運行),注意看注釋部分:

import networkx as nx
G = nx.random_graphs.barabasi_albert_graph(1000,3)   #生成一個n=1000,m=3的BA無標度網絡
print G.degree(0)                                   #返回某個節點的度
print G.degree()                                     #返回所有節點的度
print nx.degree_histogram(G)    #返回圖中所有節點的度分布序列(從1至最大度的出現頻次)


對上述結果稍作處理,就可以在Origin等軟件里繪制度分布曲線了,當然也可以用matplotlib直接作圖,在上述代碼后接着輸入:

import matplotlib.pyplot as plt                 #導入科學繪圖的matplotlib包
degree =  nx.degree_histogram(G)          #返回圖中所有節點的度分布序列
x = range(len(degree))                             #生成x軸序列,從1到最大度
y = [z / float(sum(degree)) for z in degree]  
#將頻次轉換為頻率,這用到Python的一個小技巧:列表內涵,Python的確很方便:)
plt.loglog(x,y,color="blue",linewidth=2)           #在雙對數坐標軸上繪制度分布曲線  
plt.show()                                                          #顯示圖表


二、群聚系數

這個在NetworkX里實現起來很簡單,只需要調用方法nx.average_clustering(G) 就可以完成平均群聚系數的計算,而調用nx.clustering(G) 則可以計算各個節點的群聚系數。

三、直徑和平均距離

nx.diameter(G)返回圖G的直徑(最長最短路徑的長度),而nx.average_shortest_path_length(G)則返回圖G所有節點間平均最短路徑長度。

四、匹配性

這個也比較簡單,調用 nx.degree_assortativity(G) 方法可以計算一個圖的度匹配性。

五、中心性

這個我大部分不知道怎么翻譯,直接上NX的幫助文檔吧,需要計算哪方面的centrality自己從里邊找:)

Degree centrality measures.(點度中心性?)
degree_centrality(G)     Compute the degree centrality for nodes.
in_degree_centrality(G)     Compute the in-degree centrality for nodes.
out_degree_centrality(G)     Compute the out-degree centrality for nodes.

Closeness centrality measures.(緊密中心性?)
closeness_centrality(G[, v, weighted_edges])     Compute closeness centrality for nodes.

Betweenness centrality measures.(介數中心性?)
betweenness_centrality(G[, normalized, ...])     Compute betweenness centrality for nodes.
edge_betweenness_centrality(G[, normalized, ...])     Compute betweenness centrality for edges.

Current-flow closeness centrality measures.(流緊密中心性?)
current_flow_closeness_centrality(G[, ...])     Compute current-flow closeness centrality for nodes.
Current-Flow Betweenness

Current-flow betweenness centrality measures.(流介數中心性?)
current_flow_betweenness_centrality(G[, ...])     Compute current-flow betweenness centrality for nodes.
edge_current_flow_betweenness_centrality(G)     Compute current-flow betweenness centrality for edges.

Eigenvector centrality.(特征向量中心性?)
eigenvector_centrality(G[, max_iter, tol, ...])     Compute the eigenvector centrality for the graph G.
eigenvector_centrality_numpy(G)     Compute the eigenvector centrality for the graph G.

Load centrality.(徹底暈菜~~~)
load_centrality(G[, v, cutoff, normalized, ...])     Compute load centrality for nodes.
edge_load(G[, nodes, cutoff])     Compute edge load.


六、小結

上邊介紹的統計指標只是NetworkX能計算的指標中的一小部分內容,除此之外NetworkX還提供了很多(我還沒有用到過的)統計指標計算方法,感興趣的朋友可以去查NetworkX的在線幫助文檔: http://networkx.lanl.gov/reference/index.html。對於加權圖的統計指標計算,NetworkX似乎沒有直接提供方法(也可能是我沒找到),估計需要自己動手編制一些程序來完成。
 
 

復雜網絡分析庫NetworkX學習筆記(3):網絡演化模型

NetworkX提供了4種常見網絡的建模方法,分別是:規則圖,ER隨機圖,WS小世界網絡和BA無標度網絡。本文首先介紹在NetworkX生成這些網絡模型的方法,然后以BA無標度網絡的建模為例,分析利用NetworkX進行復雜網絡演化模型設計的基本思路,以便將來開發出我們自己的模型。同時這篇文章里還涉及到一點復雜網絡可視化的方法(后邊有時間會另文介紹網絡可視化的方法)。

 

一、規則圖

規則圖差不多是最沒有復雜性的一類圖了,在NetworkX中,用random_graphs.random_regular_graph(d, n)方法可以生成一個含有n個節點,每個節點有d個鄰居節點的規則圖。下面是一段示例代碼,生成了包含20個節點、每個節點有3個鄰居的規則圖:

import networkx as nx
import matplotlib.pyplot as plt
RG = nx.random_graphs.random_regular_graph(3,20)  #生成包含20個節點、每個節點有3個鄰居的規則圖RG
pos = nx.spectral_layout(RG)          #定義一個布局,此處采用了spectral布局方式,后變還會介紹其它布局方式,注意圖形上的區別
nx.draw(RG,pos,with_labels=False,node_size = 30)  #繪制規則圖的圖形,with_labels決定節點是非帶標簽(編號),node_size是節點的直徑
plt.show()  #顯示圖形


運行結果如下:

圖1   NetworkX生成的規則圖

 

 

二、ER隨機圖

ER隨機圖是早期研究得比較多的一類“復雜”網絡,這個模型的基本思想是以概率p連接N個節點中的每一對節點。在NetworkX中,可以用random_graphs.erdos_renyi_graph(n,p)方法生成一個含有n個節點、以概率p連接的ER隨機圖:

import networkx as nx
import matplotlib.pyplot as plt
ER = nx.random_graphs.erdos_renyi_graph(20,0.2)  #生成包含20個節點、以概率0.2連接的隨機圖
pos = nx.shell_layout(ER)          #定義一個布局,此處采用了shell布局方式
nx.draw(ER,pos,with_labels=False,node_size = 30) 
plt.show()

運行結果如下:

圖2   NetworkX生成的隨機圖


三、WS小世界網絡

在NetworkX中,可以用random_graphs.watts_strogatz_graph(n, k, p)方法生成一個含有n個節點、每個節點有k個鄰居、以概率p隨機化重連邊的WS小世界網絡,下面是一個例子:

import networkx as nx
import matplotlib.pyplot as plt
WS = nx.random_graphs.watts_strogatz_graph(20,4,0.3)  #生成包含20個節點、每個節點4個近鄰、隨機化重連概率為0.3的小世界網絡
pos = nx.circular_layout(WS)          #定義一個布局,此處采用了circular布局方式
nx.draw(WS,pos,with_labels=False,node_size = 30)  #繪制圖形
plt.show()

運行結果如下:

圖3   NetworkX生成的WS小世界網絡


四、BA無標度網絡

在NetworkX中,可以用random_graphs.barabasi_albert_graph(n, m)方法生成一個含有n個節點、每次加入m條邊的BA無標度網絡,下面是一個例子:

import networkx as nx
import matplotlib.pyplot as plt
BA= nx.random_graphs.barabasi_albert_graph(20,1)  #生成n=20、m=1的BA無標度網絡
pos = nx.spring_layout(BA)          #定義一個布局,此處采用了spring布局方式
nx.draw(BA,pos,with_labels=False,node_size = 30)  #繪制圖形
plt.show()

運行結果如下:


圖4   NetworkX生成的BA無標度網絡

  

五、對BA模型實現代碼的分析

前面我們介紹了NetworkX提供的4種網絡演化模型的應用方法,但僅停留在使用已有的模型是不夠的,實際工作中我們可能會自己開發一些網絡演化模型。利用NetworkX提供的數據結構,我們可以比較方便的完成這一工作。下面以NetworkX中BA模型的實現代碼為例,分析用NetworkX開發網絡演化模型的一般思路。NetworkX中關於網絡建模的代碼在random_graphs.py這個文件中,可以用記事本打開它。為了敘述簡便起見,我刪掉了原始代碼中的一些錯誤處理與初始條件定義的語句,紅色部分是翻譯后的注釋。

#定義一個方法,它有兩個參數:n - 網絡節點數量;m - 每步演化加入的邊數量
def barabasi_albert_graph(n, m):
    # 生成一個包含m個節點的空圖 (即BA模型中t=0時的m0個節點) 
    G=empty_graph(m)  
    # 定義新加入邊要連接的m個目標節點
    targets=range(m)  
    # 將現有節點按正比於其度的次數加入到一個數組中,初始化時的m個節點度均為0,所以數組為空 
    repeated_nodes=[]     
    # 添加其余的 n-m 個節點,第一個節點編號為m(Python的數組編號從0開始)
    source=m 
    # 循環添加節點
    while source        # 從源節點連接m條邊到選定的m個節點targets上(注意targets是上一步生成的)
        G.add_edges_from(zip([source]*m,targets)) 
        # 對於每個被選擇的節點,將它們加入到repeated_nodes數組中(它們的度增加了1)
        repeated_nodes.extend(targets)
        # 將源點m次加入到repeated_nodes數組中(它的度增加了m)
        repeated_nodes.extend([source]*m) 
        # 從現有節點中選取m個節點 ,按正比於度的概率(即度優先連接)
        targets=set()
        while len(targets)            #按正比於度的概率隨機選擇一個節點,見注釋1
            x=random.choice(repeated_nodes) 
            #將其添加到目標節點數組targets中
            targets.add(x)        
        #挑選下一個源點,轉到循環開始,直到達到給定的節點數n
        source += 1 
    #返回所得的圖G
    return G

注釋1:此步是關鍵,random.choice方法是從一個數組中隨機地挑選一個元素。由於repeated_nodes數組中的節點出現次數是正比於節點度的,所以這樣處理可以保證按度大小的概率選出節點,即實現了度優先連接。如果是按正比於節點適應性等非整數值優先連接,可以參考我的另一篇博文《根據值的大小隨機取數組元素的方法》。

 

六、小結

NetworkX的優勢之一就是開源,這也是所有Python庫的優勢(Python是腳本語言,它沒有辦法隱藏源代碼)。NetworkX的源代碼結構清晰,風格簡練,注釋詳盡,是學習、研究復雜網絡不錯的參考資料。當然在這方面我也是初學者,更多的功能還需要在實際應用中不斷去發掘和領會…………

 

 

復雜網絡分析庫NetworkX學習筆記(4):網絡可視化

科學可視化是利用計算機圖形學來創建視覺圖像,幫助人們理解那些采取錯綜復雜而又往往規模龐大的數字呈現形式的科學概念或結果。對於復雜網絡研究來說,可視化技術同樣重要,它有助於呈現或解釋復雜網絡數據和模型,進而從中發現(或許是從數據中不易發現的)各種模式、特點和關系。

在我的另一篇博文《推薦一個復雜網絡可視化的網站》中,介紹了www.visualcomplexity.com這個網站,上邊有大量復雜網絡和復雜系統的圖片,五彩繽紛,令人嘆為觀止。有的朋友可能會想,這些圖形是否都是使用一些專業的平面設計軟件制作的呢?其實,通過使用NetworkX,我們同樣可以制作出精美的復雜網絡圖形,它提供了非常豐富的網絡可視化功能。下邊這幅動畫就是用從NetworkX網站上下載的圖片拼合而成的,感興趣的朋友可以到http://networkx.lanl.gov/gallery.html這個地址去查看生成這些圖形的源代碼。
在這篇筆記中,我將簡單地介紹使用NetworkX繪制復雜網絡圖形的基本方法。當然在這方面我也是初學,只略懂一些皮毛,希望能起到拋磚引玉的作用:)

一、基本繪圖流程

在NetworkX中,繪制一個網絡使用nx.draw()方法,它至少接受一個參數:即你希望繪制的網絡G。實際上這個方法非常復雜,它可以指定20多個關鍵字參數,后邊會介紹一些常用的參數,我們先從最簡單的情況入手,看看下邊的例子:

import networkx as nx                   #導入networkx包
import matplotlib.pyplot as plt     #導入繪圖包matplotlib(需要安裝,方法見第一篇筆記)
G =nx.random_graphs.barabasi_albert_graph(100,1)   #生成一個BA無標度網絡G
nx.draw(G)                          #繪制網絡G
plt.savefig("ba.png")           #輸出方式1: 將圖像存為一個png格式的圖片文件
plt.show()                            #輸出方式2: 在窗口中顯示這幅圖像


運行上述代碼的結果如下:

這樣,用短短的幾行代碼就完成了一個最基本的網絡圖形繪制,而且生成了一個功能豐富的窗體。窗口左下方的工具欄可以對圖像進行放大、縮小、平移、保存等操作,可以自己動手試一下。同時,在源文件的目錄下還生成了一個png格式的圖片文件,可以把它插入報告或論文中,是不是很方便呢?

二、運用樣式

上邊的代碼雖然簡單,但生成的圖形略顯單調。NetworkX提供了一系列樣式參數,可以用來修飾和美化圖形,達到我們想要的效果。常用的參數包括:

      - `node_size`:  指定節點的尺寸大小(默認是300,單位未知,就是上圖中那么大的點)
      - `node_color`:  指定節點的顏色 (默認是紅色,可以用字符串簡單標識顏色,例如'r'為紅色,'b'為綠色等,具體可查看手冊)
      - `node_shape`:  節點的形狀(默認是圓形,用字符串'o'標識,具體可查看手冊)
      - `alpha`: 透明度 (默認是1.0,不透明,0為完全透明) 
      - `width`: 邊的寬度 (默認為1.0)
      - `edge_color`: 邊的顏色(默認為黑色)
      - `style`: 邊的樣式(默認為實現,可選: solid|dashed|dotted,dashdot)
      - `with_labels`: 節點是否帶標簽(默認為True)
      - `font_size`: 節點標簽字體大小 (默認為12)
      - `font_color`: 節點標簽字體顏色(默認為黑色)

靈活運用上述參數,可以繪制不同樣式的網絡圖形,例如:nx.draw(G,node_size = 30,with_labels = False) 是繪制節點尺寸為30、不帶標簽的網絡圖。

三、運用布局

NetworkX在繪制網絡圖形方面提供了布局的功能,可以指定節點排列的形式。這些布局包括:

circular_layout:節點在一個圓環上均勻分布
random_layout:節點隨機分布
shell_layout:節點在同心圓上分布
spring_layout: 用Fruchterman-Reingold算法排列節點(這個算法我不了解,樣子類似多中心放射狀)
spectral_layout:根據圖的拉普拉斯特征向量排列節點?我也不是太明白

布局用pos參數指定,例如:nx.draw(G,pos = nx.circular_layout(G))。在上一篇筆記中,四個不同的模型分別是用四種布局繪制的,可以到那里去看一下效果,此處就不再重復寫代碼了。

另外,也可以單獨為圖中的每個節點指定一個位置(x、y坐標),不過比較復雜,我還沒有這樣做過。感興趣的朋友可以看一下NetworkX文檔中的一個例子:http://networkx.lanl.gov/examples/drawing/knuth_miles.html


四、添加文本

用plt.title()方法可以為圖形添加一個標題,該方法接受一個字符串作為參數,fontsize參數用來指定標題的大小。例如:plt.title("BA Networks", fontsize = 20)。如果要在任意位置添加文本,則可以采用plt.text()方法。事實上這些功能(包括前邊的圖形保存等功能)並不是由NetworkX提供的,從包的名字上可以看出,這些繪圖函數都是由matplotlib這個包提供的。NetworkX只是把與復雜網絡繪圖相關的功能重新包裝了一下,讓用戶調用更方便而已。

需要補充的一點是,matplotlib並不直接支持中文文本,如果想輸出中文,走正規方法還是挺麻煩的(見http://blog.csdn.net/KongDong/archive/2009/07/10/4338826.aspx)。不過有聰明的網友提出了一種偷梁換柱的解決方案:換字體。只要把一個中文字體文件(ttf文件)更名為Vera.ttf,拷貝到matplotlib的字體目錄中覆蓋原有文件,就可以輸出中文了,具體細節見http://hi.baidu.com/ucherish/blog/item/63155e52b68c90070df3e3ff.html 。

五、小結

這篇筆記簡單介紹了用NetworkX繪制復雜網絡圖形的方法,實際上NetworkX的制圖能力是很強的(主要是matplotlib的功勞),本文所介紹的功能只是其中最基礎的一部分,更多功能還有待我們一起去發掘。再次推薦 http://networkx.lanl.gov/gallery.html上的繪圖示例代碼,能看懂弄清這些代碼,用NetworkX繪圖應該就難不住你了:)
 
 

復雜網絡分析庫NetworkX學習筆記(5):二分圖

二分圖又稱二部圖,是圖論中的一種特殊模型,它的頂點可分割為兩個互不相交的子集,並且圖中的每條邊所關聯的兩個頂點分別屬於這兩個不同的頂點集。二分圖在復雜網絡分析中有很多應用,例如科學家合作網絡(作者和論文)、商品網絡(商品和購買者)、城市公交網絡(線路和站點)等都可以用二分圖來進行描述。NetworkX提供了一些基本的二分圖建模與分析功能,下面對這些功能作一個簡單的介紹。

一、建立二分圖

建立二分圖與建立普通的圖方法比較類似,需要注意的是,邊只能在不同類節點之間添加,同類節點之間不要添加邊就可以。下面是一個簡單的例子(本例中用1開頭的編號表示項目節點,用2開頭的編號表示參與者節點):

import networkx as nx
B = nx.Graph()
#添加一個項目101,它有3個參與者:201,202,203
B.add_edge(101,201)
B.add_edge(101,202)
B.add_edge(101,203)
#添加一個項目102,它有2個參與者:203,202,2034
B.add_edge(102,203)
B.add_edge(102,204)
…………………………


此外,
NetworkX還提供了多種二分圖演化模型的建立方法,在這里把它們列出來供大家參考:
--  networkx.generators.classic.complete_bipartite_graph(n1, n2, create_using=None)
建立一個完全二分圖
--   networkx.generators.bipartite.bipartite_configuration_model (aseq, bseq, create_using=None, seed=None)
根據兩個度序列建立一個二分圖
--   networkx.generators.bipartite.bipartite_random_regular_graph(d, n, create_using=None, seed=None)
建立一個隨機的規則二分圖
--   networkx.generators.bipartite.bipartite_preferential_attachment_graph(aseq, p, create_using=None, seed=None)
建立一個優先連接的二分圖
--   networkx.generators.bipartite.bipartite_havel_hakimi_graph(aseq, bseq, create_using=None)
根據兩個度序列建立一個Havel-Hakimi模式的二分圖(下面兩個模型類似,我沒有接觸過這個模型,不太理解具體含義)
--   networkx.generators.bipartite.bipartite_reverse_havel_hakimi_graph(aseq, bseq, create_using=None)
--     networkx.generators.bipartite.bipartite_alternating_havel_hakimi_graph(aseq, bseq, create_using=None)

二、檢測圖的二分性

用networkx.is_bipartite()方法可以檢測一個圖是否是二分圖。例如對上邊代碼建立的二分圖,nx.is_bipartite(B)返回的結果是True,而對一個隨機圖R = nx.random_graphs.gnp_random_graph(100,0.2),由於它不是二分圖,nx.is_bipartite(R)返回的結果是False。

NetworkX並沒有提供圖的二分度計算方法,如果使用到這一功能需要自己編制代碼。何大韌老師等編寫的《復雜系統與復雜網絡》一書的132頁有二分度的計算公式,感興趣的朋友可以自己實現這一程序。

此外,NetworkX還提供了對二分圖節點進行着色的算法:networkx.bipartite_color(),它可以返回一個字典結構,分別為二分圖中的兩類節點賦予一個顏色值以示區別。例如對前面建立的二分圖進行着色:print nx.bipartite_color(B),將返回結果 :{101: 1, 102: 1, 201: 0, 202: 0, 203: 0, 204: 0},項目節點被賦予顏色值1,參與者節點的顏色值是0。可以用這個值來檢測節點類型,也可以用它來進行繪圖(參看第4篇筆記《網絡可視化》)。

三、二分圖的投影

二分圖可以通過向參與者節點投影或向項目節點投影轉換為一個單分圖(見下圖),NetworkX提供的networkx.project(B, nodes)方法可以完成這一工作。它接受兩個參數:一個是二分圖B,另一個是投向的節點集合nodes。
二分圖投影示意(向下投影)

對於節點集合的提取可以用networkx.bipartite_sets方法,它可以將一個二分圖的兩類節點提取為兩個集合(X,Y),其中X是項目節點,Y是參與者節點。下面是一段示例代碼,演示上述兩個函數的用法:

(接第一節的代碼之后)
NSet = nx.bipartite_sets(B)   #將二分圖中的兩類節點分別提取出來
Act = nx.project(B,NSet[0])     #向項目節點投影
Actor = nx.project(B,NSet[1])  #向參與者節點投影
print Act.edges()  #輸出 [(101, 102)]
print Actor.edges()   #輸出 [(201, 202), (201, 203), (202, 203), (203, 204)]


四、通過派系提取構造二分圖

對於一個存在派系(Clique)的圖,可以通過提取派系結構生成一個二分圖。NetworkX提供的networkx.make_clique_bipartite方法可以從圖中查找派系,然后將一個派系作為一個項目節點並和該派系中的節點建立連接,從而構造一個二分圖。它是二分圖向參與者節點投影的逆過程,下邊是一段示例代碼:

(接第三節的代碼之后)
G = nx.make_clique_bipartite(Actor)
print G.edges()  #輸出:[(201, -1), (202, -1), (203, -2), (203, -1), (204, -2)]

補充一點,NetworkX的派系提取算法據說效率很高,不過我沒有做過這方面的東西,感興趣的朋友可以去看它的源代碼(見http://networkx.lanl.gov/reference/algorithms.clique.html)。

五、小結

本篇筆記介紹了用NetworkX進行二分圖建模與分析的方法,到今天為止,我的《NetworkX學習筆記》就暫告一段落了。我目前的工作中只用到了這幾篇筆記中所寫的功能,以后如果有其他的心得體會我還會繼續進行補充。希望這些文章對學習和研究復雜網絡的朋友們能起到一點幫助作用,也歡迎各位留言批評、討論。

最后,向NetworkX的三位開發者Aric Hagberg、Dan Schult 、Pieter Swart 以及許許多多的貢獻者致敬*,感謝他們為我們提供了這樣一個優秀的復雜網絡分析工具!

根據三位開發者的建議,如果要在論文中引用NetworkX,請引用以下文獻:
Aric A. Hagberg, Daniel A. Schult and Pieter J. Swart, “Exploring network structure, dynamics, and function using NetworkX”, in Proceedings of the 7th Python in Science Conference (SciPy2008), Gäel Varoquaux, Travis Vaught, and Jarrod Millman (Eds), (Pasadena, CA USA), pp. 11–15, Aug 2008


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM