排名演算法(一)--PageRank

Eason.wxd發表於2018-12-31

轉自:https://blog.csdn.net/isuccess88/article/details/70339759

PageRank是Google研發的主要應用於評估網站可靠度和重要性的一種演算法,是進行網頁排名的考量指標之一。本文將對PageRank的原理進行講解,並以此為出發點介紹如何利用Transwarp Data Hub的Graphene在實際中滿足相關分析需求。

在開始PageRank原理介紹之前,請讀者先閱讀下面這則案例

有一個借貸俱樂部,共100位成員,俱樂部的每位成員都有一個借貸“誠信指數”,用來表示該成員的可靠程度。現在來了一個新的成員小白,他打算將自己的5萬塊錢放貸給俱樂部的人,假設俱樂部中每個人都有相等的貸款需求而且有相同的支付貸款利息的能力,小白希望把錢借貸給最讓人放心的成員,即找到“誠信指數”最高者。

首先小白收集了俱樂部的一些資訊,包括所有成員名單和俱樂部內部成員間的信任關係(誰信任誰)。然後使用0-99之間的連續整數對100位成員分別進行編號,並利用所有人之間的信任關係組織成一張圖(圖1)。其中信任關係依靠有向箭頭表明,例如“87 –> 92”表示87號成員信任92號成員:

技術|從資料探勘經典演算法PageRank入門Graphene

圖 1 計算“誠信指數”之前的成員信任關係圖

接著小白根據下面兩條規則計算對上圖中的每個節點計算“誠信指數”。

  1. 節點作為箭頭終點的次數越高(即入度越高),“誠信指數”越高。

  2. 高“誠信指數”的節點會提高被它指向的節點的“誠信指數”。

根據這兩條原則,小白對代表俱樂部每位成員的100個節點分別計算出了各自的“誠信指數”,繪製出了圖2。其中,面積越大顏色越深的節點“誠信指數”越高,反之則越低;並且每位成員出發的邊的顏色與該成員對應的點的顏色相同。

技術|從資料探勘經典演算法PageRank入門Graphene

圖 2 計算“誠信指數”之後的成員信任關係圖

由圖2小白可以得到這樣的結論:92和99是可靠度最高的兩位成員,對這二者放貸的風險較低。

在此過程中可以發現,實現從圖1到圖2的轉變最重要的就是遵循計算“誠信指數”的兩條規則,而這兩條規則實際就是PageRank演算法的核心。

一、PageRank演算法介紹

現在來正式介紹PageRank演算法的概念和原理:

  • PageRank簡介

PageRank演算法是一種連結分析演算法,由Google提出並用於標識網頁重要性。PageRank演算法基於兩個假設:

1)入鏈數量假設:如果一個網頁的入鏈數量越多,則其重要程度越高。

2)入鏈質量假設:高質量的網頁為其連結的頁面帶去更多權重。

以上兩個假設分別對應小白規則一和規則二。基於這兩條假設,PageRank演算法為每個頁面設定初始權重值,根據網頁間的連結關係,在多輪迭代中更新每個網頁的權重,直至各頁面的權重值穩定。不考慮作弊的情況,我們通常將最終權重值越高的節點視為越可靠網頁。

  • PageRank演算法原理

簡化公式

PageRank演算法的簡化公式如下所示:

技術|從資料探勘經典演算法PageRank入門Graphene

其中L(v)表示網頁v的出鏈數量,PR(v)表示網頁v的PageRank值,Bu表示網頁u的入鏈集合。從該公式不難看出,每個頁面的PageRank值是由其所有入鏈網頁的PageRank值累加得到。

阻尼係數(Damping Factor)

PageRank演算法可以視為對網頁跳轉的模擬,當有些網頁只有入鏈而沒有出鏈時,則無法從這些網頁跳轉出去,使得每個網頁的PageRank值最終為0。下圖給出了這個問題的例項,網頁C沒有到其他頁面的連結,隨著演算法的不斷迭代,每個網頁的權重值不斷減少,最終收斂於0。

技術|從資料探勘經典演算法PageRank入門Graphene

為了避免上述問題,在演算法中引入阻尼係數d,作為網頁隨機跳轉的概率。PageRank的計算公式也被修正為:

技術|從資料探勘經典演算法PageRank入門Graphene

其中d為常數,一般取值為0.85。

二、Graphene實現PageRank

  • Graphene介紹

Graphene是由星環科技研發的專門處理和分析大規模圖資料的分散式圖計算平臺。其中,“圖計算”是一種在以“圖論”為基礎的資料結構上的計算模式。科學研究和實際生活中的典型圖資料有:web圖,社交網路圖,資訊網路圖,生物網路圖以及機器學習中推薦相關的圖資料等。針對不同的應用場景中的各種不同問題,有不同的圖計算需求,相應的就有很多不同的圖演算法,PageRank就是其中之一。

Graphene提供了多種圖演算法以滿足不同使用者對不同場景的需求,其中包括PageRank。為了方便使用者把焦點放在圖模型的設計和分析,而不是演算法的實現上,Graphene將複雜的PageRank平行計算過程封裝起來,為使用者提供方便可靠的演算法函式graph_pagerank()作為介面,得以使實現細節對上層透明。

  • 操作過程

在Graphene中呼叫graph_pagerank()實現PageRank的操作過程分為三個步驟:資料準備,“誠信指數”計算,結果收集。下面以開篇的案例為例,對實現PageRank的每個步驟做以詳細說明。

1.資料準備:首先需收整合員信任關係資料,並按照下圖中以邊列表(edgelist)的格式儲存在HDFS下的檔案中(假設該檔案在HDFS中的位置為:/tmp/graphsql/credit_data/credit_data.txt)。列表中每一行代表圖中一條邊,每條邊包括源節點Source和目標節點Target,表明成員Source信任成員Target。我們以第二行“80 93”為例,它表示編號為80的俱樂部成員信任編號為93的俱樂部成員。

技術|從資料探勘經典演算法PageRank入門Graphene

2.“誠信指數”計算:準備好以上資料後,請在Graphene中執行下列語句:

技術|從資料探勘經典演算法PageRank入門Graphene

3.結果收集:

Graphene計算成功後會將結果儲存在本地資料夾 /tmp/D_pagerank_credit_data_result 中,開啟該資料夾中的資料,就可以看到如下的結果內容(這裡僅給出前20行)。每一行代表一個俱樂部成員的編號(id)和他的“誠信指數”(pageranks),pageranks越高,就說明越可靠。

技術|從資料探勘經典演算法PageRank入門Graphene可以發現該文件中的資料和圖2中點的大小和顏色是對應的。比如92和99排第1和2名,也就是圖中顏色最深最大的兩個點。

三、Graphene效能

本次測試在不同資料集下測試Graphene平臺中實現的PageRank演算法的執行效率,演算法迭代次數為10。測試所用資料集來自SNAP。

【測試環境】

技術|從資料探勘經典演算法PageRank入門Graphene【測試資料集】

技術|從資料探勘經典演算法PageRank入門Graphene【測試結果】

技術|從資料探勘經典演算法PageRank入門Graphene

上圖中的橫座標是每個資料集的邊數相對於Facebook資料集的倍數,縱座標是Graphene中的PageRank演算法在每個資料集上的執行時間與相對於在Facebook資料集上的執行時間的比值。我們可以發現,雖然資料集邊數以指數級增長,但是執行時間卻是線性增長,這體現了Graphene能夠很好的處理不同規模的資料集,特別是大規模的圖資料。

另外我們還對Graphene同兩個較主流的開源圖計算平臺——Spark中的GraphX和Facebook的Giraph,進行了比較。在上面相同的測試環境下,主要針對檔案大小為33.5G,圖中頂點數6千5百多萬,邊數為18億多的大規模Friendster圖資料進行了PageRank演算法執行效能的對比。我們發現在測試環境相同的情況下Graphene正常完成完成10次迭代計算,而Giraph和GraphX都報了OutOfMemory的錯誤,演算法無法正常完成。

通過測試對比,我們驗證了Graphene能夠對大規模資料提供可靠的PageRank演算法支援,並且能力強於Giraph和GraphX。

【最後,附上Graphene分散式圖計算平臺中PageRank的呼叫方法和使用例項】

graph_pagerank(vertex_caller,vertex_callee [, half = false] [ , factor = 0.85] [, iters = 10]),其中[ ]內的為帶有預設值的可選引數。

返回結果:

(vertex, rank) -> ((Primitive Type), (double)), (節點ID, 節點排名)。

引數說明:

1.vertex_caller -> (Primitive Type), 起點列名,當節點數超過Int最大值2,147,483,647時,建立對應的表使用Primitive Type型別。

2. vertex_callee -> (Primitive Type), 終點列名。

3. half -> (Boolean), 如果圖資料是無向圖且只提供一半邊資料的情況則應設為true;預設為false,按有向圖處理。

4. factor -> (Double), 阻尼係數, 預設為0.85,0<=factor<=1。

5. iters -> (Int), 演算法迴圈(迭代)次數, 預設為10,iters是大於0的整數。迭代次數越多,結果越精確,但執行時間也越長。

6. Primitive Type指以下基本型別TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,DATE。

7.異常提示:Semantic error -> 引數型別或者取值範圍出錯。

呼叫例項:

1. SELECT graph_pagerank(src,dst) FROM facebook; (預設)

2. SELECT graph_pagerank(src,dst,true, 0.8, 20) FROM facebook; (自定義阻尼係數和迭代次數

相關文章