約 100 万のノードと 1,000 万のエッジを含むスパース グラフがあります。各ノードのパーソナライズされたPageRankを計算したいのですが、ノード n でのパーソナライズされた PageRank とは、次のことを意味します。
# x_0 is a column vector of all zeros, except a 1 in the position corresponding to node n
# adjacency_matrix is a matrix with a 1 in position (i, j) if there is an edge from node i to node j
x_1 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_0
x_2 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_1
x_3 = 0.5 * x_0 + 0.5 * adjacency_matrix * x_2
# x_3 now holds the personalized PageRank scores
# i'm basically approximating the personalized PageRank by running this for only 3 iterations
NumPy を使用してこれをコーディングしようとしましたが、実行に時間がかかりすぎました。(ノードごとにパーソナライズされた PageRank を計算するのに約 1 秒)
また、x_0 を行列に変更しようとしましたが (いくつかの異なるノードの列ベクトルを結合することによって)、これもあまり役に立たず、実際には計算にかなりの時間がかかりました。(おそらく、行列がかなり急速に密になり、RAMに収まらなくなったためでしょうか?よくわかりません)
できればPythonで、これを計算する別の提案された方法はありますか? また、PageRank の計算に非マトリックス アプローチを採用することも考えました。これは、一種のランダム ウォークのシミュレーションを 3 回繰り返すことで実現しました (つまり、各ノードをスコア 1 で開始し、このスコアを隣接するノードに伝播するなど)。しかし、これがより速くなるかどうかはわかりません。もしそうなら、なぜですか?