1. 程式人生 > >PageRank演算法簡介及Map-Reduce實現

PageRank演算法簡介及Map-Reduce實現

PageRank對網頁排名的演算法,曾是Google發家致富的法寶。以前雖然有實驗過,但理解還是不透徹,這幾天又看了一下,這裡總結一下PageRank演算法的基本原理。

一、什麼是pagerank

PageRank的Page可是認為是網頁,表示網頁排名,也可以認為是Larry Page(google 產品經理),因為他是這個演算法的發明者之一,還是google CEO(^_^)。PageRank演算法計算每一個網頁的PageRank值,然後根據這個值的大小對網頁的重要性進行排序。它的思想是模擬一個悠閒的上網者,上網者首先隨機選擇一個網頁開啟,然後在這個網頁上呆了幾分鐘後,跳轉到該網頁所指向的連結,這樣無所事事、漫無目的地在網頁上跳來跳去,PageRank就是估計這個悠閒的上網者分佈在各個網頁上的概率。

二、最簡單pagerank模型

網際網路中的網頁可以看出是一個有向圖,其中網頁是結點,如果網頁A有連結到網頁B,則存在一條有向邊A->B,下面是一個簡單的示例:

201959072629566

這個例子中只有四個網頁,如果當前在A網頁,那麼悠閒的上網者將會各以1/3的概率跳轉到B、C、D,這裡的3表示A有3條出鏈,如果一個網頁有k條出鏈,那麼跳轉任意一個出鏈上的概率是1/k,同理D到B、C的概率各為1/2,而B到C的概率為0。一般用轉移矩陣表示上網者的跳轉概率,如果用n表示網頁的數目,則轉移矩陣M是一個n*n的方陣;如果網頁j有k個出鏈,那麼對每一個出鏈指向的網頁i,有M[i][j]=1/k,而其他網頁的M[i][j]=0;上面示例圖對應的轉移矩陣如下:

202015378717604

初試時,假設上網者在每一個網頁的概率都是相等的,即1/n,於是初試的概率分佈就是一個所有值都為1/n的n維列向量V0,用V0去右乘轉移矩陣M,就得到了第一步之後上網者的概率分佈向量MV0,(nXn)*(nX1)依然得到一個nX1的矩陣。下面是V1的計算過程:

202114099185287

注意矩陣M中M[i][j]不為0表示用一個連結從j指向i,M的第一行乘以V0,表示累加所有網頁到網頁A的概率即得到9/24。得到了V1後,再用V1去右乘M得到V2,一直下去,最終V會收斂,即Vn=MV(n-1),上面的圖示例,不斷的迭代,最終V=[3/9,2/9,2/9,2/9]‘:

261719185728644

三、終止點問題

上述上網者的行為是一個馬爾科夫過程的例項,要滿足收斂性,需要具備一個條件:

  • 圖是強連通的,即從任意網頁可以到達其他任意網頁:

網際網路上的網頁不滿足強連通的特性,因為有一些網頁不指向任何網頁,如果按照上面的計算,上網者到達這樣的網頁後便走投無路、四顧茫然,導致前面累計得到的轉移概率被清零,這樣下去,最終的得到的概率分佈向量所有元素幾乎都為0。假設我們把上面圖中C到A的連結丟掉,C變成了一個終止點,得到下面這個圖:

fclkjfljaljfldkjglksajglasgj1

對應的轉移矩陣為:

fclajsdfkdjsaglkjsdglsajg2

連續迭代下去,最終所有元素都為0:

fclakjsgflkgjlsajgsajg3

四、陷阱問題

另外一個問題就是陷阱問題,即有些網頁不存在指向其他網頁的連結,但存在指向自己的連結。比如下面這個圖:

ljlajkjasglkjsdgkjsgla1

上網者跑到C網頁後,就像跳進了陷阱,陷入了漩渦,再也不能從C中出來,將最終導致概率分佈值全部轉移到C上來,這使得其他網頁的概率分佈值為0,從而整個網頁排名就失去了意義。如果按照上面圖對應的轉移矩陣為:

fclajsdfkdjsaglkjsdglsajg2

不斷的迭代下去,就變成了這樣:

202136578712805

五、解決終止點問題和陷阱問題

上面過程,我們忽略了一個問題,那就是上網者是一個悠閒的上網者,而不是一個愚蠢的上網者,我們的上網者是聰明而悠閒,他悠閒,漫無目的,總是隨機的選擇網頁,他聰明,在走到一個終結網頁或者一個陷阱網頁(比如兩個示例中的C),不會傻傻的乾著急,他會在瀏覽器的地址隨機輸入一個地址,當然這個地址可能又是原來的網頁,但這裡給了他一個逃離的機會,讓他離開這萬丈深淵。模擬聰明而又悠閒的上網者,對演算法進行改進,每一步,上網者可能都不想看當前網頁了,不看當前網頁也就不會點選上面的連線,而上悄悄地在位址列輸入另外一個地址,而在位址列輸入而跳轉到各個網頁的概率是1/n。假設上網者每一步檢視當前網頁的概率為a,那麼他從瀏覽器位址列跳轉的概率為(1-a),於是原來的迭代公式轉化為:

202158112317322

現在我們來計算帶陷阱的網頁圖的概率分佈:

202205000122441

重複迭代下去,得到:

261719185728644

六、用Map-reduce計算Page Rank

上面的演算過程,採用矩陣相乘,不斷迭代,直到迭代前後概率分佈向量的值變化不大,一般迭代到30次以上就收斂了。真的的web結構的轉移矩陣非常大,目前的網頁數量已經超過100億,轉移矩陣是100億*100億的矩陣,直接按矩陣乘法的計算方法不可行,需要藉助Map-Reduce的計算方式來解決。實際上,google發明Map-Reduce最初就是為了分散式計算大規模網頁的pagerank,Map-Reduce的pagerank有很多實現方式,我這裡計算一種簡單的。

考慮轉移矩陣是一個很多的稀疏矩陣,我們可以用稀疏矩陣的形式表示,我們把web圖中的每一個網頁及其鏈出的網頁作為一行,這樣第四節中的web圖結構用如下方式表示:

1 2 3 4 1 A    B    C    D 2 B    A    D 3 C    C 4 D    B    C

A有三條出鏈,分佈指向A、B、C,實際上,我們爬取的網頁結構資料就是這樣的。

1、Map階段

Map操作的每一行,對所有出鏈發射當前網頁概率值的1/k,k是當前網頁的出鏈數,比如對第一行輸出<B,1/3*1/4>,<C,1/3*1/4>,<D,1/3*1/4>;

2、Reduce階段

Reduce操作收集網頁id相同的值,累加並按權重計算,pj=a*(p1+p2+…Pm)+(1-a)*1/n,其中m是指向網頁j的網頁j數,n所有網頁數。

思路就是這麼簡單,但是實踐的時候,怎樣在Map階段知道當前行網頁的概率值,需要一個單獨的檔案專門儲存上一輪的概率分佈值,先進行一次排序,讓出鏈行與概率值按網頁id出現在同一Mapper裡面,整個流程如下:

211557326376640

這樣進行一次迭代相當於需要兩次MapReduce,但第一次的MapReduce只是簡單的排序,不需要任何操作,用python呼叫Hadoop的Streaming.

SortMappert.py程式碼如下:

1 2 3 4 5 1 #!/bin/python 2 '''Mapper for sort''' 3 import sys 4 for line in sys.stdin: 5      print line.strip()

SortReducer.py也是一樣

1 2 3 4 5 1 #!/bin/python 2 '''Reducer for sort''' 3 import sys 4 for line in sys.stdin: 5       print line.strip()

PageRankMapper.py程式碼:

1 2 3

相關推薦

PageRank演算法簡介Map-Reduce實現

PageRank對網頁排名的演算法,曾是Google發家致富的法寶。以前雖然有實驗過,但理解還是不透徹,這幾天又看了一下,這裡總結一下PageRank演算法的基本原理。 一、什麼是pagerank PageRank的Page可是認為是網頁,表示網頁排名,也

CF演算法簡介實現

cf演算法全稱“Collaborative Filtering”,即協同過濾演算法。協同過濾演算法是非常強大與成熟(古老)的一套演算法。它廣泛應用於電子商務系統等領域。  協同過濾演算法的出現標誌著推薦系統的產生。 協同過濾簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好

Java☞DES加解密演算法簡介實現

Java加密解密之對稱加密演算法DES   資料加密演算法(Data Encryption Algorithm,DEA)是一種對稱加密演算法,很可能是使用最廣泛的金鑰系統,特別是在保護金融資料的安全中,最初開發的DEA是嵌入硬體中的。通常,自動取款機(Aut

Apriori演算法簡介實現(python)

Apriori這個詞的意思是“先驗的”,從priori這個詞根可以猜出來~;) 。該演算法用於從資料中挖掘頻繁項資料集以及關聯規則。其核心原理是基於這樣一類“先驗知識”:  如果一個數據項在資料庫中是頻繁出現的,那麼該資料項的子集在資料庫中也應該是頻繁出現的(命題1)

大資料處理神器map-reduce實現(僅python和shell版本)

熟悉java的人直接可以使用java實現map-reduce過程,而像我這種不熟悉java的怎麼辦?為了讓非java程式設計師方便處理資料,我把使用python,shell實現streaming的過程,也即為map-reduce過程,整理如下: 1.如果資料不在hive裡面,而在

PageRank演算法簡介

PageRank演算法簡介 最早的搜尋引擎採用的是分類目錄的方法,即通過人工進行網頁分類並整理出高質量的網站。當時的 Yahoo 和 hao123 就是使用的這種方法。 後來網頁越來越多,人工分類已經不現實了。搜尋引擎進入了 文字檢索 的時代,即計算使用者查詢關鍵詞與網頁內容的相關程度來

Canny邊緣檢測演算法原理C語言實現詳解

Canny運算元是John Canny在1986年提出的,那年老大爺才28歲,該文章發表在PAMI頂級期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analy

【第18天】Java集合(五)---Map介面概述Map介面實現的HashMap類、SortedMap介面實現的TreeMap類

1 Map的通性 1.1 基本用法與特點 1.2 遍歷 2 HashMap集合的特性 3 TreeMap集合的特性 1 Map的通性     &nb

大矩陣乘法運算map reduce實現思路

實現思路: 儲存: 大矩陣很多都是稀疏矩陣,並且有可能有上百萬的行和上百萬的列。 那麼矩陣可以存在類似HBase面向列的分散式資料庫中。 假設HTable中有兩個表A和表B分別儲存兩個巨型矩陣a和b。表A和表B都是隻有一個列族。列名都是1開始計數。 那麼表A和表B所儲存的矩

【大創_社區劃分】——PageRank演算法的解析與Python實現

一、什麼是pagerank PageRank的Page可是認為是網頁,表示網頁排名,也可以認為是Larry Page(google 產品經理),因為他是這個演算法的發明者之一,還是google CEO

增強影象對比度演算法原理matlab程式碼實現

clc;   close all;   clear all;    % -------------Gamma Transformations-----------------     %f = imread('Fig0316(4)(bottom_left).tif');     

資料結構圖文解析之:棧的簡介C++模板實現

0. 資料結構圖文解析系列 1. 棧的簡介 1.1棧的特點 棧(Stack)是一種線性儲存結構,它具有如下特點: 棧中的資料元素遵守”先進後出"(First In Last Out)的原則,簡稱FILO結構。 限定只能在棧頂進行插入和刪除操作。 1.2棧的相關概念 棧的相關概念: 棧頂與棧底:允許元素

蟻群演算法簡介matlab原始碼

1 蟻群演算法原理  自1991年由義大利學者 M. Dorigo,V. Maniezzo 和 A. Colorni 通過模擬蟻群覓食行為提出了一種基於種群的模擬進化演算法——蟻群優化。該演算法的出現引起了學者們的極大關注,蟻群演算法的特點:     ① 其原理是一種正

windows ssh客戶端putty 簡介用其實現windows與linux的檔案傳輸

windows ssh客戶端putty 簡介  一、Putty簡介      Putty是一個免費小巧的Win32平臺下的telnet,rlogin和ssh客戶端。它的主程式只有364k, 但是功能絲毫不遜色於商業的telnet類工具。  官方主頁:http://www.

各種排序演算法總結C#程式碼實現

 排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。分內部排序和外部排序。若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問

ReactNative系列之十九metro-bundle主要api簡介優化打包實現

1.RN的打包bundle概要從ReactNative的0.50(準確來講應該是0.4x)之後到目前的最新版本0.55版本,都使用metro-bundle來進行壓縮打bundle檔案。實際上打bundle的好處有幾個1.100個檔案打包成一個檔案,jsCore載入時效率相對高

影象分割演算法簡介常用邊緣檢測演算法

                                                                              影象分割演算法概述及常用邊緣檢測演算法 一、概述  用計算機進行數字影象處理的目的有兩個,一是產生更適合人類視覺觀察和

影象去霧之何凱明暗通道先驗去霧演算法原理c++程式碼實現

http://blog.csdn.net/s12244315/article/details/50292049 何凱明博士,2007年清華大學畢業,2011年香港中文大學博士畢業,可謂是功力深厚,感嘆於國內一些所謂博士的水平,何這樣的博士才可以真正叫做

最短路徑A*演算法原理java程式碼實現(看不懂是我的失敗)

package astar; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; imp

OkHttp的使用簡介封裝,實現更簡潔的呼叫

最近將專案使用的網路請求庫換成了OkHttp,體驗感覺上升了好幾個檔次啊,-。-,之前專案是好幾年前的,封裝了原生的httpClient,沒有實現非同步請求,每次都要自己開個執行緒,然後再實現退出的時候把執行緒關了,還要實現本地快取,啊,聽起來好麻煩有木有,然後我終於受不了了,自己封裝了下OkHttp(。