PageRank算法是随机游走问题,是一道求解线性方程组问题。
它的输入是:一个邻接矩阵,每行的和为1,a[i][j]表示第i个元素去往第j个元素的概率。
它的输出是:一个分值list,第i个分值表示第i个元素的得分
PageRank实际上提供了一种排序方法,可以根据元素共现矩阵来决定每个元素的分值。这种方法像贝叶斯公式一样具有普遍意义。
- 网页之间的链接构成邻接矩阵
- 在文本中词和词在同一个句子中出现形成共现矩阵
PageRank有两种解法:
- 求解线性方程组:准确解法
- 迭代解法:适合于稀疏矩阵
import numpy as np
def iterate_method(a):
score = np.ones((2, len(a))) / len(a)
while 1:
score[1] = np.matmul(a, score[0])
score[1] /= np.sum(score[1])
eps = np.sum(np.abs(score[0] - score[1]))
score[0] = score[1] / np.sum(score[1])
if eps < 1e-5:
break
return score[0]
def linear_equation(a):
A = a.copy()
A -= np.eye(len(A))
A[-1] = np.ones(len(A))
b = np.zeros(len(A))
b[-1] = 1
x = np.linalg.solve(A, b)
return x
def main():
a = np.random.random((10, 10))
a /= np.sum(a, axis=1) # 每个结点去往其它结点的概率之和应该为1
score1 = linear_equation(a)
score2 = iterate_method(a)
print(score1)
print(score2)
print(np.argsort(score1))
print(np.argsort(score2))
main()