Networkx:pagerank,pagerank_numpy和pagerank_scipy之间的区别?

wro*_*ame 13 python numpy pagerank scipy networkx

有谁知道Networkx中三种不同的pagerank功能之间的准确性差异?

我有一个1000个节点和139732个边缘的图形,"普通" pagerank函数似乎根本不起作用 - 除了两个节点之外都有相同的PG,所以我假设这个函数不起作用以及大型图表?

pagerank_numpy价值观似乎也比pagerank_scipy价值观更加分散.该函数的文档说"这对于小图表来说是最快和最准确的".什么是"小"图?

另外,为什么pagerank_numpy不允许max_itertol参数?

Ari*_*ric 24

这三个函数中的每一个都使用不同的方法来解决相同的问题:

networkx.pagerank()是用于计算最大特征值/特征向量或Google矩阵的幂方法的纯Python实现.它有两个控制精度的参数 - tolmax_iter.

networkx.pagerank_scipy()是功率方法的SciPy稀疏矩阵实现.它具有相同的两个精度参数.

networkx.pagerank_numpy()是一个NumPy(完整)矩阵实现,它调用numpy.linalg.eig()函数来计算最大特征值和特征向量.该函数是LAPACK dgeev函数的接口,该函数使用矩阵分解(直接)方法,没有可调参数.

如果tol参数足够小且max_iter参数足够大,那么对于表现良好的图,所有三个应该产生相同的答案(在数值舍入内).哪一个更快取决于图表的大小以及电源方法在图表上的效果.

In [12]: import networkx as nx

In [13]: G=nx.gnp_random_graph(1000,0.01,directed=True)

In [14]: %timeit nx.pagerank(G,tol=1e-10)
10 loops, best of 3: 157 ms per loop

In [15]: %timeit nx.pagerank_scipy(G,tol=1e-10)
100 loops, best of 3: 14 ms per loop

In [16]: %timeit nx.pagerank(G)
10 loops, best of 3: 137 ms per loop
Run Code Online (Sandbox Code Playgroud)

  • 计算pagerank_numpy()(LAPACK的dgeev)中的特征值的算法执行固定数量的操作,这些操作仅取决于矩阵大小.我认为它应该大致为n ^ 3,其中n是节点数.请参阅http://stackoverflow.com/questions/713878/how-expensive-is-it-to-compute-the-eigenvalues-of-a-matrix,以便在PageRank的上下文中对此进行更长时间的讨论. (2认同)