其他影响力最大化文章:
影响力最大化 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确实有些令人失望,速度在复杂网络中成为一个比较致命的缺陷。
源代码:
大家共勉~~