六、PageRank算法与代码实战【CS224W】(Datawhale组队学习)
開源內容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W
子豪兄B 站視頻:https://space.bilibili.com/1900783/channel/collectiondetail?sid=915098
斯坦福官方課程主頁:https://web.stanford.edu/class/cs224w
目錄
- PageRank冷知識
- PageRank簡介
- 應用場景
- 理解PageRank的五種角度
- 求解PageRank
- 迭代左乘M矩陣
- PageRank收斂性分析
- PageRank存在的問題
- PageRank解決方案
- PageRank其它應用
- 代碼實戰
- 構建圖并進行可視化
- 對PageRank得分進行排名
- 用節點尺寸可視化PageRank值
- 總結
PageRank冷知識
- Google最早的搜索引擎算法。給每個網頁重要度打分,高分靠前。Page既有“網頁”的意思,也有“拉里·佩奇”的意思
- 兩位作者當年只有24歲,是斯坦福大學的phD
- 谷歌最早的辦公場地是車庫里的乒乓球桌
- 1997年之前的搜索引擎︰網頁收錄少、相關率20%、排序效果差
- 1997年之后,斯坦福大學Google搜索結果,相關率80%
- 搜索引擎成為互聯網第一個Killer App,開啟互聯網時代PageRank申請專利后,谷歌一舉超過雅虎、微軟
- 拉里·佩奇憑借PageRank,在30歲當選美國工程院院士
- 斯坦福大學擁有超過1%的Google股票。收益超過10億美元
PageRank簡介
PageRank是1997年谷歌第一代搜索引擎的底層算法。大幅提高了搜索結果的相關率和質量,成為互聯網第一個爆款應用,造就了傳奇的谷歌公司。
應用場景
PageRank把互聯網表示為由網頁節點和引用鏈接構成的有向圖,通過鏈接結構,計算網頁節點重要度。來自重要網頁節點的引用鏈接,權重更高。
理解PageRank的五種角度
我們可以通過線性方程組、矩陣乘法、特征值和特征向量、隨機游走、馬爾科夫鏈這五種角度,理解并求解PageRank值。
線性方程組
重要節點引出的稀少鏈接,權重更高
矩陣乘法
迭代左乘M矩陣
特征值和特征向量
對于Column Stochastic矩陣,由Perreon-Frobenius定理︰最大的特征值為1,存在唯一的主特征向量(特征值1對應的特征向量),向量所有元素求和為1
隨機游走
瀏覽者順著連接隨機游走,一個網頁的訪問次數比較多則說明這個網頁比較重要
馬爾科夫鏈
每個節點表示一種狀態,節點之間的連接表示狀態的轉移,根據狀態轉移矩陣,可以計算下一個時刻的狀態轉移概率
求解PageRank
- 迭代求解線性方程組(O(n3)O(n^{3})O(n3),不推薦)
- 迭代左乘M矩陣(推薦,冪迭代)
- 矩陣的特征向量(O(n3)O(n^3)O(n3),不推薦)
- 隨機游走(需模擬很多游走,不推薦)
- 馬爾科夫鏈(和求解矩陣特征向量等價,不推薦)
迭代左乘M矩陣
PageRank收斂性分析
Ergodic定理:如果滿足irreducible(非彼此孤立)和aperiodic(非周期性質震蕩)的馬爾科夫鏈,則一定滿足:
- 存在唯一的解π\piπ
- 能從π0\pi_0π0?收斂到π\piπ
PageRank存在的問題
僅指向自己的節點(刷抖音刷的停不下來)
沒有出連接(看到這個網頁之后全部退網了)
違背了每一列求和為1的假設
PageRank解決方案
PageRank其它應用
-
尋找與指定節點最相似的節點(Proximity on graphs):同一個用戶訪問過的節點更可能是相似的(基本假設)
-
PageRank變種::將“隨機傳送到任一節點”優化為“隨機傳送到指定的一些節點”或“隨機傳送到指定的一個節點”,用訪問次數來反映節點的親疏遠近。
- Topic-Specific PageRank或Personalized PageRank:隨機傳送到指定的一些節點
- Random Walk with Restarts:隨機傳送到指定的一個節點
代碼實戰
import networkx as nx # 圖數據挖掘 import numpy as np # 數據分析 import random # 隨機數 import pandas as pd# 數據可視化 import matplotlib.pyplot as plt import matplotlib as mpl %matplotlib inline plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False # 用來正常顯示負號構建圖并進行可視化
OpenKG-四大名著人物關系知識圖譜和OWL本體:http://www.openkg.cn/dataset/ch4masterpieces
df = pd.read_csv('data/三國演義/triples.csv') df edges = [edge for edge in zip(df['head'], df['tail'])]G = nx.DiGraph() G.add_edges_from(edges)# 可視化 plt.figure(figsize=(15,14)) pos = nx.spring_layout(G, iterations=3, seed=5) nx.draw(G, pos, with_labels=True) plt.show()對PageRank得分進行排名
pagerank = nx.pagerank(G, # NetworkX graph 有向圖,如果是無向圖則自動轉為雙向有向圖alpha=0.85, # Damping Factorpersonalization=None, # 是否開啟Personalized PageRank,隨機傳送至指定節點集合的概率更高或更低max_iter=100, # 最大迭代次數tol=1e-06, # 判定收斂的誤差nstart=None, # 每個節點初始PageRank值 dangling=None, # Dead End死胡同節點)sorted(pagerank.items(),key=lambda x : x[1], reverse=True)用節點尺寸可視化PageRank值
# 節點尺寸 node_sizes = (np.array(list(pagerank.values())) * 8000).astype(int) # 節點顏色 M = G.number_of_edges() edge_colors = range(2, M + 2) plt.figure(figsize=(15,14))# 繪制節點 nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_sizes)# 繪制連接 edges = nx.draw_networkx_edges(G,pos,node_size=node_sizes, # 節點尺寸arrowstyle="->", # 箭頭樣式arrowsize=20, # 箭頭尺寸edge_color=edge_colors, # 連接顏色edge_cmap=plt.cm.plasma,# 連接配色方案,可選:plt.cm.Blueswidth=4 # 連接線寬 )# 設置每個連接的透明度 edge_alphas = [(5 + i) / (M + 4) for i in range(M)] for i in range(M):edges[i].set_alpha(edge_alphas[i])# # 圖例 # pc = mpl.collections.PatchCollection(edges, cmap=cmap) # pc.set_array(edge_colors) # plt.colorbar(pc)ax = plt.gca() ax.set_axis_off() plt.show()總結
????PageRank是1997年谷歌第一代搜索引擎的底層算法。大幅提高了搜索結果的相關率和質量,成為互聯網第一個爆款應用,造就了傳奇的谷歌公司。PageRank把互聯網表示為由網頁節點和引用鏈接構成的有向圖,通過鏈接結構,計算網頁節點重要度。來自重要網頁節點的引用鏈接,權重更高。
????我們可以通過線性方程組、矩陣乘法、特征值和特征向量、隨機游走、馬爾科夫鏈,五種角度,理解并求解PageRank值。之后對PageRank的收斂性分析并針對特殊節點的進行改進,最后擴展PageRank在推薦系統中計算節點相似度排序的升級變種。
????在代碼實戰中,使用Networkx計算三國演義人物有向圖的節點重要度。
總結
以上是生活随笔為你收集整理的六、PageRank算法与代码实战【CS224W】(Datawhale组队学习)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pr 入门系列之四:编辑(基础篇)
- 下一篇: [分享]低工作电流超低功耗LCD液晶显示