PageRank 演算法-Google 如何給網頁排名
阿新 • • 發佈:2020-12-09
> **公號:碼農充電站pro**
> **主頁:**
在網際網路早期,隨著網路上的網頁逐漸增多,如何從海量網頁中檢索出我們想要的頁面,變得非常的重要。
當時著名的雅虎和其它網際網路公司都試圖解決這個問題,但都沒能有一個很好的解決方案。
直到1998 年前後,兩位斯坦福大學的博士生,拉里·佩奇和謝爾蓋·布林一起發明了著名的 **PageRank** 演算法,才完美的解決了網頁排名的問題。也正是因為這個演算法,誕生了偉大的 **Google** 公司。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128164559962.png?)
(上圖中:**左為布林**,**右為佩奇**。)
### 1,PageRank 演算法原理
**PageRank** 演算法的核心原理是:**在網際網路中,如果一個網頁被很多其它網頁所連結,說明該網頁非常的重要,那麼它的排名就高**。
拉里·佩奇將整個網際網路看成一張大的圖,每個網站就像一個節點,而每個網頁的連結就像一個弧。那麼,網際網路就可以用一個圖或者矩陣來描述。
> 拉里·佩奇也因該演算法在30 歲時當選為美國工程院院士。
假設目前有4 個網頁,分別是 **A,B,C,D**,它們的連結關係如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128170854783.png?)
我們規定有兩種鏈:
- 出鏈:從自身引出去的鏈。
- 入鏈:從外部引入自身的鏈。
比如圖中的C 網頁,有兩個入鏈,一個出鏈。
PageRank 的思想就是,**一個網頁的影響力就等於它的所有入鏈的影響力之和**。
用數學公式表示為:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128171619707.png)
其中(分值代表頁面影響力):
- `PR(u)` 是網頁`u` 的分值。
- `Bu` 是網頁`u` 的入鏈集合。
- 網頁`v` 是網頁`u` 的任意一個入鏈。
- `PR(v)` 是網面`v` 的分值。
- `L(v)` 是網頁`v` 的出鏈數量。
- 網頁`v` 帶給網頁`u` 的分值就是 `PR(v) / L(v)`。
- 那麼`PR(u)` 就等於所有的入鏈分值之和。
在上面的公式中,我們假設**從一個頁面v 到達它的所有的出鏈頁面的概率是相等的**。
比如上圖來說,頁面**A** 有三個出鏈分別連結到了 **B、C、D** 上。那麼當用戶訪問 **A** 的時候,就有跳轉到 **B、C** 或者 **D** 的可能性,跳轉概率均為 **1/3**。
### 2,計算網頁的分值
下面來看下如何計算網頁的分值。
我們可以用一個表格,來表示上圖中的網頁的連結關係,及每個頁面到其它頁面的概率:
| | A | B | C | D |
|--|--|--|--|--|
| **A** | `0` A-> A | `1/2` B->A | `1` C->A | `0` D->A |
| **B** | `1/3` A->B | `0` B->B | `0` C->B | `1/2` D->B |
| **C** | `1/3` A->C | `0` B->C | `0` C->C | `1/2` D->C |
| **D** | `1/3` A->D | `1/2` B->D | `0` C->D | `0` D->D |
根據這個表格中的數字,可以將其轉換成一個矩陣**M**:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128173843414.png)
假設 **A、B、C、D** 四個頁面的初始影響力都是相同的,都為 **1/4**,即:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128173925779.png)
經過第一次分值轉移之後,可以得到 **W1 **,如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128175032751.png)
同理可以得到**W2**,**W3** 一直到 **Wn**:
- **W2** = M * **W1**
- **W3** = M * **W2**
- **Wn** = M * **Wn-1**
那麼什麼時候計算終止呢?
佩奇和布林已經證明,不管網頁的初識值選擇多少(我們這假設都是1/4),最終都能保證網頁的分值能夠收斂到一個真實確定值。
也就是直到 **Wn** 不再變化為止。
這就是網頁分值的計算過程,還是比較好理解的。
### 3,PageRank 的兩個問題
我們上文中介紹到的是**PageRank** 的基本原理,是簡化版本。在實際應用中會出現**等級洩露**(RankLeak)和**等級沉沒**(Rank Sink)的問題。
如果一個網頁**沒有出鏈**,就會吸收其它網頁的分值不釋放,最終會導致其它網頁的分值為**0**,這種現象叫做**等級洩露**。如下圖中的網頁**C**:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128222411596.png)
相反,如果一個網頁**沒有入鏈**,最終會導致該網頁的分值為**0**,這種現象叫做**等級沉沒**。如下圖中的網頁**C**:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128222506105.png?)
### 4,PageRank 的隨機瀏覽模型
為了解決上面的問題,拉里·佩奇提出了**隨機瀏覽模型**,即使用者並不都是依靠網頁連結來訪問網頁,也有可能用其它方式訪問網址,比如輸入網址。
因此,提出了**阻尼因子**的概念,這個因子代表使用者按照**跳轉連結**來上網的概率,而 **1-d** 則代表使用者通過其它方式訪問網頁的概率。
所以,將上文中的公式改進為:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128223823862.png)
其中:
- **d** 為阻尼因子,通常可以取**0.85**。
- **N** 為網頁總數。
### 5,用程式碼計算網頁分值
如何用程式碼來計算網頁的**PR** 分值呢?(為了方便檢視,我把上圖放在這裡)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128170854783.png?)
我們可以看到,該圖實際上就是資料結構中的**有向圖**,因此我們可以通過構建有向圖來構建 **PageRank** 演算法。
[NetworkX](https://networkx.org/) 是一個**Python** 工具包,其中集成了常用的**圖結構和網路分析演算法**。
我們可以用 **NetworkX** 來構建上圖中的網路結構。
首先引入模組:
```python
import networkx as nx
```
用 **DiGraph** 類建立有向圖:
```python
G = nx.DiGraph()
```
將4 個網頁的連結關係,用陣列表示:
```python
edges = [
("A", "B"), ("A", "C"), ("A", "D"),
("B", "A"), ("B", "D"),
("C", "A"),
("D", "B"), ("D", "C")
]
```
陣列中的元素作為有向圖的邊,並新增到圖中:
```python
for edge in edges:
G.add_edge(edge[0], edge[1])
```
使用`pagerank` 方法計算**PR** 分值:
```python
# alpha 為阻尼因子
PRs = nx.pagerank(G, alpha=1)
print PRs
```
輸出每個網頁的**PR** 值:
```shell
{'A': 0.33333396911621094,
'B': 0.22222201029459634,
'C': 0.22222201029459634,
'D': 0.22222201029459634}
```
最終,我們計算出了每個網頁的**PR** 值。
### 6,畫出網路圖
**NetworkX** 包中還提供了畫出網路圖的方法:
```python
import matplotlib.pyplot as plt
# 畫網路圖
nx.draw_networkx(G)
plt.show()
```
如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201129162824862.png?)
我們還可以設定**圖的形狀,節點的大小,邊的長度**等屬性,具體可以點選[這裡](https://networkx.org/documentation/stable/reference/drawing.html)檢視。
> 更多關於 **NetworkX** 的內容可以參考其[官方文件](https://networkx.org/documentation/stable/)。
### 7,總結
**PageRank** 演算法給了我們一個很重要的啟發,**權重**在很多時候是一個非常重要的指標。
- 比如在人際交往中,個人的影響力不僅取決於你的朋友的數量,而且朋友的質量非常重要,說明了**圈子**的重要性。
- 比如在自媒體時代,粉絲數並不能真正的代表你的影響力,粉絲的質量也很重要。如果你的粉絲中有很多大V,那麼將大大增加你影響力。
本篇文章主要介紹了:
- **PageRank** 演算法的原理。
- 簡化版的**PageRank** 演算法遇到的問題,以及解決方案:
- 等級洩露和等級沉沒。
- 引出**隨機瀏覽模型**來解決這兩個問題。
- 如何用程式碼模擬PageRank 演算法:
- 使用了 [NetworkX](https://networkx.org/) 模組。
(本節完。)
---
**推薦閱讀:**
[***決策樹演算法-理論篇-如何計算資訊純度***](https://www.cnblogs.com/codeshell/p/13948083.html)
[***決策樹演算法-實戰篇-鳶尾花及波士頓房價預測***](https://www.cnblogs.com/codeshell/p/13984334.html)
[***樸素貝葉斯分類-理論篇-如何通過概率解決分類問題***](https://www.cnblogs.com/codeshell/p/13999440.html)
[***樸素貝葉斯分類-實戰篇-如何進行文字分類***](https://www.cnblogs.com/codeshell/p/14034097.html)
[***計算機如何理解事物的相關性-文件的相似度判斷***](https://www.cnblogs.com/codeshell/p/14046415.html)
---
歡迎關注作者公眾號,獲取更多技術乾貨。
![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic