PageRank算法是随机游走问题,是一道求解线性方程组问题。
它的输入是:一个邻接矩阵,每行的和为1,a[i][j]表示第i个元素去往第j个元素的概率。
它的输出是:一个分值list,第i个分值表示第i个元素的得分
PageRank实际上提供了一种排序方法,可以根据元素共现矩阵来决定每个元素的分值。这种方法像贝叶斯公式一样具有普遍意义。
- 网页之间的链接构成邻接矩阵
- 在文本中词和词在同一个句子中出现形成共现矩阵
PageRank有两种解法:
- 求解线性方程组:准确解法
- 迭代解法:适合于稀疏矩阵
import numpy as npdef 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 xdef 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()