Memory efficient PageRank using scipy.sparse This function implements Algo 1. in "A Survey on PageRank Computing"
(G, alpha=0.85, epsilon=1e-5, max_iters=300)
| 4 | |
| 5 | |
| 6 | def pagerank(G, alpha=0.85, epsilon=1e-5, max_iters=300): |
| 7 | """Memory efficient PageRank using scipy.sparse |
| 8 | This function implements Algo 1. in "A Survey on PageRank Computing" |
| 9 | """ |
| 10 | ni = {} |
| 11 | for i, u in enumerate(G): |
| 12 | ni[u] = i |
| 13 | |
| 14 | num_nodes = len(G.nodes()) |
| 15 | |
| 16 | row, col, data = [], [], [] |
| 17 | for u in G: |
| 18 | num_out_edges = len(G[u]) |
| 19 | if num_out_edges > 0: |
| 20 | w = 1 / num_out_edges |
| 21 | for v in G[u]: |
| 22 | row.append(ni[v]) |
| 23 | col.append(ni[u]) |
| 24 | data.append(w) |
| 25 | |
| 26 | P = coo_matrix((data, (row, col)), shape=(num_nodes, num_nodes)).tocsr() |
| 27 | p = np.ones(num_nodes) / num_nodes |
| 28 | v = np.ones(num_nodes) / num_nodes |
| 29 | |
| 30 | for i in range(max_iters): |
| 31 | new_v = alpha * P.dot(v) |
| 32 | gamma = LA.norm(v, 1) - LA.norm(new_v, 1) |
| 33 | new_v += gamma * p |
| 34 | delta = LA.norm(new_v - v, 1) |
| 35 | if delta < epsilon: |
| 36 | break |
| 37 | v = new_v |
| 38 | |
| 39 | pr = {} |
| 40 | for u in G: |
| 41 | pr[u] = v[ni[u]] |
| 42 | |
| 43 | return pr |