pagerank
stochastic_graph
-- とは異なりpagerank_numpy
またはを使用して計算を実行するため、失敗しますpagerank_scipy
。ドキュメントから、stochastic_graph
次が必要です。
NetworkX グラフには、有効なエッジの重みが必要です
この「有効なエッジの重み」ポイント (まったく説明されていませんが、これは間違いだと思います) が問題の原因です。
有向グラフの場合、各ノードの をstochastic_graph
使用してエッジを正規化します。out_degree
再びドキュメントから:
[out] 次数は、ノードに隣接するエッジの重みの合計です。
したがって、ゼロの重みまたは負の重みを持つエッジがある場合、正規化プロセスはZeroDivisionError
. 負の重みが問題になる理由は、負の重みが正の重みを打ち消し、ノードの次数がゼロになる可能性があるためです。たとえば、グラフでは、ノード'2123271'
には重みの合計が になる 2 つのエッジがあり0
ます。
>>> G.edges('2123271', data=True)
[('2123271', '1712899', {'weight': -1L}),
('2123271', '890839', {'weight': 1L})]
グラフ内の負またはゼロのエッジの重みを小さな正のエッジの重みに置き換えると、pagerank
次のように実行できるようになりました。
In [1]: import networkx as nx
In [2]: G = nx.read_graphml("your_graph.graphml")
In [3]: defaultEdgeWeight = 0.01
In [4]: for u, v, d in G.edges(data=True):
if d['weight'] <= 0:
G[u][v]['weight'] = defaultEdgeWeight
In [5]: P = nx.pagerank( G )
もちろん、pagerank
102 回の反復後に収束しませんでしたが、それは別の問題です。