【推薦算法】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

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