PageRank算法原理以及Python实现

版权声明:博主Github链接:https://github.com/geeklili , 本篇文章链接: https://blog.csdn.net/weixin_42057852/article/details/81502727
pagerank算法我相信大家都不陌生,即使你陌生,也没关系,看了这篇文章,你就不陌生了,如果你还陌生,那,,,二营长,二营长!

1. 矩阵构造

PageRank本为解决网页和网页之间的关系,计算__网页重要性__而提出的一种算法.PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重要性进行排序。
它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟后,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去,PageRank就是估计这个悠闲的上网者分布在各个网页上的概率。

假设 A 网页有到B网页的连接,B 网页有到C网页的连接,C网页有到A网页的连接,表示成 A --> B–> C–> A的有向边,如图:
A->B->C->A

表示成矩阵M如下:
A->B->C->A矩阵表示
假设A网页还有到C 网页的出链,那么有 1/2 的概率会到C网页,1/2 的概率到B 网页,则矩阵M变成了:
A->B->C->A,A->C矩阵
M的第一行代表 A , B,C 网页出链到 A网页的概率,第二行代表 A,B,C网页出链到 B 网页的概率,第三行代表 A,B,C网页出链到 C 网页的概率,我们从矩阵可以发现,矩阵的列的概率和为1,只要保证这点,则后期PageRank迭代的时候Un就可以收敛。

2. 初始pr值矩阵构造

设定网页A,B,C 的初始pr值为 1/N = 1/3 ,[pr值:PageRank值]
即 U = [1/3,1/3,1/3] 的转置矩阵,分别表示 A,B,C 的初始pr值
进行迭代计算 U1 = M * U = [1/3,1/3,1/3] 还是A,B ,C网页的pr值都是 1/3
然后继续 Un = M * Un-1 ,直到收敛,可以看到,由于这个例子比较特殊,其实 U = **[1/3,1/3,1/3]**就是收敛值,因为这个例子A,B,C网页组成了一个循环有向图,所以权重都是 1/3。

以上是PageRank的基本思想,接下来我们考虑一般化,假设C网页仅仅存在到自己本身的出链, 那么M为::
这里写图片描述
那么可以证明,矩阵Un收敛于: [0,0,1] 也就是其他网页 AB 都会在迭代中pr值变成 0 ,这明显有点不合理,因为如果C网页仅存在自身的出链的时候,没有人会傻到一直点击到 C网页的循环链接。因此对上面的迭代算法进行改进,引入了阻尼系数α,通常α = 0.85 。

于是一般化公式变为:

Un = α (M * Un-1) + (1-α)U0

**U0**就是: **[1/N,1/N…1/N]**的初始pr值矩阵
将阻尼系数引入后,**Un**收敛值于: [0.05,0.0925,0.8575]

3. 代码如下

import numpy as np

M = [[0, 0, 0],
     [1, 0, 0],
     [0, 1, 1]]
U = [1 / 3, 1 / 3, 1 / 3]

U0 = np.array(U)

print('The alpha parameter is not used in the formula...')
U_past_none_alpha = []
while True:
    U = np.dot(M, U)
    # print('Un: ', U)
    if str(U) == str(U_past_none_alpha):
        break
    U_past_none_alpha = U
print('Un converge to: ', U)

print('The alpha parameter is used in the formula, and the value of alpha is 0.85...')
U_past_has_alpha = []
while True:
    U = 0.85 * (np.dot(M, U)) + 0.15 * U0
    # print('Un: ', U)
    if str(U) == str(U_past_has_alpha):
        break
    U_past_has_alpha = U
print('Un converge to: ', U)

猜你喜欢

转载自blog.csdn.net/weixin_42057852/article/details/81502727