PageRank是[Google]專有的[算法],用于衡量特定網(wǎng)頁相對于索引中的其他網(wǎng)頁而言的重要程度装盯。
不同的網(wǎng)頁直接存在著引用的關(guān)系,就像一張圖一樣:
這個圖也可以轉(zhuǎn)化為矩陣表示堆缘,其中W[1][0]=0.3333表示從網(wǎng)頁A到B的概率趣效,其他它的也是同理:
[[ 0. 0.5 1. 0. ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0.5 0. 0. ]]
直接看代碼,從其他地方拿過來直接改的:
from numpy import *
import numpy as np
a = array([[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 0, 0]], dtype=float)
def graphMove(a):
b = transpose(a) #
c = zeros((a.shape), dtype=float)
for i in range(a.shape[0]):
for j in range(a.shape[1]):
c[i][j] = a[i][j] / max((b[j].sum()),1)
return c
def firstPr(c):
pr = zeros((c.shape[0], 1), dtype=float)
for i in range(c.shape[0]):
pr[i] = float(1) / c.shape[0]
# print pr,"\n==================================================="
return pr
def pageRank(p, m, v):
vv=v
while (sum((p * dot(m, v) + (1 - p) * v-v)**2)>1e-9):
print(sum(p * dot(m, v) + (1 - p) * v-v)**2)
v = p * dot(m, v) + (1 - p) * v
print (v)
return v
if __name__ == "__main__":
M = graphMove(a)
print(M)
pr = firstPr(M)
print(pr)
p = 0.8
print pageRank(p, M, pr)
其中 m 和 v 分別為:
[[ 0. 0.5 1. 0. ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0.5 0. 0. ]]
[[ 0.25]
[ 0.25]
[ 0.25]
[ 0.25]]
運算結(jié)果如下:
3.08148791102e-33
[[ 0.333328]
[ 0.222224]
[ 0.222224]
[ 0.222224]]
看樣子是和書中說得一樣手报,下面我們修改m蚯舱,及m對應的圖如下(終止點問題):
[[ 0. 0.5 0. 0. ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0.5 0. 0. ]]
運算結(jié)果如下:
4.77908611974e-09
[[ 4.64238536e-05]
[ 6.76593827e-05]
[ 6.76593827e-05]
[ 6.76593827e-05]]
雖然收斂了,但是結(jié)果看著并不是我們想要的掩蛤。
修改實現(xiàn)代碼:
def pageRank(p, m, v):
e=v
while (sum((p * dot(m, v) + (1 - p) * e-v)**2)>1e-9):
print(sum(p * dot(m, v) + (1 - p) * e-v)**2)
v = p * dot(m, v) + (1 - p) * e
print (v)
return v
運算結(jié)果如下:
4.58712913112e-09
[[ 0.10136897]
[ 0.12840406]
[ 0.12840406]
[ 0.12840406]]
修改m,以及m對應的圖(陷阱問題):
[[ 0. 0.5 0. 0. ]
[ 0.33333333 0. 0. 0.5 ]
[ 0.33333333 0. 1. 0.5 ]
[ 0.33333333 0.5 0. 0. ]]
運算結(jié)果如下:
4.77908611974e-09
[[ 4.64238536e-05]
[ 6.76593827e-05]
[ 6.76593827e-05]
[ 6.76593827e-05]]
我的理解陈肛,既然是相對與其他網(wǎng)頁的重要程度揍鸟,那么就可以理解為:
SUM=p其他網(wǎng)頁對該網(wǎng)頁的引用數(shù)+q該網(wǎng)頁對其他網(wǎng)頁的引用數(shù)
對這個SUM進行排序。
實際在矩陣相乘中的作用就是如此,權(quán)重就在一定程度上代表了重要程度阳藻,所以這個計算最終一定是收斂的晰奖。
數(shù)學之美中公式記錄如下: