PageRank算法
- PageRank算法是一种计算页面排名的算法,其基本假设为:如果一个页面被更多的链接指向,则它的重要程度越高。
- PageRank算法将页面抽象为图上的一个个结点,每个结点具有其入度和出度。
- 算法流程如下:
- 建图:此处只需存储子节点到父节点的映射以及每个结点的出度。
- 计算转移矩阵: 矩阵定义为 M i j = 从第 j 个结点进入第 i 个结点的概率 = 1 第 j 个结点的出度 矩阵定义为M_{ij}=从第j个结点进入第i个结点的概率=\frac{1}{第j个结点的出度} 矩阵定义为Mij=从第j个结点进入第i个结点的概率=第j个结点的出度1
- 计算Pr向量:
P
r
i
=
第
i
个结点的
P
a
g
e
R
a
n
k
值,初始化为
1
网页总数
Pr_i=第i个结点的PageRank值,初始化为\frac{1}{网页总数}
Pri=第i个结点的PageRank值,初始化为网页总数1
P r = [ x 1 , x 2 , . . . , x n ] T Pr=[x_1,x_2,...,x_n]^T Pr=[x1,x2,...,xn]T - 迭代计算
P
a
g
e
R
a
n
k
PageRank
PageRank值,设随机跳转因子为
d
e
l
t
a
delta
delta,
M
∗
P
r
M*Pr
M∗Pr代表转移矩阵
M
M
M左乘
P
r
Pr
Pr向量:
P r n + 1 ( i ) = 1 − d e l t a 网页总数 + d e l t a ∗ M ∗ P r Pr_{n+1}(i)=\frac{1-delta}{网页总数}+delta*M*Pr Prn+1(i)=网页总数1−delta+delta∗M∗Pr - 经过50-60次迭代后,最终 P r Pr Pr值将会收敛于一个特定的值,最终得到每个页面的PageRank值
代码实现:
import numpy as np
Node_Num=3
dataset = [[0, 1], [0, 2], [1, 2], [2, 0]]
# 出度
d = np.zeros(Node_Num)
# 从子节点映射到父节点
map=[[],[],[]]
def getM():
# 生成3*3的零矩阵
M=np.zeros([Node_Num,Node_Num])
for i in range(Node_Num):
for k in map[i]:
M[i][k]=1/d[k]
return M
def getPr(M,pr,max_iter):
for i in range(max_iter):
for j in range(Node_Num):
pr[j]=0.5/Node_Num+0.5*np.matmul(M[j],pr)
return pr
if __name__ == "__main__":
for data in dataset:
u=data[0];v=data[1]
d[u]+=1
map[v].append(u)
# 计算转移矩阵
M=getM()
# 生成初始pr向量
v=[1/Node_Num for i in range(Node_Num)]
print(getPr(M,v,max_iter=100))