PersonRank的原理同PageRank与TextRank算法,其基本原理都是基于随机游走而来。
要想从深层次的理解PersonRank这类算法,必须从微观上观察数据的具体流向过程,所以这次就把随机游走前两步的过程描述出来,在心里有个大概的印象。
1. 随机游走
下图描述的是三个用户与四件商品之间的关系,连线表示购买记录,所以边不设置权重,由图可以看出
A 购买过: a、c
B 购买过: a、b、c、d
C 购买过: c、d
由于A没有直接的连线和其他的商品进行联系,我们又想给A推荐商品,所以,可以从商品出发,经过其他的用户,通往其他的商品。
现在我们要为A推荐商品,实际上就是计算A对所有商品的感兴趣程度,由于在PersonRank算法中不区分用户节点和商品节点,这样一来问题就转化成:对节点A来说,节点的重要度各是多少?也就是计算各个节点的值是多少?
由于随机游走需要指定一个起点,从该起点开始游走,给A推荐商品,则从A开始游走,假设初始赋予 ,其余各节点的值为0。【注:一般PageRank里假设每个节点的初始值是一样的,其和为1】另外,在图上游走。每次都是从不为的节点开始游走,往前走一步。继续游走的概率是α,停留在当前节点的概率是1−α。
此处的α其实就是前面Pagerank里面提到的阻尼系数,为了便于理解与计算,假设为0.5,则:
第一次游走, 从A节点出发,走一步。
从节点出发的概率为,则到的概率为,则到c的概率为,这样a和c就分得了A的部分值。此时值变为:
PR(A) = 0.5
PR(a) = 0.25
PR(c) = 0.25
第二次游走,分别从节点开始,再往前走一步。
首先计算每个节点剩余的值:
PR(A)剩余 = PR(A)发出 = 0.5 × 0.5 = 0.25
PR(a)剩余 = PR(a)发出 = 0.25 × 0.5 = 0.125
PR(c)剩余 = PR(c)发出 = 0.25 × 0.5 = 0.125
再计算每个节点得到的新的值:
PR(A)得到 = 1/3 × PR(c)发出 + 1/2 × PR(a)发出 = 0.0417 + 0.0625 = 0.104
PR(B)得到 = 1/2 × PR(a)发出 + 1/3 × PR(c)发出 = 0.0625 + 0.0417 = 0.104
PR(C)得到 = 1/3 × PR(c)发出 = 0.0417
PR(a)得到 = 1/2 × PR(A)发出 = 0.125
PR(c)得到 = 1/2 × PR(A)发出 = 0.125
每个点最新的值为:
PR(A) = 0.25 + 0.104 = 0.354
PR(B) = 0.104
PR(C) = 0.0417
PR(a) = 0.125 + 0.125 = 0.25
PR(c) = 0.125 + 0.125 = 0.25
2. PersonRank公式
从以上两个步骤,我们可以从微观上感受到了随机游走的实际意义,这也是PersonRank算法的计算过程。
其实,从数学的角度来说,每一次的游走都是进行了一次矩阵的运算,初始的PR值向量,经过多次与转移概率矩阵M相乘,就会使得PR值向量趋于稳定,其公式可以表示为:
由于这个过程会使得起点的值无法始终维持最大,所以,对式子进行了变化,如下
U0 = [1/n,1/n,… 1/n]
其中为初始的值向量,本例子中为[1, 0, 0, 0, 0, 0, 0]
通过观察以上的公式,假如趋于稳定的时候,应该等于,所以令,则:
所以:
所以:
所以:
所以可以一步求出
3. 具体实现
本例子中:
为:
[1, 0, 0, 0, 0, 0, 0]
为:
[[0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ],
[0. , 0. , 0. , 0.25 , 0.25 , 0.25 , 0.25 ],
[0. , 0. , 0. , 0. , 0. , 0.5 , 0.5 ],
[0.5 , 0.5 , 0. , 0. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. , 0. , 0. , 0. ],
[0.33 , 0.33 , 0.33 , 0. , 0. , 0. , 0. ],
[0. , 0.5 , 0.5 , 0. , 0. , 0. , 0. ] ]
具体计算过程参考以下代码:
Github链接
另外:
SimRank可以参考这位博主的:https://www.cnblogs.com/zhangchaoyang/articles/4575809.html