16

Networkxの3つの異なるページランク関数の精度の違いを知っている人はいますか?

1000ノードと139732エッジのグラフがありますが、「プレーン」pagerank関数はまったく機能していないようです。2つを除くすべてのノードが同じPGを持っていたため、この関数は完全には機能しないと思います。大きなグラフの場合も同様ですか?

pagerank_numpyの値も、の値よりも少し広がっているように見えましたpagerank_scipy。この関数のドキュメントには、「これは小さなグラフで最も速く、最も正確になる」と書かれています。「小さな」グラフとはどういう意味ですか?

また、pagerank_numpyが引数を許可max_iterしないのはなぜですか?tol

4

1 に答える 1

30

3つの関数はそれぞれ、同じ問題を解決するために異なるアプローチを使用します。

networkx.pagerank()は、最大の固有値/固有ベクトルまたはGoogle行列を計算するためのべき乗法の純粋なPython実装です。精度を制御する2つのパラメータがあります-tolmax_iter

networkx.pagerank_scipy()べき乗法のSciPyスパース行列実装です。同じ2つの精度パラメータがあります。

networkx.pagerank_numpy()numpy.linalg.eig()は、最大の固有値と固有ベクトルを計算する関数を呼び出すNumPy(完全)行列の実装です。この関数は、調整可能なパラメーターを使用せずに行列分解(直接)法を使用するLAPACKdgeev関数へのインターフェースです。

tolパラメーターが十分に小さく、パラメーターが十分に大きい場合、3つすべてが、正常に動作するグラフに対して同じ答えを(数値の四捨五入内で)生成する必要があり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
于 2012-10-24T00:06:46.997 に答える