目錄
一、基本概念
1.1 背景介紹
PageRank 算法由 Google 創始人 Larry Page 在斯坦福讀大學時提出,又稱 PR,佩奇排名。主要針對網頁進行排名,計算網站的重要性,優化搜索引擎的搜索結果。PR 值是表示其重要性的因子。
1.2 算法中心思想
1. 數量假設
當在網頁模型圖中,一個網頁接受到的其他網頁指向的入鏈(in-links)越多,說明該網頁越重要。
2. 質量假設
當一個質量高的網頁指向(out-links)一個網頁,說明這個被指的網頁重要。
3. 出鏈入鏈
二、算法和公式
2.1 PageRank公式
- PR(Ti):其他節點的(指向 a 節點)PR值
- L(Ti):其他節點的(指向 a 節點)出鏈數
- i:循環次數
舉例:
初始化的PR值爲 1/N = 1/4 。
2.2 矩陣化表達:使用轉移概率矩陣/馬爾科夫矩陣
從A將跳轉到 B 或 C 的概率爲 1/2。
從D將跳轉到 A 的概率爲 1。(矩陣的列表示出鏈)
2.3 通過矩陣化表達,快速計算 PR 值
(第一次迭代得到的 PR 值)
2.4 兩種方式的關係
三、Dead Ends 問題
3.1 Dead Ends 的產生
B沒有任何出鏈(out-links)這就是 Dead Ends,Dead Ends 會導致網站權重變爲 0。
舉例:
使用轉移概率矩陣快速計算PR值:
按照這個規律,我們在多次循環之後,會發現這個模型中所有的 PR 值都會歸於 0。
3.2 解決方法:Teleport
修正M:
- a = [a0, a1,..., an],當有一列全爲時(即該節點無出鏈),ai = 1,其他時候 ai = 0
- e:由 1 填滿的列矩陣
- n:M 矩陣的行數/列數
3.3 Dead Ends 問題修正公式
- a = [a0, a1,..., an],當有一列全爲時(即該節點無出鏈),ai = 1,其他時候 ai = 0
- e:由 1 填滿的列矩陣
- n:M 矩陣的行數/列數
- V:PR 值的矩陣
四、Spider Traps 問題
4.1 Spider Traps 的產生
A 節點與其他節點之間無 out-links,這就是 Spider Traps,這將會導致網站權重變爲向一個節點偏移。
舉例:
按照這個規律,我們在多次循環之後,會發現這個模型中 A 的 PR 值都會歸於 1,其他歸爲 0。
4.2 解決方法
修正M:
,n 爲 M 的行數/列數。
- :跟隨出鏈(out-links)打開網頁的概率,一般設爲 0.8 ~0.9 之間
- :隨機跳到其他網頁的概率,例如:瀏覽 a 的時候,有一定概率會打開 b 或 c
- :有 1 填滿的 n × n 矩陣
4.3 Spider Traps 問題修正公式
- :跟隨出鏈(out-links)打開網頁的概率,一般設爲 0.8 ~0.9 之間
- :隨機跳到其他網頁的概率,例如:瀏覽 a 的時候,有一定概率會打開 b 或 c
- :有 1 填滿的 n × n 矩陣
- V:PR 值的矩陣
五、代碼實戰
# 導包
import networkx as nx
import matplotlib.pyplot as plt
import random
Graph = nx.DiGraph()
Graph.add_nodes_from(range(0, 100))
for i in range(100):
j = random.randint(0, 100)
k = random.randint(0, 100)
Graph.add_edge(k, j)
# 繪圖
nx.draw(Graph, with_labels=True)
plt.show()
# 打印全部點的 PR 值
pr = nx.pagerank(Graph, max_iter=100, alpha=0.01)
print(pr)
{0: 0.009937991017511711, 1: 0.009913062905888668, 2: 0.009888464827268925, 3: 0.009888712352021399, 4: 0.009839268670029438, 5: 0.009987022158249549, 6: 0.009839268670029438, 7: 0.009839268670029438, 8: 0.00988887736852305, 9: 0.009839268670029438, 10: 0.009872066108189095, 11: 0.009839268670029438, 12: 0.009839268670029438, 13: 0.009938898608270786, 14: 0.010036548348492335, 15: 0.009839268670029438, 16: 0.009839268670029438, 17: 0.009872066108189095, 18: 0.009839268670029438, 19: 0.009839268670029438, 20: 0.009839268670029438, 21: 0.009889207401526351, 22: 0.009889207401526351, 23: 0.009938403558765836, 24: 0.009888629843770575, 25: 0.009839268670029438, 26: 0.009904946054599578, 27: 0.009839268670029438, 28: 0.010134940662971308, 29: 0.009888464827268925, 30: 0.009839268670029438, 31: 0.009839268670029438, 32: 0.010036713364993984, 33: 0.009839268670029438, 34: 0.010003750910332676, 35: 0.010012940368882492, 36: 0.009839268670029438, 37: 0.009921262265428582, 38: 0.010036878381495635, 39: 0.009839268670029438, 40: 0.009889372418028, 41: 0.009888629843770575, 42: 0.009872066108189095, 43: 0.009839268670029438, 44: 0.009938156034013362, 45: 0.009839268670029438, 46: 0.009839268670029438, 47: 0.009839268670029438, 48: 0.009889083639150113, 49: 0.009889372418028, 50: 0.01006934578665199, 51: 0.009839268670029438, 52: 0.009989167372770998, 53: 0.010003338369078551, 54: 0.009839268670029438, 55: 0.009839268670029438, 56: 0.009889083639150113, 57: 0.009839268670029438, 58: 0.009888464827268925, 59: 0.009970458422668069, 60: 0.010036053298987385, 61: 0.009921757314933532, 62: 0.009839268670029438, 63: 0.009938156034013362, 64: 0.009989332389272649, 65: 0.009839268670029438, 66: 0.009839268670029438, 67: 0.009863866748649181, 68: 0.009839268670029438, 69: 0.009839268670029438, 70: 0.010039188612518738, 71: 0.009839268670029438, 72: 0.009863866748649181, 73: 0.009872231124690746, 74: 0.01001990210466003, 75: 0.009839268670029438, 76: 0.009839268670029438, 77: 0.009962754112633105, 78: 0.009937660984508411, 79: 0.010012692844130016, 80: 0.009839268670029438, 81: 0.009839268670029438, 82: 0.009839268670029438, 83: 0.009888712352021399, 84: 0.009839268670029438, 85: 0.009888712352021399, 86: 0.009839268670029438, 87: 0.009986857141747896, 88: 0.009973016178443645, 89: 0.010095594030288237, 90: 0.009839268670029438, 91: 0.009971448521677969, 92: 0.009938651083518312, 93: 0.009863866748649181, 94: 0.009987847240757798, 95: 0.009839268670029438, 96: 0.009888464827268925, 97: 0.009922417380940133, 98: 0.009971448521677969, 99: 0.009872231124690746, 100: 0.009937660984508411}
# 最大的 PR 值
print(max(pr.values()))
0.010134940662971308
import operator
# 最大 PR 值的點
print(max(pr.items(), key=operator.itemgetter(1))[0])
# PR 值之和
print(sum(pr.values()))
28 1.0000000000000007
六、PageRank 優缺點
PageRank 優點
1. 通過網頁之間的鏈接來決定網頁的重要性,一定程度消除了人爲對排名的影響。
2. 離線計算 PageRank 值,而非查找的時候計算,提升了查詢的效率。
PageRank 缺點
1. 存在時間就網站,PageRank 值會越來越大,而新生的網站,PageRank 值增長慢。
2. 非查詢相關的特性,查詢結果會偏離搜索內容。
3. 通過“殭屍”網站或鏈接,人爲刷 PageRank 值。