Network Science with Python With NetworkX
- 2020 年 5 月 6 日
- AI

第1章,什麼是網路?概述了網路科學和社會網路分析的歷史,並介紹了常見的網路類型,並指導您使用NetworkX編寫第一個程式。
第2章,在NetworkX中使用網路,介紹簡單,定向和加權的網路,以及如何在NetworkX中使用它們。
第3章,從數據到網路,介紹了用於載入網路數據和從頭開始創建網路的功能。
第4章,附屬網路,重點介紹具有兩種類型的節點(例如組和組成員)的網路,並說明如何在NetworkX中使用這些網路,以及如何將它們轉換為僅具有一種類型的聯合網路。的節點。
第5章,小型節點和中心,展示了如何使用NetworkX通過查看各個節點及其連接的屬性來分析網路結構。
第6章,描述網路概述,介紹了幾種用於對整個網路的結構進行分類的度量,並說明了這些度量如何區分不同類型的實際網路。
第7章,在社區之間,討論了中等規模的網路結構,包括社區檢測,集團檢測和k核。
第8章,社交網路和病毒式傳播,著重介紹將網路科學應用於社交網路時出現的特殊注意事項,以及社交網路的屬性如何影響諸如疾病或創新之類的傳染病的傳播。
第9章,模擬和分析,介紹了用於基於基本假設生成網路的幾種模型,以及如何使用基於代理的模型來模擬網路系統的演進。
第10章「時空網路」涵蓋與地理位置相關的網路數據以及隨時間變化的數據的特殊注意事項。
第11章,可視化,介紹了NetworkX提供的幾種可視化功能,以及如何使用它們有效地可視化網路資訊。
第12章,總結,總結了整本書中汲取的教訓,並提供了用於追求網路科學更高級主題的資源
很多基礎知識沒啥可介紹的,主要記錄一些我覺得比較需要留意的或者是之前不了解的。感興趣的可以去百度上搜這本書,資源挺多的。

關於edges可能需要關注的是:

在社交網路中,邊通常代表友誼或其他人際關係。 邊權重則代表了友誼的強度,例如,在一起的時間,交換的消息或共同興趣的數量等。

流網路描述了某物(人,資訊,流體等)從一個地方到另一個地方的流動情況。 邊權重可能表示容量(兩個節點之間可以傳輸的最大數量)或通過/穿越連接的實際數量。

在相似性網路中,連接的描述更少,更抽象。 邊權重對應於兩個節點的相似程度,通常不為0。 例如,可以通過拍攝前10名最喜歡的在線貓影片並使用對兩個人都顯示的影片比例來計算不同人之間的一種相似性。 在這種情況下,邊權重與兩個人是否有任何關係無關。 連接兩個甚至從未見過的人,很有可能會獲得很高的權重!

邊也可以表示距離(或接近度),尤其是當節點表示空間位置時。 使用邊權重表示距離時,可以通過將沿路徑的所有邊權重相加來計算整個行程的距離。 使用邊權重表示距離有時可能會造成混淆,因為數量較大意味著連接較弱,並且不存在的邊實際上是權重無限的邊。 有時,使用接近度(例如距離的倒數)可能更直觀,儘管這會使跨許多邊的路徑的工作變得複雜。 前面的示例涵蓋了網路的許多常見應用,但絕不是全部。 每當一組事物之間可以具有任何類型的關係或連接時,就有可能使用網路捕獲這些連接的結構。下面是一些程式碼示例,感覺還是直接上程式碼有用啊:(這些程式碼上github都有的)





無向圖:
# Configure plotting in Jupyter
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams.update({
'figure.figsize': (7.5, 7.5),
'axes.spines.right': False,
'axes.spines.left': False,
'axes.spines.top': False,
'axes.spines.bottom': False})
# Seed random number generator
import random
from numpy import random as nprand
seed = hash("Network Science in Python") % 2**32
nprand.seed(seed)
random.seed(seed)
# Import networkx
import networkx as nx
G = nx.karate_club_graph()
karate_pos = nx.spring_layout(G, k=0.7)
plt.figure(figsize=(15,15))
nx.draw_networkx(G, karate_pos)

G = nx.karate_club_graph()
karate_pos = nx.spring_layout(G, k=0.3)
plt.figure(figsize=(15,15))
nx.draw_networkx(G, karate_pos)




分別得到關於無向graph的nodes、edges和領結矩陣adj的資訊,networkx內部使用的是python的dict來實現圖數據結構的,官網稱之為dict-of-dict-of-dict。




對字典熟悉的人來說,使用networkx的這種圖數據的構成機制會比較得心應手,像呼吸一樣自然。



有向圖:


有向圖增加了兩個額外的方法,successors表示A節點指向的其它節點,predecessors表示指向A節點的其它節點。
除此之外還有多邊圖,即node之間的邊不止一條:
# The seven bridges of Königsberg
G = nx.MultiGraph()
G.add_edges_from([
("North Bank", "Kneiphof", {"bridge": "Krämerbrücke"}),
("North Bank", "Kneiphof", {"bridge": "Schmiedebrücke"}),
("North Bank", "Lomse", {"bridge": "Holzbrücke"}),
("Lomse", "Kneiphof", {"bridge": "Dombrücke"}),
("South Bank", "Kneiphof", {"bridge": "Grüne Brücke"}),
("South Bank", "Kneiphof", {"bridge": "Köttelbrücke"}),
("South Bank", "Lomse", {"bridge": "Hohe Brücke"})
])

關於有向和無向的原始數據的形式應該如何存放後面會提到,其實是一樣的,非常簡單,並且非常容易結合到pandas和numpy中。
節點和邊的屬性,通過graph[node_name/edge_name]就可以賦值了,用起來賊簡單,賦值也是以字典的形式,比如graph[1]={‘color’:’red’}意為為節點1賦予一個color的attribute,值為『red』,如果是邊則需要指定兩個節點,比如節點1和節點2之間的邊,則:graph[1,2,’color’]=’red’
下面介紹比較重要的,表格形式數據如何load 進networkx中:

這裡的example文件實際上就是一個普通的表格文件,其內部結構如下:

實際上就是一個普通的表格數據,左右兩列分別是有連接的節點,顯然,這種簡單的數據形式只能表示最簡單的無向無權圖。實際上通過pandas的dataframe我們也可以方便的轉化為圖數據的形式,具體的做法如下:

首先原始數據文件保存為標準的csv形式,否則pandas讀取的時候會把原始的注釋數據都載入進來;然後正常讀取即可
path='example_pd.edgelist'
dataframe=pd.read_csv(path,sep=' ',header=None)
dataframe

然後我們通過:

將dataframe轉換為圖數據的形式:
# Read edge list
G = nx.from_pandas_edgelist(
dataframe,source='source',target='target',edge_attr=None,
create_using=nx.Graph)
# Draw network
nx.draw_networkx(G, pos, arrowsize=20)
plt.gca().margins(0.15, 0.15)
官網上也給了一個非常簡單易懂的例子:

實際上這是非常靈活的,我們需要指定dataframe中的兩列為相互存在連接關係的節點,一列用於指定節點之間的邊的權重,其它的列可以用作屬性列也可以不用,這樣我們可以通過dataframe非常方便迅速的構建起用於圖演算法的圖數據形式。這種方式用於構建有向圖是很方便的,默認左邊是源節點右邊是目標節點,即方向是按照左到右的順序排列的,我們在參數source和target中更換列名即可,如果是無向圖更簡單,都不用care source和target的順序。
如果是有權圖,則原始數據需要是這種形式的:

同樣,按照dataframe的方式很好構建出來,這裡就不廢話了。主要麻煩的地方在於如何構建起這種形式的dataframe,其實也不複雜,我們通過join的功能就可以很easy的構建出這種形式的數據了,當然,對於中小型數據來說,這種方式是可行的,對於大型的數據來說,還是用圖資料庫更加高效一些。
除此之外,還可以通過領接矩陣的方式來構建圖:


除了pandas之外,networkx還支援以不同的數據形式導入圖的數據,包括:




具體的官方文檔已經給了非常容易上手的解釋了:
Converting to and from other data formats
這裡不贅述了;
數據格式轉換的問題處理完畢了,接下來就是一些basic的圖演算法的應用了,根據api來調用,非常簡單,如果networkx底層的性能做優化就太好了;
考慮到還有不少圖演算法沒有研究透徹,所以打算後面單獨總結一下,以networkx的內置圖演算法為主。igraph和graphx後面慢慢整進來吧,graphx+neo4j的模式學起來還得多費點時間真是煩死了