networkx igraph相互轉換+效率比較


其他影響力最大化文章:
影響力最大化 IC模型+貪心算法
影響力最大化 模擬爆發(粗糙筆記)
影響力最大化 IC 蒙特卡洛模擬 貪心算法
影響力最大化 IMRank 我心中的最優算法
影響力最大化 CELF 成本效益延遲轉發算法

簡介

對於網絡的計算,networkx、igraph-python這兩種工具包相信是大家的首選,當然了還有鄰接矩陣Adjacency matrix或者dict建立網絡這種方法。

所以我將首先介紹對於網絡的生成方面,networkx,igraph,鄰接矩陣和dict這四種方法的相互轉化。然後我們比較一下networkx和igraph這兩者效率高低。

最後我們比較對於複雜網絡的計算方面,networkx、igraph、鄰接矩陣、dict四種方法哪種最快時間效率最高。

網絡生成方法

其實我們最常用的就是鄰接矩陣和edgelist存儲,那麼下面具體應用。
我們現在有這樣一個臨界矩陣graph:

展示一下數據:
200*200
在這裏插入圖片描述

igraph

  1. 讀寫鄰接矩陣
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')
  1. 讀寫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確實有些令人失望,速度在複雜網絡中成爲一個比較致命的缺陷。

源代碼:

傳送門

大家共勉~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章