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

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

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

1. 随机游走

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

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 ABCabcd的重要度各是多少?也就是计算各个节点的 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 Aac开始,再往前走一步。

首先计算每个节点剩余的 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=αMTUn1+(1α)Un1

由于这个过程会使得起点的 P R PR PR值无法始终维持最大,所以,对式子进行了变化,如下
U0 = [1/n1/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=αMTUn1+(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} Un1,所以令 U n = U n − 1 U_n=U_{n-1} Un=Un1,则:

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值