手把手圖文並茂教你掌握 PageRank 算法

目錄

一、基本概念

1.1 背景介紹

1.2 算法中心思想

二、算法和公式

2.1 PageRank公式

2.2 矩陣化表達:使用轉移概率矩陣/馬爾科夫矩陣

2.3 通過矩陣化表達,快速計算 PR 值

2.4 兩種方式的關係

三、Dead Ends 問題

3.1 Dead Ends 的產生

3.2 解決方法:Teleport

3.3 Dead Ends 問題修正公式

四、Spider Traps 問題

4.1 Spider Traps 的產生

4.2 解決方法

4.3 Spider Traps 問題修正公式

五、代碼實戰

六、PageRank 優缺點


一、基本概念

1.1 背景介紹

PageRank 算法由 Google 創始人 Larry Page 在斯坦福讀大學時提出,又稱 PR,佩奇排名。主要針對網頁進行排名,計算網站的重要性,優化搜索引擎的搜索結果。PR 值是表示其重要性的因子。

1.2 算法中心思想

1. 數量假設

當在網頁模型圖中,一個網頁接受到的其他網頁指向的入鏈(in-links)越多,說明該網頁越重要。

2. 質量假設

當一個質量高的網頁指向(out-links)一個網頁,說明這個被指的網頁重要。

3. 出鏈入鏈

 

二、算法和公式

2.1 PageRank公式

PR(a)_{i+1}=\sum_{i=0}^{n}\frac{PR(Ti)_{i}}{L(Ti)}

  • PR(Ti):其他節點的(指向 a 節點)PR值
  • L(Ti):其他節點的(指向 a 節點)出鏈數
  • i:循環次數

舉例:

初始化的PR值爲 1/N = 1/4 。

i=1,PR(C)_1=\frac{PR(A)_0}{L(A)}+\frac{PR(B)_0}{L(B)} =\frac{\frac{1}{4}}{2}+\frac{\frac{1}{4}}{1}=\frac{3}{8}

2.2 矩陣化表達:使用轉移概率矩陣/馬爾科夫矩陣

從A將跳轉到 B 或 C 的概率爲 1/2。

從D將跳轉到 A 的概率爲 1。(矩陣的列表示出鏈)

2.3 通過矩陣化表達,快速計算 PR 值

PR(a)=M*V

\begin{bmatrix} 0 & 0 & 1/2 & 1 \\ 1/2 & 0 & 0 & 0\\ 1/2 & 1 & 0 & 0\\ 0 & 0 & 1/2 & 0 \end{bmatrix}\times \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \end{bmatrix}=\begin{bmatrix} 3/8 \\ 1/8 \\ 3/8 \\ 1/8 \end{bmatrix}   (第一次迭代得到的 PR 值)

2.4 兩種方式的關係

 

三、Dead Ends 問題

3.1 Dead Ends 的產生

B沒有任何出鏈(out-links)這就是 Dead Ends,Dead Ends 會導致網站權重變爲 0。

舉例:

使用轉移概率矩陣快速計算PR值: 

按照這個規律,我們在多次循環之後,會發現這個模型中所有的 PR 值都會歸於 0。

3.2 解決方法:Teleport

修正M:

M+a^{T}(\frac{e}{n})

  • a = [a0, a1,..., an],當有一列全爲時(即該節點無出鏈),ai = 1,其他時候 ai = 0
  • e:由 1 填滿的列矩陣
  • n:M 矩陣的行數/列數

3.3 Dead Ends 問題修正公式

PR(a)_{i+1}=[M+a^{T}(\frac{e}{n})]*V

  • 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:

M=\beta M +(1-\beta )\frac{ee^{T}}{n},n 爲 M 的行數/列數。

  • \beta:跟隨出鏈(out-links)打開網頁的概率,一般設爲 0.8 ~0.9 之間
  • 1-\beta:隨機跳到其他網頁的概率,例如:瀏覽 a 的時候,有一定概率會打開 b 或 c
  • ee^{T}:有 1 填滿的 n × n 矩陣

4.3 Spider Traps 問題修正公式

M=[\beta M +(1-\beta )\frac{ee^{T}}{n}]*V

  • \beta:跟隨出鏈(out-links)打開網頁的概率,一般設爲 0.8 ~0.9 之間
  • 1-\beta:隨機跳到其他網頁的概率,例如:瀏覽 a 的時候,有一定概率會打開 b 或 c
  • ee^{T}:有 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 值。

 

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