本文將記錄在學習pagerank的有關內容,如果您也在做相關的工作請與我郵件溝通交流 [email protected]
pagerank理論及推導
pagerank算法是對於在一個有向圖上,找到每個節點的重要性程度,最終得到每個節點的重要性打分。
在實際使用中是爲了找到在網頁上網頁的重要性程度,由於pagerank算法是單純的和圖網絡結構相關,所以他是與主題無關的離線算法。
PageRank算法的思路是,對於圖(網絡)上的每個節點(一個具體的網頁)設置一個重要性初始值,每個節點的重要性程度會平均的分給由該節點的出度節點,每個節點的重要性程度也是由該節點的所有分給她的入度節點重要性的求和。那麼問題就變成了由當前的狀態通過轉移的方法獲得更新狀態的馬爾科夫鏈的過程。
定義些相關的符號:
- N 全部的節點個數
- 節點i的出度個數
- 節點i的PageRank得分,全部的節點的PR得分是一個長度爲N的向量 PR
- 阻尼係數
由之前的定義可以得到,每個節點的PR得分由該節點的入度所賦予的PR的和
如圖中所示
整理得到
其中的[1/2,0,1,0,0,0]是節點2的在圖上的入度情況,每個值是節點2的入度列表除以對應節點的總的出度數。
具體而言節點2的入度列表應該是[1,0,1,0,0,0],其中1代表所在位置的節點對節點2是有出度的(1,3有出度到2),然後每個入度列表在以此的除以每個節點上的出度數[2,2,1,3,0,2],其中每個數是對應位置上的出度數,兩個列表對應位置相除得到了對於節點2來說他的入度轉移向量。我們把所有節點的入度轉移向量拼接起來得到該圖的入度轉移矩陣A
以上這個圖片是從知乎複製過來的,他的定義和上文我的定義不一樣,
在圖片中每一行是對應節點的出度,每一列是對應節點的入度
所以按照上文我的定義來看,是需要將這個矩陣轉置之後在來進行計算的
在接下來的描述中,爲了方便起見,所有的矩陣都按照圖片的爲主,在計算時會添加轉置
在得到了轉移矩陣後,就得到了一個馬爾科夫鏈的計算過程
設置一個PR的初始狀態,一般是把所有節點的初始值設置爲1,那麼就可以進入循環中以此找到新的PR值向量。當的時候結束循環將最後的PR作爲最終的PR結果。
以上內容就是理想狀態下的PageRank算法,現在我們考慮下實際情況。
假設在圖中存在一個獨立的環,也就是存在一個0>1>2>0的循環結構,且環上的每個節點有且僅有一個入度和出度,那麼按照理想狀態下的PageRank算法,這樣的環會無限的循環下去無法跳出去。爲了防止這樣的情況發生,設置一個阻尼係數,意義是從一個節點按照鏈接方式鏈接到另外一個節點的概率,一般設置爲0.85,具體而言也就是當0>1,節點0到節點1之間存在一個有向的鏈接,那麼從0到1的會按照阻尼係數0.85的概率進行跳轉。對於每個節點的初始選擇按照 的比例進行選擇,那麼上面的PR的公式就要進行修改,
按照修改之後的PR計算公式就需要重新修改轉移矩陣A
其中e是一個長度爲N的全是1的向量,那麼就是一個N*N的方陣,這個方陣內全是1.
具體的計算沒有發生變化,依舊是按照馬爾科夫過程
其中A的每一行爲出度,每一列是入度。
至此,實際使用中的PageRank算法就推導完了。
計算
有三種計算方法
- 迭代法
按照馬爾科夫的迭代過程一直循環直到差值小於閾值 - 特徵向量法
P=AP,顯然P的A特徵值爲1時的特徵向量 - 代數計算
PageRank涉及到的數學內容
馬爾科夫過程
pagerank的python實現
參考網頁鏈接
https://www.cnblogs.com/rubinorth/p/5799848.html
https://blog.csdn.net/lingerlanlan/article/details/46991167
https://zhuanlan.zhihu.com/p/20201748
https://zhuanlan.zhihu.com/p/44279297