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确实有些令人失望,速度在复杂网络中成为一个比较致命的缺陷。

源代码:

传送门

大家共勉~~

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