1. 程式人生 > >PageRank 演算法-Google 如何給網頁排名

PageRank 演算法-Google 如何給網頁排名

> **公號:碼農充電站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