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