pagerank算法我相信大家都不陌生,即使你陌生,也没关系,看了这篇文章,你就不陌生了,如果你还陌生,那,,,二营长,二营长!
1. 矩阵构造
PageRank
本为解决网页和网页之间的关系,计算__网页重要性__而提出的一种算法.PageRank算法
计算每一个网页的PageRank值
,然后根据这个值的大小对网页的重要性进行排序。
它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟后,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去,PageRank
就是估计这个悠闲的上网者分布在各个网页上的概率。
假设 A 网页有到B网页的连接,B 网页有到C网页的连接,C网页有到A网页的连接,表示成 A --> B–> C–> A的有向边,如图:
表示成邻接矩阵如下:
邻接矩阵和转移概率矩阵M
一样
假设A网页还有到C 网页的出链,那么有 1/2 的概率会到C网页,1/2 的概率到B 网页,则邻接矩阵【按列进行归一化后】M
变成了转移概率矩阵:
邻接矩阵
转移概率矩阵
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值
为 ,[pr值:PageRank值
]
即 的转置矩阵,分别表示 A,B,C
的初始pr值
,
进行迭代计算 还是A,B ,C
网页的pr值
都是
然后继续直到收敛,可以看到,由于这个例子比较特殊,其实 就是收敛值,因为这个例子A,B,C
网页组成了一个循环有向图,所以权重都是 。
以上是PageRank
的基本思想,接下来我们考虑一般化,假设C
网页仅仅存在到自己本身的出链, 那么M
为:
那么可以证明,矩阵Un收敛于: [0,0,1] 也就是其他网页 A
和B
都会在迭代中pr值变成 0 ,这明显有点不合理,因为如果C
网页仅存在自身的出链的时候,没有人会傻到一直点击到 C
网页的循环链接。因此对上面的迭代算法进行改进,引入了阻尼系数α
,通常α
= 0.85 。
- 具体原理剖析:
在实际应用中,为了有效避免上述两个问题,会使用到一个小技巧,就是假设每个节点都有一个假想的外链指向其它任一节点,这样整个图就变成了一个强连通图了。当然,为了尽量不影响最终计算的PageRank值,节点通过假想外链传递的PageRank值会乘一个权重因子,一般取0.2或者更小。
于是一般化公式变为:
或:
就是:的初始pr值矩阵
将阻尼系数引入后,收敛值于:
3. 代码地址
Github链接地址 https://github.com/geeklili/PageRank_Algorithm