日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PageRank算法 -- 图算法

發布時間:2024/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PageRank算法 -- 图算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡述:

PageRank算法是一個迭代求解算法,可以處理網頁排名(根據網頁的重要性進行排序)、社會影響力分析、文本摘要 等問題。

????????PageRank算法在1996年由Page和Brin提出

????????PageRank適用于解決用有向圖表示的圖數據


二、各節點重要性的迭代計算公式:

PageRank算法是在圖上執行一個隨機游走模型,根據隨機游走者 在有向圖上 通過對 節點訪問次數或訪問概率 的高低?來判斷有向圖上各個節點的重要程度

首先給出算法的迭代公式,而后用一個實例對該迭代公式的各個部分的意義進行解釋:

對于各個節點,其重要程度(其被訪問概率)可以按以下公式迭代計算得出:?

(以節點X為例)

其中:

PR(X)表示節點的PR值,即節點 X 被訪問到的概率,當迭代結束后,PR(X)則代表節點X的重要程度

d?表示?阻尼系數,指用戶達到了當前節點后,愿意沿圖上的出邊情況 挑選任一節點 繼續向后游走的概率

?表示?在圖上指向節點X的節點

?表示?節點的出度


三、用一個實例來解釋公式的各個部分:? ? ? ??

最初的PageRank算法是用于對網頁的重要程度進行排名,那么我們就以網頁排名作為該算法的一個實際例子對迭代公式的各部分進行解釋:

????????在我們訪問網頁的時候,網頁A可能會鏈接到其他網頁上,比如鏈接到網頁B和網頁C。如果將這種網頁間的鏈接關系體現在圖結構數據上的話:那么,在圖數據中,網頁A、B、C均作為節點出現,且由于網頁A可以鏈接到網頁B和網頁C,那么,在圖上節點A應有兩條出邊,分別指向節點B和節點C。

????????現在有如下的網頁間的鏈接關系:

????????如圖1示,有ABCD四個網頁,網頁間的鏈接關系有:A鏈接到BCD;B鏈接到AD;C鏈接到A;D鏈接到C

? ? ? ? PageRank算法的核心思想就是:假設有一個隨機游走者,在圖上進行隨機游走。隨機游走者經過多次游走后,對不同的節點有著不同的訪問次數。顯然,隨機游走者訪問次數多的節點有著更高的重要性。算法就是在模擬隨機游走者在圖上的隨機游走過程,所以每次算法對各個節點PR值的迭代更新都對應著隨機游走者在圖上的一次隨機游走

PS:隨機游走者的"游走"體現為:如圖 1 示若隨機游走者當前所處位置為節點A,那么,隨機游走者可以向BCD三個節點進行下一步的游走;隨機游走者的"隨機"體現在:隨機游走者可以按照概率去隨機選擇下一個要游走到的節點

(一)常規情況:

????????直觀來感受,若當前隨機游走者在網頁B上,由于網頁B有兩條出邊分別鏈接到網頁A和D,那么,它有1/2的概率跳轉到網頁A,有1/2的概率跳轉到網頁D。由于網頁B沒有對網頁C的跳轉鏈接,所以圖數據上BC兩節點間沒有邊,所以由網頁B跳轉到網頁C的概率為0

? ? ? ? 因此,PageRank算法定義,對于一個網頁,若它可以跳轉到k個其他網頁上去(即,它在圖上有k條出邊),那么它跳轉到這k個網頁的概率都是 1/k

????????以圖1為例,先初始化每個網頁的被訪問概率值PR=1,

????????即:PR(A)=PR(B)=PR(C)=PR(D)=1

然后,對各個節點進行隨機游走分析:

????????如果隨機游走者想訪問到網頁A,那么要分別從:網頁B以1/2的概率鏈接到節點A;從網頁C以1/1的概率鏈接到節點A;從網頁D以0的概率鏈接到節點A。然后分別代入訪問網頁BCD的訪問概率值 與 對應各個網頁鏈接到網頁A的概率相乘,將上述三種情況發生的概率加和 得到 最終可以訪問網頁A的訪問概率。

因此,各個節點的PR值迭代公式應為?:

其中:

?PR(X)表示?節點的PR值,即節點X被訪問到的概率,當迭代結束后,PR(X)則代表節點X的重要程度

?表示?在圖上指向節點 X 的節點

?表示??節點的出度

????????每次迭代時,由于圖結構不變,所以計算各節點的訪問概率時,只有對應鏈接到該節點的對應節點PR值在變動,所以,為了加速計算,很自然的想到用矩陣來存儲圖的鏈接結構,我們稱該矩陣為轉移矩陣M

若拓撲圖上有n各個節點,那么轉移矩陣M的大小應該為n*n的方陣。

如果網頁 j 有 k 個出鏈,那么對于每一個出鏈所指向的網頁 i ,其 M[i][j] = 1/k

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?對于沒有被出鏈指向的網頁 t , 其 M[t][j] = 0

?那么,對于本圖結構,矩陣M為:

第一次迭代可以計算為:?

?表示第 i 次迭代后的各個節點的訪問概率;

“?? ” 表示數值的點乘;表示矩陣乘法

初始時,

那么經過一次迭代后,

按這種方式迭代10次,各節點的PR值變化如下:

迭代1000次,各點的PR值分別為:

PR(A)=1.494391 PR(B)=0.498127 PR(C)=1.245322 PR(D)=0.747192

對應代碼如下:

#include <iostream> using namespace std;int main() {double matrix[4][4]={0,0.5,1,0 , 0.33333,0,0,0 , 0.33333,0,0,1 , 0.33333,0.5,0,0 };double PR[4]={1,1,1,1};double PRtt[4]={0,0,0,0};/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<1000;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PRtt[i]=tt;}PR[0]=PRtt[0];PR[1]=PRtt[1];PR[2]=PRtt[2];PR[3]=PRtt[3]; //printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0; }

注意:

“每一輪迭代”的意思是,對節點ABCD的PR值都進行了一次更新。

????????在上述的這種迭代方式中,對于第 i 輪的迭代:對每個節點的PR值進行更新的時候,都是用的上一輪(即 i-1 輪次)中各個節點的PR值進行計算的。即:在第i輪迭代中,雖然對于節點B來說,新的PR值已經計算完了,但是,在計算CD節點的PR值時,仍舊采用的是B節點在 i-1 輪次的舊PR值。

????????那么,讀者可能會有疑惑,如果實時更新,在同一輪中,用最新的節點PR值對接下來的其他節點進行更新會產生與上述方法有什么不同么?

我們還是采用圖 1 對應的圖結構進行數值上的對比。只不過在這次的更新方式上,即使在同一輪,PR(A)的值計算結束,接下來計算PR(B)的值時選擇用剛剛得到的 更新后的 新的 PR(A)的值。對同一輪的其它節點的計算方法同理。

那么,代碼如下:

#include <iostream> using namespace std;int main() {double matrix[4][4]={0,0.5,1,0 , 0.33333,0,0,0 , 0.33333,0,0,1 , 0.33333,0.5,0,0 };double PR[4]={1,1,1,1};/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<10;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PR[i]=tt;} printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}//printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0; }

按這種方式迭代10次,各節點的PR值變化如下:

迭代1000次,各點的PR值分別為:

PR(A)=1.655606 PR(B)=0.551863 PR(C)=1.379663 PR(D)=0.827795

這樣一對比,雖然最終對于這四個節點計算得來的PR值不同,但是迭代后得出的網頁節點排名是相同的:A>C>D>B。同時,對于收斂速度來看,僅對該圖1對應的例子來說,是第一種方法收斂速度更快。

? ? ? ? 但,直覺上,我還是會覺得采用第二種方式來更新各個節點的PR值更好一些,所以接下來的演示會采用第二種方式。

(二)非常規情況:終止點問題? ?

上述的PageRank算法可以收斂,需要滿足一個條件:

? ? ? ? · 處理的圖是強連通圖,即,從任意節點可以到達其他的節點? ? ? ??

但是顯然網頁節點間的相互鏈接組成的圖,或者其他現實生活中產生的拓撲圖是不一定滿足這種強連接性的。總有一些網頁不指向任何其他的網頁節點,即,該網頁節點在拓撲圖上沒有任何的出邊。

? ? ? ? 此時,如果仍舊按照上述的PageRank算法,那么,隨機游走者到達這樣的網頁節點后就會走投無路,隨著一次又一次的迭代,隨機游走者不斷地到達這個不指向任何其他網頁節點的 “終止點網頁” ,這就會導致在迭代過程中,前面累積的轉移概率越變越小,最終變為0。
? ? ? ? 我們對圖 1 進行修改,將節點C →節點A的邊去掉,得到圖 2 。觀察圖 2 我們會發現此時的節點C就是一個“終止點”,在拓撲圖上,節點C沒有任何的出邊。

那么 ,此時的轉移矩陣M為:

按這種方式迭代10次,各節點的PR值變化如下:

可以很明顯的看出來,各點的PR值都在逐漸地變為0

(三)非常規情況:陷阱問題

網頁間的鏈接情況除了上述的終止點問題以外,還有一種情況就是,某個節點只存在一條唯一的出邊,并且這條出邊指向自己。如下圖3所示:

????????如圖3所示的這種情況下,隨機游走者到達節點 C 后就無法進入其他的網頁節點,相當于被困在了網頁節點 C 處。 所以,隨著迭代的進行,轉移概率會全部集中到節點 C 對應的網頁上。這樣會使得網頁排名無效。

按照上述的PageRank算法,圖三所示的轉移矩陣M應為:

按這種方式迭代10次,各節點的PR值變化如下:

?可以明顯的看出來,除了陷阱節點C以外,其他節點的PR值都顯著的變為了0。

(四)解決終止點和陷阱點問題

? ? ? ? 上面過程中,我們認為隨機游走者是一個盲目的,只按照節點的出邊情況進行盲目游走的游走者

????????但是,真實情況下的上網者并不會如此盲目

????????所以,我們用隨機游走者模擬上網者時,當它游走到一個終止點的網頁時,它可以選擇重新在瀏覽器搜索欄中輸入一個新的網址再次進行游走;當它游走到一個陷阱節點時,它同樣可以采用向瀏覽器中搜索欄中輸入一個新網址的方式跳出陷阱再次進行游走。

????????當然,向瀏覽器中輸入的新網址可以是導致當前游走終止的終止點網頁或導致游走陷入循環的陷阱點網頁,但也有可能是 讓游走者進入新的網頁,從而跳出終止或者陷阱情況的新網絡節點。

為了達到這樣的目標,對?“(一)常規情況 ”中提出的節點PR值的迭代計算公式進行更新:

? ? ? ? 假設拓撲圖上的網頁節點有N個,那么游走者通過在搜索欄中輸入網址到達某個網頁節點的概率為 1/N

? ? ? ? 同時,假設游走者每一步游走時查看當前網頁(或者說,按照當前網頁給出的鏈接進一步訪問后面的網頁)的概率為 d,那么,他拒絕查看當前網頁(或者說,拒絕按照當前網頁所給出的鏈接進一步訪問后面網頁,而是選擇從瀏覽器搜索欄中隨機輸入某一網頁地址進行訪問)的概率為 (1-d)?

那么,各個節點的PR值迭代計算公式由原來的:

變為:

????????所以,很明顯,當隨機游走者拒絕按照當前網頁所給出的鏈接進一步訪問后面網頁,而是選擇從瀏覽器搜索欄中隨機輸入某一網頁地址進行訪問,那么拓撲圖中網頁節點的數目為n,那么,進入某任一網頁節點的概率自然就是:

????????而由于 按照當前網頁給出的鏈接進一步訪問后面的網頁 的概率為 d,所以,原來的PR值迭代公式前面需要再一同乘上參數d。

那對于更新過的PR值結算迭代公式,其代碼如下:?

#include <iostream> using namespace std;int main() {double matrix[4][4]={0,0.5,0,0 , 0.33333,0,0,0 , 0.33333,0,1,1 , 0.33333,0.5,0,0 };double PR[4]={1,1,1,1};double d=0.85; //阻尼系數int N=4; //節點個數/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<10;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PR[i]=tt*d + (1-d)/ N ;} printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}//printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0; }

按這種方式迭代10次,各節點的PR值變化如下:

迭代1000次后的結果如下:?

所以,這四個網頁間的重要性排名為:C>D>A>B

?

參考鏈接:https://blog.csdn.net/gamer_gyt/article/details/47443877

總結

以上是生活随笔為你收集整理的PageRank算法 -- 图算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情综合激情 | 国产精品另类 | 欧美日韩黄色一级片 | 狠狠干人人干 | 国产人妻精品久久久久野外 | a√天堂资源| 国产精品丝袜黑色高跟 | 久久久青草 | 国产经典一区二区 | 国产视频一二区 | 欧美一级在线播放 | 日韩视频在线免费观看 | 又黄又爽的免费视频 | 看个毛片 | 69福利网| 又大又粗弄得我出好多水 | 久久精品无码专区免费 | 欧美aa大片 | 天天草夜夜 | 可以直接看的无码av | 国产男女猛烈无遮挡免费视频 | 精品视频入口 | 性色av一区二区三区红粉影视 | 玖玖成人 | 少妇无码一区二区三区 | 一级特黄aaa| 亚洲片国产一区一级在线观看 | a级大片免费看 | 无码人妻丰满熟妇啪啪网站 | 在线免费观看视频网站 | 白浆在线 | 欧美日韩中文字幕在线 | 成人黄色一级视频 | av中文资源 | 丰满岳乱妇一区二区 | 超碰在线9| 欧美激情一区二区三区四区 | 青青青操 | 爆操网站 | www.精品| 99re视频在线播放 | 五月天小说网 | 91福利网址| 美女在线一区 | aⅴ在线免费观看 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 久久艹国产 | 91视频二区 | 国产美女黄色片 | 欧美18一19性内谢 | 毛片毛片毛片毛片毛片毛片毛片 | wwwxxxxx日本| 国产精品午夜久久 | 欧美成人免费大片 | 特级淫片裸体免费看冫 | 老司机午夜福利视频 | 日韩欧美在线一区二区三区 | www.伊人.com | 欧美日韩在线视频一区二区 | 一本久草 | 丁香六月色 | 国产日韩精品在线 | 三级视频网站 | 玖玖热视频 | 欧美在线中文 | 午夜久久久久久久久久久 | 91大神久久 | 青青草手机在线观看 | 91午夜影院 | 特级黄色一级片 | 99精品福利 | 国产激情视频网站 | 蜜桃av噜噜一区二区三区小说 | 免费成人一级片 | 国产乡下妇女做爰毛片 | 少妇人妻偷人精品视频蜜桃 | 三区在线视频 | xxxxxx国产| 手机av不卡 | 很黄很污的视频 | 黄色av影视 | 奇米影视四色777 | 成 人 黄 色 片 在线播放 | 自拍偷拍综合 | 毛片亚洲av无码精品国产午夜 | 影音先锋中文字幕资源 | 色老头在线观看 | 天天操天天射天天爱 | 在线观看国产精品入口男同 | 亚洲一区二区三区人妻 | 91久久精品国产 | 性生交大全免费看 | 日批黄色 | 欧美亚洲激情 | 一区二区三区在线播放 | 日本欧美一区二区三区 | 日韩一区二区av | 国产美女操 | 国产又爽又黄的视频 |