【自然语言处理】PageRank算法原理●Python实现

pagerank算法我相信大家都不陌生,即使你陌生,也没关系,看了这篇文章,你就不陌生了,如果你还陌生,那,,,二营长,二营长!

1. 矩阵构造

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

假设 A 网页有到B网页的连接,B 网页有到C网页的连接,C网页有到A网页的连接,表示成 A --> B–> C–> A的有向边,如图:
在这里插入图片描述

表示成邻接矩阵如下:

[ a 11 a 12 a 13 a 21 a 21 a 23 a 31 a 32 a 33 ] \left[ \begin{array}{ccc} a_{11} & a_{12} & a_{13}\\ a_{21}& a_{21} & a_{23}\\ a_{31} & a_{32} & a_{33} \end{array} \right] a11a21a31a12a21a32a13a23a33

邻接矩阵和转移概率矩阵M一样

[ 0 1 0 0 0 1 1 0 0 ] \left[ \begin{array}{ccc} 0 & 1 & 0\\ 0& 0 & 1\\ 1 & 0 & 0 \end{array} \right] 001100010

假设A网页还有到C 网页的出链,那么有 1/2 的概率会到C网页,1/2 的概率到B 网页,则邻接矩阵【按列进行归一化后】M变成了转移概率矩阵:
在这里插入图片描述
邻接矩阵

[ 0 1 1 0 0 1 1 0 0 ] \left[ \begin{array}{ccc} 0 & 1 & 1\\ 0& 0 & 1\\ 1 & 0 & 0 \end{array} \right] 001100110

转移概率矩阵

[ 0 0.5 0.5 0 0 1 1 0 0 ] \left[ \begin{array}{ccc} 0 & 0.5 & 0.5\\ 0& 0 & 1\\ 1 & 0 & 0 \end{array} \right] 0010.5000.510

M的第一行代表 A 网页出链到 A , B,C网页的概率,第二行代表 B网页出链到 A , B,C 网页的概率,第三行代表 C网页出链到 A , B,C 网页的概率,我们从邻接矩阵可以发现,转移概率矩阵的行的概率和为1【按列归一化的结果】,只要保证这点,则后期PageRank迭代的时候Un就可以收敛。

假如某个节点不存在外链,也就是说邻接矩阵的某一列出链到其他的概率都为0,这样就造成邻接矩阵的某一列都为0,这样就会造成迭代的时候,U的元素都会变成0。

2. 初始pr值矩阵构造

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

以上是PageRank的基本思想,接下来我们考虑一般化,假设C网页仅仅存在到自己本身的出链, 那么M为:

[ 0 1 0 0 0 1 0 0 1 ] \left[ \begin{array}{ccc} 0 & 1 & 0\\ 0& 0 & 1\\ 0 & 0 & 1 \end{array} \right] 000100011

那么可以证明,矩阵Un收敛于: [0,0,1] 也就是其他网页 AB 都会在迭代中pr值变成 0 ,这明显有点不合理,因为如果C网页仅存在自身的出链的时候,没有人会傻到一直点击到 C网页的循环链接。因此对上面的迭代算法进行改进,引入了阻尼系数α,通常α = 0.85 。

  • 具体原理剖析:
    在实际应用中,为了有效避免上述两个问题,会使用到一个小技巧,就是假设每个节点都有一个假想的外链指向其它任一节点,这样整个图就变成了一个强连通图了。当然,为了尽量不影响最终计算的PageRank值,节点通过假想外链传递的PageRank值会乘一个权重因子 β 【 β = 1 − α 】 β【β=1-α】 ββ=1α β β β一般取0.2或者更小。

于是一般化公式变为:

U n = α M T U n − 1 + ( 1 − α ) U 0 U_n = \alpha M^T U_{n-1} + (1-\alpha)U_0 Un=αMTUn1+(1α)U0

或:

U n = ( 1 − β ) M T U n − 1 + β U 0 U_n =(1-\beta)M^TU_{n-1} + \beta U_0 Un=(1β)MTUn1+βU0

U 0 U_0 U0就是: [ 1 N , 1 N , . . . , 1 N ] [\frac{1}{N},\frac{1}{N},...,\frac{1}{N}] [N1,N1,...,N1]的初始pr值矩阵
将阻尼系数引入后, U n U_n Un收敛值于: [ 0.05 , 0.0925 , 0.8575 ] [0.05,0.0925,0.8575] [0.050.09250.8575]

3. 代码地址

Github链接地址
https://github.com/geeklili/PageRank_Algorithm

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值