实验数据集:
如下图所示:
import numpy as np
# M表示转移矩阵 x0表示初始向量 d表示阻尼因子一般取0.85,epsilon表示误差,n表示结点的个数,N表示迭代次数(默认为500)
def pagerank(M, x0, epsilon, n, N=500, d=0.85):
i, num = 1, 0
x = np.empty([n, 0])
x = np.append(x, x0, axis=1)
A = d * M + (1 - d) / n * np.ones((n, n))
y = np.empty([n, 0])
while num < N:
y = np.append(y, np.dot(A, np.array(x[:, i - 1]).reshape(-1, 1)), axis=1)
x = np.append(x, np.array(y[:, i - 1]).reshape(-1, 1) / np.linalg.norm(y[:, i - 1], ord=np.inf), axis=1)
if np.linalg.norm(np.array(x[:, i]).reshape(-1, 1) - np.array(x[:, i - 1]).reshape(-1, 1)) < epsilon:
R = np.array(x[:, i]).reshape(-1, 1)
# 对R进行规范化,使其表示为概率分布
R = R / np.linalg.norm(R, ord=1)
print("每个点的PR值为:")
print(R)
break
else:
num = num + 1
i = i + 1
M = np.array([[0, 1/2, 1,0],
[1 / 3, 0, 0,1/2],
[1 / 3, 0, 0,1/2],
[1/3,1/2,0,0]])
x0 = np.array([[1],
[1],
[1],
[1]])
n = len(M)
epsilon = 1e-6
pagerank(M, x0, epsilon, n)