Here is the code:
import networkx, numpy.matlib, numpy.linalg
nodes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
edges = [(1, 3, 1), (1, 9, 1), (2, 9, 1), (2, 10, 1), (3, 7, 1), (3, 9, 1), (4, 2, 1), (4, 8, 1), (4, 10, 1), (5, 6, 1), (5, 8, 1), (6, 1, 1), (6, 5, 1), (6, 8, 1), (6, 10, 1), (7, 1, 1), (7, 9, 1), (8, 5, 1), (8, 6, 1), (8, 7, 1), (9, 4, 1), (9, 8, 1), (10, 7, 1)]
DG = networkx.DiGraph()
DG.add_weighted_edges_from(edges)
pr = networkx.pagerank(DG)
for n in nodes:
print(n, pr[n])
A = networkx.adjacency_matrix(DG, nodes).todense()
stochasticA = A / A.sum(axis = 0)
d = 0.85
epsilon = 1e-6
M = d * stochasticA + (1 - d) / len(nodes)
old_page_rank_vector = numpy.matlib.ones((len(nodes), 1)) / len(nodes)
new_page_rank_vector = M * old_page_rank_vector
while (numpy.linalg.norm(old_page_rank_vector - new_page_rank_vector) > epsilon):
old_page_rank_vector = new_page_rank_vector
new_page_rank_vector = M * old_page_rank_vector
page_rank_vector = new_page_rank_vector/sum(new_page_rank_vector)
print(page_rank_vector)
As one can see after running this, the networkx implementation gives different result from what my code calculates.
Can someone help with finding my mistake(s)?
Thank you!
Changing A = networkx.adjacency_matrix(DG, nodes).todense()
to A = numpy.transpose(networkx.adjacency_matrix(DG, nodes).todense())
works.
I managed to misunderstand something and, well, not to transpose matrix.