數據挖掘算法10 - PageRank

PageRank

PageRank 的簡化模型

假設一共有 4 個網頁 A、B、C、D。它們之間的鏈接信息如圖所示:

出鏈指的是鏈接出去的鏈接。入鏈指的是鏈接進來的鏈接。比如圖中 A 有 2 個入鏈,3 個出鏈。

簡單來說,一個網頁的影響力 = 所有入鏈集合的頁面的加權影響力之和,用公式表示爲:

u 爲待評估的頁面,Bu 爲頁面 u 的入鏈集合。針對入鏈集合中的任意頁面 v,它能給 u 帶來的影響力是其自身的影響力 PR(v) 除以 v 頁面的出鏈數量,即頁面 v 把影響力 PR(v) 平均分配給了它的出鏈,這樣統計所有能給 u 帶來鏈接的頁面 v,得到的總和就是網頁 u 的影響力,即爲 PR(u)。

所以你能看到,出鏈會給被鏈接的頁面賦予影響力,當我們統計了一個網頁鏈出去的數量,也就是統計了這個網頁的跳轉概率。

至此,我們模擬了一個簡化的 PageRank 的計算過程,實際情況會比這個複雜,可能會面臨兩個問題:

  • 等級泄露(Rank Leak):如果一個網頁沒有出鏈,就像是一個黑洞一樣,吸收了其他網頁的影響力而不釋放,最終會導致其他網頁的 PR 值爲 0。

  • 等級沉沒(Rank Sink):如果一個網頁只有出鏈,沒有入鏈(如下圖所示),計算的過程迭代下來,會導致這個網頁的 PR 值爲 0(也就是不存在公式中的 V)。

針對等級泄露和等級沉沒的情況,我們需要靈活處理。

比如針對等級泄露的情況,我們可以把沒有出鏈的節點,先從圖中去掉,等計算完所有節點的 PR 值之後,再加上該節點進行計算。不過這種方法會導致新的等級泄露的節點的產生,所以工作量還是很大的。

有沒有一種方法,可以同時解決等級泄露和等級沉沒這兩個問題呢?

PageRank 的隨機瀏覽模型

爲了解決簡化模型中存在的等級泄露和等級沉沒的問題,拉里·佩奇提出了 PageRank 的隨機瀏覽模型。他假設了這樣一個場景:用戶並不都是按照跳轉鏈接的方式來上網,還有一種可能是不論當前處於哪個頁面,都有概率訪問到其他任意的頁面,比如說用戶就是要直接輸入網址訪問其他頁面,雖然這個概率比較小。

所以他定義了阻尼因子 d,這個因子代表了用戶按照跳轉鏈接來上網的概率,通常可以取一個固定值 0.85,而 1-d=0.15 則代表了用戶不是通過跳轉鏈接的方式來訪問網頁的,比如直接輸入網址。

其中 N 爲網頁總數,這樣我們又可以重新迭代網頁的權重計算了,因爲加入了阻尼因子 d,一定程度上解決了等級泄露和等級沉沒的問題。

通過數學定理(這裏不進行講解)也可以證明,最終 PageRank 隨機瀏覽模型是可以收斂的,也就是可以得到一個穩定正常的 PR 值。

PageRank 在社交影響力評估中的應用

  • 微博影響力
  • 職場影響力
  • 企業經營能力

在做一個關於 PageRank 算法的實戰之前,你需要思考三個問題

  • 如何使用工具完成 PageRank 算法,包括使用工具創建網絡圖,設置節點、邊、權重等,並通過創建好的網絡圖計算節點的 PR 值;
  • 對於一個實際的項目,比如希拉里的 9306 封郵件(工具包中郵件的數量),如何使用 PageRank 算法挖掘出有影響力的節點,並且繪製網絡圖;
  • 如何對創建好的網絡圖進行可視化,如果網絡中的節點數較多,如何篩選重要的節點進行可視化,從而得到精簡的網絡關係圖。

如何使用工具實現 PageRank 算法

PageRank 算法工具在 sklearn 中並不存在,我們需要找到新的工具包。實際上有一個關於圖論和網絡建模的工具叫 NetworkX,它是用 Python 語言開發的工具,內置了常用的圖與網絡分析算法,可以方便我們進行網絡數據分析。

上節課,我舉了一個網頁權重的例子,假設一共有 4 個網頁 A、B、C、D,它們之間的鏈接信息如圖所示:

針對這個例子,我們看下用 NetworkX 如何計算 A、B、C、D 四個網頁的 PR 值,具體代碼如下:

import networkx as nx
# 創建有向圖
G = nx.DiGraph() 
# 有向圖之間邊的關係
edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
for edge in edges:
    G.add_edge(edge[0], edge[1])
pagerank_list = nx.pagerank(G, alpha=1)
print("pagerank 值是:", pagerank_list)

NetworkX 工具把中間的計算細節都已經封裝起來了,我們直接調用 PageRank 函數就可以得到結果:

pagerank 值是: {'A': 0.33333396911621094, 'B': 0.22222201029459634, 'C': 0.22222201029459634, 'D': 0.22222201029459634}

我們通過 NetworkX 創建了一個有向圖之後,設置了節點之間的邊,然後使用 PageRank 函數就可以求得節點的 PR 值。

總結

今天我給你講了 PageRank 的算法原理,對簡化的 PageRank 模型進行了模擬。針對簡化模型中存在的等級泄露和等級沉沒這兩個問題,PageRank 的隨機瀏覽模型引入了阻尼因子 d 來解決。

同樣,PageRank 有很廣的應用領域,在許多網絡結構中都有應用,比如計算一個人的微博影響力等。它也告訴我們,在社交網絡中,鏈接的質量非常重要。

通過矩陣乘法求得網頁的權重,使用 NetworkX 可以得到相同的結果。

另外我帶你用 PageRank 算法做了一次實戰,我們將一個複雜的網絡圖,通過 PR 值的計算、篩選,最終得到了一張精簡的網絡圖。在這個過程中我們學習了 NetworkX 工具的使用,包括創建圖、節點、邊及 PR 值的計算。

實際上掌握了 PageRank 的理論之後,在實戰中往往就是一行代碼的事。但項目與理論不同,項目中涉及到的數據量比較大,你會花 80% 的時間(或 80% 的代碼量)在預處理過程中,比如今天的項目中,我們對別名進行了統一,對邊的權重進行計算,同時還需要把計算好的結果以可視化的方式呈現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章