In [1]:
import numpy as np

In [ ]:
def page_rank(A, r, epsilon=1e-10):
    for i in range(1000):
        r_new = A.dot(r)
        if all([e[0] <= epsilon for e in (r - r_new)]): return r_new
        r = r_new
        
    return -1

In [131]:
def prepare_A_r(M, beta):
    n = M.shape[0]
    e = np.ones((n, n)) * (1.0/n)
    A = beta * M + (1 - beta) * e
    r = np.ones((1, 3)).T * (1.0/n)
    
    return A, r

In [132]:
M = np.array([
    [1.0/2, 1.0/2, 0],
    [1.0/2, 0,     0],
    [0,     1.0/2, 1.0],
])
beta = 0.8

In [133]:
page_rank(*prepare_A_r(M, beta))


Out[133]:
array([[ 0.21212121],
       [ 0.15151515],
       [ 0.63636364]])