Networkx: Различия между pagerank, pagerank_numpy и pagerank_scipy?

Кто-нибудь знает о различиях в точности между тремя различными функциями pagerank в Networkx?

У меня есть граф из 1000 узлов и 139732 ребра, а функция "plain" pagerank, похоже, не работает вообще - все, кроме двух узлов, имеют один и тот же PG, поэтому я предполагаю, что это функция не работает так же хорошо для больших графов?

Значения

pagerank_numpy также немного отличались от значений pagerank_scipy. В документации для этой функции говорится, что "это будет самым быстрым и точным для небольших графиков". Что подразумевается под "маленькими" графами?

Кроме того, почему pagerank_numpy не разрешает аргументы max_iter и tol?

Ответ 1

Каждая из трех функций использует другой подход к решению одной и той же проблемы:

networkx.pagerank() - это реализация синтаксического метода pure-Python для вычисления самого большого собственного/собственного вектора или матрицы Google. Он имеет два параметра, которые контролируют точность - 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