其他影響力最大化文章:
影響力最大化 IC模型+貪心算法
影響力最大化 模擬爆發(粗糙筆記)
影響力最大化 IC 蒙特卡洛模擬 貪心算法
影響力最大化 IMRank 我心中的最優算法
影響力最大化 CELF 成本效益延遲轉發算法
簡介
對於網絡的計算,networkx、igraph-python這兩種工具包相信是大家的首選,當然了還有鄰接矩陣Adjacency matrix或者dict建立網絡這種方法。
所以我將首先介紹對於網絡的生成方面,networkx,igraph,鄰接矩陣和dict這四種方法的相互轉化。然後我們比較一下networkx和igraph這兩者效率高低。
最後我們比較對於複雜網絡的計算方面,networkx、igraph、鄰接矩陣、dict四種方法哪種最快時間效率最高。
網絡生成方法
其實我們最常用的就是鄰接矩陣和edgelist存儲,那麼下面具體應用。
我們現在有這樣一個臨界矩陣graph:
展示一下數據:
200*200
igraph
- 讀寫鄰接矩陣
data = np.loadtxt('data/graph.txt', dtype=np.float32)
matrix = pd.DataFrame(data)
m = matrix.values
g1 = Graph.Adjacency((matrix.values > 0).tolist())
g1.es['weight'] = m[m.nonzero()]
plot(g1)
畫的糙,感受一些就得了,懶得修了。
寫鄰接矩陣就很簡單了:
g1.write_adjacency('data/graph_adjacency.txt')
- 讀寫edgelist
雖然igraph也有write_edgelist,但是我比較喜歡使用pajek格式
在我看來也是edgelist:
g1.write_pajek('data/graph_pajek.net')
igraph轉networkx
import networkx
g1 = graph.get_edgelist()
g2 = networkx.DiGraph(g1) # In case your graph is directed
g2 = networkx.Graph(g1) # In case you graph is undirected
igraph networkx運算效率
NetworkX和igraph是做網絡分析非常常用的兩個包,且兩者皆可在Python中運行。兩者的功能也大體類似。但就效率而言,後者要比前者高出很多。原因在於:NetworkX is a pure-python implementation, whereas igraph is implemented in C.因此,如果是做大型網絡的需要注意了,趕緊從NetworkX跳到igraph來,你不會後悔的。
這裏有一張對比圖,是國外的網友做的,這裏引用知乎:
可以看到igraph比networkx快的不是一點半點。
傳播模型方法效率比較
Python中有很多不同的方法可以做,但是,爲給定任務選擇哪個包更容易/更快/更好可能會造成混淆,因此偶爾比較給定流行任務的替代方法可能很有用。在本文中,我將使用四種不同的網絡實現來模擬獨立的級聯(IC)模型。我首先使用兩種igraph和NetworkX進行嘗試,然後使用兩種raw方法將網絡表示爲簡單的Python字典或Pandas數據框。所有方法都產生相同的傳播過程,並且易於編碼,但是它們的速度可能不同。
引入包
%matplotlib inline
import matplotlib.pyplot as plt
from igraph import *
import networkx as nx
from random import uniform, seed
import numpy as np
import pandas as pd
import time
IC模型中我們定義不同的尋找鄰居節點的方法:
具體的函數實現,這裏只舉一個例子,完整代碼我放在最下面:
def propagate_ig(g,p,new_active):
targets = []
for node in new_active:
targets += g.neighbors(node,mode="out")
return(targets)
生成graph數據:
現在,我們嘗試我們的每個函數,並確認對於任意選擇的種子集S而言,所得級聯是否相同。
結果如下:應該是完全相同的,這說明我們的代碼是沒有問題的。
逐漸增加網絡的規模,也就是節點數,然後來比較每種實現方法的時間:
最終我們運行,並且記錄時間,畫出折線圖:
原生方法dict是最快的,其次是igraph,看來c的底層實現確實是igraph的一大優勢。networkx確實有些令人失望,速度在複雜網絡中成爲一個比較致命的缺陷。
源代碼:
大家共勉~~