有人知道Networkx中三种不同的pagerank功能之间的准确性差异吗?
我有一个1000个节点和139732个边缘的图形,“普通”pagerank
函数似乎根本不起作用 - 除了两个节点之外都有相同的PG,所以我是假设这个函数对大图不起作用吗?
pagerank_numpy
的值似乎比pagerank_scipy
的值更加分散。该函数的文档说“这对于小图表来说是最快和最准确的”。什么是“小”图?
另外,为什么pagerank_numpy不允许max_iter
和tol
参数?
答案 0 :(得分:23)
这三个函数中的每一个都使用不同的方法来解决同一个问题:
networkx.pagerank()
是用于计算最大特征值/特征向量或Google矩阵的幂方法的纯Python实现。它有两个控制准确度的参数 - tol
和max_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