程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

博為峰網校發表於2019-08-30

由於公司架構調整和業務方向的轉變,我所在的專案組即將接手一個機器學習和資料探勘的專案,為了後續更好地開展工作,也為了能提高自己的專業技能,我決定開始學習機器和資料探勘方面的知識。

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

那麼,問題就來了:到底應該從哪裡開始學起呢?最開始我也買了一些機器學習相關的入門書籍,跟著聽一些網路課程,但是我發現所有的課程都特別偏重理論,雖然機器學習、資料探勘需要很強的理論基礎才能做好,但是我個人更喜歡理論聯絡實際的學習方式,比如可以在瞭解某種基本原理的基礎上,立刻用程式碼來實現它。

無意間從同事口中得知機器學習與資料探勘的十大經典演算法,我決定就從十大經典演算法開始學習。

下面是我的學習路線:逐個掌握每種經典演算法的演算法思想、數學模型及Python程式碼實現,爭取各個擊破並融匯貫通。

好了,廢話不多說了,我們先看第一種經典演算法:PageRank演算法。

一、PageRank演算法的簡介

PageRank演算法即網頁分級排名演算法,它的提出者是谷歌的創始人之一拉里·佩奇(Larry Page),所以演算法的名字就以Page命名。拉里·佩奇提出該演算法時還是一名史丹佛大學的學生,(真是自古英雄出少年啊!)並且該演算法曾在2001年9月獲得美國國家專利。

PageRank演算法是Google演算法的重要內容之一,可以說它就是Google演算法的降龍十八掌和倚天屠龍劍啊!

二、PageRank演算法的核心思想

PageRank根據網站的外部連結和內部連結的數量和質量,衡量網站的價值。PageRank隱含的思想就是:每個到頁面的連結都是對該頁面的一次投票, 被連結的越多,就意味著被其他網站投票越多。一個網頁所獲得“投票”越多,說明這個網頁越重要,它的被訪問的機率越大,自然分級排名就越高,那麼搜尋結果它就越靠前。這就好比是一篇學術論文,論文被引用的次數越多,論文的影響因子越高,自然論文就越權威啦!

PageRank的核心思想歸納起來就兩條:

1.如果一個網頁被很多其他網頁連結到的話說明這個網頁比較重要,也就是PageRank值會相對較高。

2.如果一個PageRank值很高的網頁連結到一個其他的網頁,那麼被連結到的網頁的PageRank值會相應地因此而提高。

三、PageRank演算法的數學模型

1、相關概念

出鏈:網頁A中附加了網頁B的連結,使用者瀏覽A時可以透過點選該連結進入網頁B,此時我們稱A出鏈B。

入鏈:上面透過點選網頁A中B-Link進入B,表示由A入鏈B。如果使用者自己在瀏覽器輸入欄輸入網頁B的URL,然後進入B,表示使用者透過輸入URL入鏈B。

無出鏈:如果一個網頁A中沒有附加任何的URL,則稱A無出鏈。

只對自己出鏈:如果一個網頁A中沒有附加任何其他頁面的URL,只有附加自己的URL,則稱A只對自己出鏈。

PR值:就是指一個網站被訪問的機率,PR值越高,被訪問的機率越高,自然排名就高。

2、簡單數學模型(不帶a的數學模型)

首先,我們對網路上的所有網頁做一個抽象,每個網頁代表一個節點,如果從網頁A中附加了網頁B的連結,則表示從節點A指點節點B的有向邊。那麼整個WEB就被抽象成一張有向圖。現在我們假設世界上只有四個網頁,它們之間關係如下圖:

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

圖 1

之前我們說過PageRank的思想就是,誰被引用的越多,誰的PR值越高。那麼我們假設當使用者停留在某個頁面上時,他跳轉到頁面上任意一個連結的機率相同。

對任意一個網頁我們用I(p)描述其重要性,稱之為網頁排序值(就是PR值)。假定網頁Pj有Lj個連結,其中一個連結指向網頁Pi,那麼Pj將其重要性的1/Lj分給Pi,即Pi的網頁重要性就是所有指向這個網頁的其他網頁所貢獻的重要性之和。公式表示如下:

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

式中,Bi表示所有連結到Pi的網頁集合。

為了方便數學分析,我們定義一個超鏈矩陣M[Mij]:

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

其中第i行j列的值Mij表示使用者從頁面j轉到頁面i的機率。

按照這個定義,圖1的超鏈矩陣為

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

設初始時每個頁面的rank值為1/N,這裡就是1/4。按A—D順序得到向量 v:v=[1/4,1/4,1/4,1/4]

此時如果做矩陣乘法,使M*v就得到一個新的rank陣v’:M第一行分別是A、B、C和D轉移到頁面A的機率,而v的第一列分別是A、B、C和D當前的rank,因此用M的第一行乘以v的第一列,所得結果就是頁面A最新rank的合理估計,故M*v的結果v’就分別代表A、B、C、D新rank值。

然後用M再乘以這個新的rank向量v’,又會產生一個rank向量。迭代這個過程,可以證明v最終會收斂,即v≈Mv,此時計算停止,最終得到的v’就是rankpage的排序結果:

V’=M*V----------(1)

3、複雜數學模型(帶a的數學模型)

但是我們也注意到,要想上述迭代結果最終收斂,必須滿足一個條件:圖是強連通的,即從任意網頁可以到達其他任意網頁。假設我們把上面圖中C到D的連結丟掉,C變成了一個終止點。再進行迭代,那麼迭代的最終結果是v’=[0,0,0,0],顯然演算法失效了。除了終止點問題外,還有一個陷阱問題,即將圖1中D到C的連結刪除後,再加一條C指向C自身的連結。那麼按上述迭代過程,最終v’=[0,0,1,0],此時演算法也是失效的。

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇

                              圖2 終止點問題

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇 點選新增圖片描述(最多60個字)

圖3 陷阱問題

為了解決終止點問題和陷阱問題,我們需要對演算法進行改進:假設使用者在選擇下一個跳轉的頁面時,選擇當前頁及當前頁上的連結的機率為a,選擇其他頁面的機率為(1-a),選擇其他頁面中每個頁面的機率都相同為1/n,則計算PR值的公式演變為:

v′=αMv+(1?α)(1/n)-----(2)

四、PageRank演算法的Python實現

下面我們以圖3為例,分別用程式碼實現公式(1)和公式(2)的排序結果:

import numpy as np

  M = [[0,1/2,0,1/2], [1/3,0,0,1/2], [1/3,1/2,1,0],[1/3,0,0,0]

  U = [1/4,1/4,1/4,1/4]

  U0 = np.array(U)

  U_past_none_alpha = []

  while True:

  U = np.dot(M,U)

  if str(U) == str(U_past_none_alpha):

  Break

  U_past_none_alpha = U

  print('公式1的結果:',U)

  U_past_has_alpha = []

  while True:

  U = 0.8*(np.dot(M,U))+0.2*U0

  if str(U) == str(U_past_has_alpha):

  Break

  U_past_has_alpha = U

  print('公式2的結果:',U)

輸出結果如下:

C:\Users\1009\PycharmProjects\20190329\venv\Include\Include\Scripts\Python.exe C:/Users/1009/PycharmProjects/20190329/pagerank.py

公式1的結果:[0. 0. 1. 0.]

公式2的結果:[0.13172043 0.11917563 0.6639785  0.08512545]

Process finished with exit code 0

顯然,公式(2)的結果更加科學準確!

五、後記:

PageRank演算法就介紹到這裡了,我的感覺就是按公式編碼實現其實並不難,難的在於公式背後的數學邏輯思維。透過和做演算法開發的同事交流,我才知道原來演算法最最重要的就是思維,沒有思維的演算法就如同沒有靈魂的軀體一樣,完全不能適應複雜的現實場景的需求。謹以此文為開端,開始我的演算法之旅,希望與廣大測試同行一起進步!

加我VX:ww-51testing   回覆關鍵詞“測試”領取限量軟體測試學習資料哦~~

程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2655593/,如需轉載,請註明出處,否則將追究法律責任。

相關文章