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