【推荐算法】PersonRank算法原理●Python实现

PersonRank的原理同PageRank与TextRank算法,其基本原理都是基于随机游走而来。

要想从深层次的理解PersonRank这类算法,必须从微观上观察数据的具体流向过程,所以这次就把随机游走前两步的过程描述出来,在心里有个大概的印象。

1. 随机游走

下图描述的是三个用户ABCA、B、C与四件商品abcda、b、c、d之间的关系,连线表示购买记录,所以边不设置权重,由图可以看出
在这里插入图片描述

A 购买过: a、c
B 购买过: a、b、c、d
C 购买过: c、d

由于A没有直接的连线和其他的商品进行联系,我们又想给A推荐商品,所以,可以从商品出发,经过其他的用户,通往其他的商品。

现在我们要为A推荐商品,实际上就是计算A对所有商品的感兴趣程度,由于在PersonRank算法中不区分用户节点和商品节点,这样一来问题就转化成:对节点A来说,节点ABCabcdA、B、C、a、b、c、d的重要度各是多少?也就是计算各个节点的PRPR值是多少?

由于随机游走需要指定一个起点,从该起点开始游走,给A推荐商品,则从A开始游走,假设初始赋予 PR(A)=1PR(A)=1,其余各节点的PRPR值为0。【注:一般PageRank里假设每个节点的初始值是一样的,其和为1】另外,在图上游走。每次都是从PRPR不为00的节点开始游走,往前走一步。继续游走的概率是α,停留在当前节点的概率是1−α。

此处的α其实就是前面Pagerank里面提到的阻尼系数α\alpha,为了便于理解与计算,假设αα为0.5,则:

第一次游走, 从A节点出发,走一步。

AA节点出发的概率为0.50.5,则到aa的概率为0.5×0.5=0.250.5×0.5=0.25,则到c的概率为0.5×0.5=0.250.5×0.5=0.25,这样a和c就分得了A的部分PRPR值。此时PRPR值变为:

PR(A) = 0.5
PR(a) = 0.25
PR(c) = 0.25

第二次游走,分别从节点AacA、a、 c开始,再往前走一步。

首先计算每个节点剩余的PRPR值:

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

再计算每个节点得到的新的PRPR值:

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

每个点最新的PRPR值为:

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值向量U0U_0,经过多次与转移概率矩阵M相乘,就会使得PR值向量UnU_n趋于稳定,其公式可以表示为:

U=αMTUn1+(1α)Un1U = \alpha M^T U_{n-1} + (1-\alpha)U_{n-1}

由于这个过程会使得起点的PRPR值无法始终维持最大,所以,对式子进行了变化,如下
U0 = [1/n1/n,… 1/n]

Un=αMTUn1+(1α)U0U_n = \alpha M^T U_{n-1} + (1-\alpha)U_{0}

其中UU为初始的PRPR值向量,本例子中U0U_0为[1, 0, 0, 0, 0, 0, 0]
通过观察以上的公式,假如UnU_n趋于稳定的时候,UnU_n应该等于Un1U_{n-1},所以令Un=Un1U_n=U_{n-1},则:

Un=αMTUn+(1α)U0U_n = \alpha M^T U_n+ (1-\alpha)U_{0}

所以:

Un=αMTUn+(1α)U0U_n = \alpha M^T U_n + (1-\alpha)U_{0}

所以:

(EαMT)Un=(1α)U0(E-\alpha M^T)U_n =(1-\alpha)U_{0}

所以:

Un=(EαMT)1+(1α)U0U_n =(E-\alpha M^T)^{-1} + (1-\alpha)U_{0}

所以可以一步求出UnU_n

3. 具体实现

本例子中:
U0U_0为:
[1, 0, 0, 0, 0, 0, 0]
MM为:

[[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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章