一、引言
1. 鏈接分析算法
鏈接分析是指源于對(duì)Web結(jié)構(gòu)中超鏈接的多維分析座硕。在圖網(wǎng)絡(luò)的鏈接分析中闰挡,存在兩類模型:
- 隨機(jī)游走模型:網(wǎng)頁(yè)節(jié)點(diǎn)通過(guò)鏈接進(jìn)行跳轉(zhuǎn),對(duì)應(yīng)跳轉(zhuǎn)的概率析校;這類模型主要基于PageRank构罗,如隨機(jī)游走模型(random walk)、主題敏感PageRank勺良、智能游走模型及偏置游走模型绰播;
-
子集傳播模型:網(wǎng)頁(yè)劃分子集,給予特殊子集內(nèi)網(wǎng)頁(yè)初始權(quán)重尚困,根據(jù)特殊子集內(nèi)網(wǎng)頁(yè)與其他網(wǎng)頁(yè)的鏈接關(guān)系蠢箩,將權(quán)值傳遞到其他網(wǎng)頁(yè)。這類模型包括Hilltop算法事甜、HITS算法谬泌、PHITS算法。
算法之間關(guān)系如下:
其中的兩個(gè)算法最為經(jīng)典逻谦,一個(gè)是PageRank算法掌实,另外一個(gè)為HITS(Hyperlink - Induced Topic Search)算法。本文先介紹PageRank算法邦马,在后續(xù)文章中會(huì)對(duì)HITS算法原理做一簡(jiǎn)單介紹贱鼻。
2. PageRank算法背景及應(yīng)用
隨著網(wǎng)絡(luò)信息量越來(lái)越龐大,如何有效的搜索出用戶真正需要的信息非常重要滋将。自1998年搜索引擎網(wǎng)站Google創(chuàng)立以來(lái)邻悬,網(wǎng)絡(luò)搜索引擎稱為解決上述問(wèn)題的主要手段。
1998年随闽,美國(guó)斯坦福大學(xué)博士生Larry Page和Sergey Brin創(chuàng)立了Google公司父丰,他們核心技術(shù)是通過(guò)PageRank技術(shù)對(duì)海量的網(wǎng)頁(yè)進(jìn)行重要性分析。該技術(shù)利用網(wǎng)頁(yè)相互鏈接的關(guān)系對(duì)網(wǎng)頁(yè)進(jìn)行組織掘宪,確定出每個(gè)網(wǎng)頁(yè)的重要級(jí)別(Page Rank)蛾扇。當(dāng)用戶進(jìn)行搜索時(shí),Google找出符合搜索條件的網(wǎng)頁(yè)魏滚,并按它們的PageRank大小依次列出镀首。用戶一般在顯示結(jié)果的第一頁(yè)或者前幾頁(yè)就能找到真正有用的結(jié)果。在 Google技術(shù)的發(fā)展基礎(chǔ)上鼠次, PR只是目前頁(yè)面排序的一個(gè)小小的權(quán)重更哄,谷歌最新的算法稱為企鵝算法(Google Penguin)靖秩。
形象的解釋,PageRank的基本原理是:如果網(wǎng)頁(yè)A鏈接到網(wǎng)頁(yè)B竖瘾,則認(rèn)為“網(wǎng)頁(yè)A投了網(wǎng)頁(yè)B”一票,如果網(wǎng)頁(yè)A級(jí)別高花颗,則網(wǎng)頁(yè)B級(jí)別也相應(yīng)的高捕传。
PageRank除了網(wǎng)站搜索之外,還有很多其他應(yīng)用扩劝。更進(jìn)一步說(shuō)庸论,只要有圖譜,就可以使用PageRank棒呛。以下為一些應(yīng)用舉例:
- 社交網(wǎng)絡(luò):評(píng)估社交網(wǎng)絡(luò)節(jié)點(diǎn)影響力聂示,如尋找關(guān)系網(wǎng)中的牛人;基于用戶的相似度的內(nèi)容推薦簇秒、可以挖掘用戶的價(jià)值鱼喉、用戶的社交影響力等
- 生物領(lǐng)域:基因、蛋白研究趋观,如通過(guò)PageRank確定七個(gè)與遺傳有關(guān)的腫瘤基因(Google Goes Cancer: Improving Outcome Prediction for Cancer Patients by Network-Based Ranking of Marker Genes )扛禽;
- 體育運(yùn)動(dòng):評(píng)估特定體育運(yùn)動(dòng)項(xiàng)目中歷史最佳球隊(duì)或球員(1968年文章);
- 神經(jīng)科學(xué):評(píng)估不同大腦區(qū)域之間的聯(lián)結(jié)和重要性皱坛;
- 交通網(wǎng)絡(luò):預(yù)測(cè)城市的交通流量和人流動(dòng)向编曼;
- 推薦系統(tǒng):在推薦系統(tǒng)中,用戶行為數(shù)據(jù)可以表示成圖的形式剩辟,具體來(lái)說(shuō)是二部圖掐场。用戶的行為數(shù)據(jù)集由一個(gè)個(gè)(u,i)二元組組成,表示為用戶u對(duì)物品i產(chǎn)生過(guò)行為贩猎。用戶對(duì)他產(chǎn)生過(guò)行為的物品的興趣度是一樣的熊户,也就是只考慮“感興趣”O(jiān)R“不感興趣”。用G(V, E)來(lái)表示這個(gè)圖融欧,則頂點(diǎn)集V=U∪I敏弃,圖中的邊則是由數(shù)據(jù)集中的二元組確定。二元組(u, i)表示u對(duì)i有過(guò)行為噪馏,則在圖中表現(xiàn)為有邊相連麦到,即e(u,i)。對(duì)u進(jìn)行推薦物品欠肾,就轉(zhuǎn)化為計(jì)算用戶頂點(diǎn)u和與所有物品頂點(diǎn)之間的相關(guān)性瓶颠,然后取與用戶沒(méi)有直接邊相連的物品,按照相關(guān)性的高低生成推薦列表刺桃。
二粹淋、原始算法原理
PageRank的核心思想
- 如果一個(gè)網(wǎng)頁(yè)被很多其他網(wǎng)頁(yè)鏈接到,則說(shuō)明這個(gè)網(wǎng)頁(yè)很重要,也就是PageRank值會(huì)相對(duì)較高桃移;
-
如果一個(gè)PageRank很高的網(wǎng)頁(yè)鏈接到一個(gè)其他的網(wǎng)頁(yè)屋匕,則鏈接到的網(wǎng)頁(yè)的PageRank 值會(huì)相應(yīng)的提高。
如下圖借杰,每個(gè)球代表一個(gè)網(wǎng)頁(yè)过吻,球的大小反應(yīng)了網(wǎng)頁(yè)的PageRank值的大小。指向網(wǎng)頁(yè)B和網(wǎng)頁(yè)E的鏈接很多蔗衡,所以B和E的PageRank值較高纤虽,另外,雖然很少有網(wǎng)頁(yè)指向C绞惦,但是最重要的網(wǎng)頁(yè)B指向了C逼纸,所以C的PageRank值比E還要大。
PageRank算法預(yù)先給每個(gè)網(wǎng)頁(yè)設(shè)定一個(gè)PR值济蝉,PR值物理意義上代表一個(gè)網(wǎng)頁(yè)被訪問(wèn)的概率杰刽,常規(guī)設(shè)置為1/N,N為網(wǎng)頁(yè)總數(shù)堆生。所有網(wǎng)頁(yè)的PR值總和為1专缠。多個(gè)網(wǎng)頁(yè)的連接可以認(rèn)為是一個(gè)有向圖(不含權(quán)重與時(shí)間,圖為靜態(tài))淑仆。
第1步:假設(shè)有5個(gè)網(wǎng)頁(yè)涝婉,分別用A, B, C, D, E表示:
第2步:對(duì)網(wǎng)頁(yè)進(jìn)行爬蟲(chóng)決定鏈接關(guān)系如下圖
第3步:給每個(gè)網(wǎng)頁(yè)的rank賦值為1/N,N為網(wǎng)頁(yè)個(gè)數(shù)蔗怠,此例中為5墩弯,所以每個(gè)網(wǎng)頁(yè)的Rank值為0.2.
第4步:通過(guò)將鏈接到它的每個(gè)頁(yè)面的權(quán)重除以從引用頁(yè)面發(fā)出的鏈接數(shù)量,連續(xù)更新每個(gè)頁(yè)面的rank寞射。以E為例渔工,分別從C, D出發(fā)桥温,E有兩個(gè)進(jìn)入的鏈接引矩。因?yàn)镃可到達(dá)三個(gè)頁(yè)面,頁(yè)面C貢獻(xiàn)了1/3的Rank給頁(yè)面E侵浸;同理旺韭,頁(yè)面D貢獻(xiàn)了1/2 Rank給頁(yè)面E,所以E的rank更新如下:
如果一個(gè)頁(yè)面沒(méi)有出去的鏈接掏觉,則其權(quán)重平均分配到剩余節(jié)點(diǎn)区端,如示例中E鲫骗,E的rank均分值A(chǔ)权旷, B, C盗似, D。之所以均分是因?yàn)榱ち冢?dāng)用戶到達(dá)一個(gè)沒(méi)有外部鏈接的網(wǎng)站后危虱,會(huì)繼續(xù)搜索其他網(wǎng)頁(yè)。
第5步:重復(fù)第4步直到頁(yè)面rank不在發(fā)生變化
注:在實(shí)際應(yīng)用中唐全,PageRank算法會(huì)添加一個(gè)阻尼系數(shù)來(lái)模擬用戶停止搜索的情況槽地,在添加阻尼系數(shù)后,一個(gè)網(wǎng)頁(yè)的PR值計(jì)算如下:
其中是所有對(duì)網(wǎng)頁(yè)有出鏈的網(wǎng)頁(yè)集合(進(jìn)入的節(jié)點(diǎn)集合)芦瘾, 是網(wǎng)頁(yè)的出鏈數(shù)目,為網(wǎng)頁(yè)總數(shù)集畅,一般取0.85近弟。根據(jù)上述公式,反復(fù)計(jì)算網(wǎng)頁(yè)P(yáng)R值挺智,在不斷迭代穩(wěn)定時(shí)祷愉,為最終結(jié)果。
三赦颇、PageRank算法變種
1. 無(wú)向圖的PageRank
無(wú)向圖的PageRank統(tǒng)計(jì)上與圖的鏈接分布(degree distribution)相近二鳄,但又存在不同。假定是PageRank向量媒怯,是鏈接分布向量订讼。
表示頁(yè)面的鏈接,為無(wú)向圖的邊集合扇苞,為圖的總邊數(shù)欺殿。
2. 主題敏感PageRank(Topic-Sensitive PageRank)
PageRank算法遵循隨機(jī)游走模型,即用戶在瀏覽某網(wǎng)頁(yè)時(shí)鳖敷,如果希望跳轉(zhuǎn)到其他頁(yè)面脖苏,可隨機(jī)選擇本網(wǎng)頁(yè)包含的某個(gè)鏈接,進(jìn)入另外一個(gè)頁(yè)面定踱,與查詢搜索的主題無(wú)關(guān)棍潘。主題敏感PageRank引入更符合現(xiàn)實(shí)的假設(shè):一般用戶會(huì)對(duì)特定領(lǐng)域感興趣,當(dāng)瀏覽某一網(wǎng)頁(yè)時(shí)崖媚,這個(gè)頁(yè)面與主題相關(guān)亦歉;當(dāng)用戶瀏覽完畢后,希望跳轉(zhuǎn)到主題類似的鏈接至扰。主題敏感PageRank將用戶興趣鳍徽、頁(yè)面主題以及鏈接所指向網(wǎng)頁(yè)與當(dāng)前網(wǎng)頁(yè)主題相似程度綜合考慮而建立模型。
主題敏感PageRank引入16類主題敢课,對(duì)于某網(wǎng)頁(yè)阶祭,對(duì)應(yīng)某個(gè)主題類型都有相應(yīng)的PageRank分值绷杜,即每個(gè)網(wǎng)頁(yè)會(huì)被賦予16個(gè)主題相關(guān)的PageRank分值。主題敏感與查詢相關(guān)濒募,在接收到用戶查詢后鞭盟,主題敏感PageRank需要分類器,計(jì)算該查詢隸屬于事先定義好的16個(gè)主題的隸屬度瑰剃。16大主題如下:
ODP(Open Directory Project)是人工整理的多層級(jí)網(wǎng)頁(yè)分類導(dǎo)航站點(diǎn)齿诉,在頂級(jí)的16個(gè)大分類下還有更細(xì)致的小粒度分類結(jié)構(gòu),在最底層目錄下晌姚,人工收集了符合該目錄主題的精選高質(zhì)量網(wǎng)頁(yè)地址粤剧,以供互聯(lián)網(wǎng)用戶導(dǎo)航尋址。主題敏感PageRank采用了ODP最高級(jí)別的16個(gè)分類類別作為事先定義的主題類型挥唠。其計(jì)算流程如下:
(1) 確定話題分類:參考IDP網(wǎng)站抵恋;
(2)網(wǎng)頁(yè)主題歸屬:將每個(gè)頁(yè)面歸入最合適的分類,歸類方法如使用TF-IDF 或聚類后人工歸類宝磨。每個(gè)頁(yè)面會(huì)被歸屬到一類主題弧关;
(3)分主題計(jì)算網(wǎng)頁(yè)的PageRank向量:在計(jì)算網(wǎng)頁(yè)在特定類別的PageRank分值時(shí),在每個(gè)類別中網(wǎng)頁(yè)劃分為兩個(gè)集合唤锉,一個(gè)集合是ODP對(duì)應(yīng)分類主題下所包括的所有網(wǎng)頁(yè)世囊,即人工精選的高質(zhì)量網(wǎng)頁(yè),可以稱之為集合S窿祥,剩下的網(wǎng)頁(yè)放入另外一個(gè)集合內(nèi)株憾,可稱之為集合T。在計(jì)算PageRank時(shí)晒衩,由于集合S內(nèi)的網(wǎng)頁(yè)能夠很好地表征分類主題号胚,所以賦予較大的跳轉(zhuǎn)概率值。通過(guò)這種設(shè)定浸遗,集合S內(nèi)的網(wǎng)頁(yè)根據(jù)鏈接關(guān)系向集合T中網(wǎng)頁(yè)傳遞權(quán)值猫胁,因?yàn)橹苯佑墟溄又赶虻耐黝}類似,這樣就將與該分類主題內(nèi)容相似的網(wǎng)頁(yè)賦予較高的PageRank值跛锌,而無(wú)關(guān)的網(wǎng)頁(yè)則賦予較低權(quán)重的PageRank分值弃秆。
假設(shè)有個(gè)編號(hào)為1號(hào)的網(wǎng)頁(yè)菠赚,其被列為ODP目錄中的藝術(shù)類別中,在對(duì)藝術(shù)類別進(jìn)行PageRank計(jì)算時(shí)郑藏,1號(hào)網(wǎng)頁(yè)在集合S內(nèi)衡查,計(jì)算結(jié)束后,該網(wǎng)頁(yè)獲得的PageRank分值為0.5必盖。當(dāng)計(jì)算體育和商業(yè)類別的主題PageRank分值時(shí)拌牲,1號(hào)網(wǎng)頁(yè)在集合T中俱饿,獲得了相應(yīng)的集合S中網(wǎng)頁(yè)傳遞的權(quán)值,分別為0.02和0.01塌忽。在所有類別計(jì)算結(jié)束后拍埠,1號(hào)網(wǎng)頁(yè)獲得了3個(gè)不同主題對(duì)應(yīng)的PageRank分值,組成一個(gè)主題PageRank向量[0.5, 0.02, 0.01]土居。
(4)在線相似度計(jì)算:在用戶提交搜索時(shí)枣购,確定用戶的主題傾向,以選擇合適的Rank向量擦耀。例如用戶輸入查詢請(qǐng)求“喬丹”棉圈,“喬丹”隸屬于體育類別的概率為0.6, 娛樂(lè)類別的概率為0.1眷蜓, 商業(yè)類別的概率為0.3迄损,那么查詢條件的類別概率向量為[0.6, 0.1, 0.3]。
同時(shí)账磺,搜索系統(tǒng)讀取包含“喬丹”的所有網(wǎng)頁(yè),對(duì)于每個(gè)網(wǎng)頁(yè)痊远,利用計(jì)算好的分類主題PageRank向量與查詢條件的類別概率向量相乘垮抗,得到相似度。假定網(wǎng)頁(yè)A的分類主題PageRank向量為[0.2,0.3,0.1]碧聪,則相似度為:
對(duì)于其他網(wǎng)頁(yè)類似冒版,計(jì)算所搜尋到網(wǎng)頁(yè)相似度,按照相似度由高到低排序輸出逞姿,作為搜索結(jié)果返回到用戶辞嗡。
3. PersonalRank
在推薦系統(tǒng)中,目標(biāo)一般是向用戶推薦商品滞造,如在購(gòu)物網(wǎng)站中续室,需要根據(jù)用戶歷史購(gòu)買行為,向用戶推薦實(shí)際的商品谒养;在社交網(wǎng)站中挺狰,推薦的可能是用戶,圖展示如下:
A买窟、B丰泊、C表示三個(gè)用戶,a始绍、b瞳购、c、d表示四個(gè)商品亏推,中間聯(lián)系表示用戶與商品之間有過(guò)關(guān)聯(lián)学赛,推薦的目的是從商品列表中向指定的用戶推薦用戶未接觸過(guò)的商品年堆。 推薦算法種類很多,包括協(xié)同過(guò)濾(基于用戶的協(xié)同過(guò)濾罢屈、基于物品的協(xié)同過(guò)濾)和其他算法嘀韧。在協(xié)同過(guò)濾中,用戶與商品之間的關(guān)系表示成二維矩陣(用戶商品矩陣)缠捌,而在基于圖的推薦算法中锄贷,上述關(guān)系表示為二部圖的形式。
PersonalRank算法對(duì)每個(gè)節(jié)點(diǎn)打分曼月,具體講谊却,算法不區(qū)分用戶和商品。若計(jì)算用戶A對(duì)所有商品的感興趣程度轉(zhuǎn)變?yōu)閷?duì)用戶A計(jì)算各個(gè)節(jié)點(diǎn)B哑芹、C炎辨、a、b聪姿、c碴萧、d的重要程度。
具體的過(guò)程如下(以用戶A為例):
- 初始化:
- 選擇PR值不為0的節(jié)點(diǎn)開(kāi)始末购,停在當(dāng)前節(jié)點(diǎn)的概率為破喻,往前走的概率為:
- 從A開(kāi)始,A到a盟榴、c的概率為0.5曹质, 則, A的PR值變?yōu)?;
- 此時(shí)PR值不為0的節(jié)點(diǎn)為A擎场、a羽德、c,從這三點(diǎn)出發(fā)迅办,繼續(xù)上述過(guò)程宅静,直到收斂為止。
節(jié)點(diǎn)PR的更新公式為:
若 , ;
若, ;
四站欺、PageRank算法R及python實(shí)現(xiàn)
1. R實(shí)現(xiàn):igraph包的page_rank函數(shù)
示例:
require(igraph)
g <- sample_gnp(20, 5/20, directed=TRUE)
#plot(g, layout=layout_with_kk, vertex.color="green")
page_rank(g)$vector
結(jié)果:
> page_rank(g)$vector
[1] 0.02341596 0.02631466 0.01231889 0.06031833 0.05306684 0.02874900 0.04125774
[8] 0.05669780 0.06568727 0.03468001 0.04879063 0.10330288 0.03968495 0.04109741
[15] 0.03534523 0.04664756 0.04055067 0.08679532 0.05055317 0.10472569
2. Python實(shí)現(xiàn)
使用第三方模塊python-graph坏为,python-graph模塊實(shí)現(xiàn)了很多圖算法,使用前需要安裝镊绪,代碼如下:
pip3 install graphviz
pip3 install python-graph-core
pip3 install python-graph-dot
python版本的算法實(shí)現(xiàn)帶阻尼系數(shù)的pagerank:
# coding=utf-8
# python-graph https://code.google.com/p/python-graph/
# Import graphviz
import graphviz as gv #可視化graph
# Import pygraph
from pygraph.classes.digraph import digraph
from pygraph.readwrite.dot import write
# Define pagerank function
def pagerank(graph, damping_factor=0.85, max_iterations=100, \
min_delta=0.00001):
"""
Compute and return the PageRank in an directed graph.
@type graph: digraph
@param graph: Digraph.
@type damping_factor: number
@param damping_factor: PageRank dumping factor.
@type max_iterations: number
@param max_iterations: Maximum number of iterations.
@type min_delta: number
@param min_delta: Smallest variation required for a new iteration.
@rtype: Dict
@return: Dict containing all the nodes PageRank.
"""
nodes = graph.nodes()
graph_size = len(nodes)
if graph_size == 0:
return {}
# value for nodes without inbound links
min_value = (1.0-damping_factor)/graph_size
# itialize the page rank dict with 1/N for all nodes
#pagerank = dict.fromkeys(nodes, 1.0/graph_size)
pagerank = dict.fromkeys(nodes, 1.0)
for i in range(max_iterations):
diff = 0 #total difference compared to last iteraction
# computes each node PageRank based on inbound links
for node in nodes:
rank = min_value
for referring_page in graph.incidents(node):
rank += damping_factor * pagerank[referring_page] / \
len(graph.neighbors(referring_page))
diff += abs(pagerank[node] - rank)
pagerank[node] = rank
print("This is NO.%s iteration" % (i+1))
print (pagerank)
print("")
#stop if PageRank has converged
if diff < min_delta:
break
return pagerank
# Graph creation
gr = digraph()
# Add nodes and edges
gr.add_nodes(["A","B","C","D","E"])
gr.add_edge(("A","B"))
gr.add_edge(("A","C"))
gr.add_edge(("B","A"))
gr.add_edge(("B","C"))
gr.add_edge(("B","D"))
gr.add_edge(("C","A"))
gr.add_edge(("C","D"))
gr.add_edge(("C","E"))
gr.add_edge(("D","A"))
gr.add_edge(("D","E"))
# Draw as PNG
# dot = write(gr)
# gvv = gv.readstring(dot)
# gv.layout(gvv,'dot')
# gv.render(gvv,'png','Model.png')
pagerank(gr)
示例結(jié)果:
This is NO.1 iteration
{'A': 1.0216666666666667, 'B': 0.4642083333333334, 'C': 0.5957340277777778, 'D': 0.3303170023148148, 'E': 0.3391760338541666}
This is NO.2 iteration
{'A': 0.4707017282986111, 'B': 0.23004823452690973, 'C': 0.2952285676428675, 'D': 0.17882842728143689, 'E': 0.1896501757600898}
This is NO.3 iteration
{'A': 0.2548305088760476, 'B': 0.13830296627232022, 'C': 0.17748880671614428, 'D': 0.11947433568006494, 'E': 0.13106508790026847}
This is NO.4 iteration
{'A': 0.17025092834409253, 'B': 0.10235664454623933, 'C': 0.13135769383434048, 'D': 0.09621906254116427, 'E': 0.10811111483305796}
This is NO.5 iteration
{'A': 0.1371121641211591, 'B': 0.08827266975149262, 'C': 0.11328325951441552, 'D': 0.0871075132920073, 'E': 0.0991176166781875}
This is NO.6 iteration
{'A': 0.12412820644111042, 'B': 0.08275448773747193, 'C': 0.10620159259642231, 'D': 0.08353755609460337, 'E': 0.09559391257585942}
This is NO.7 iteration
{'A': 0.1190410174348098, 'B': 0.08059243240979416, 'C': 0.10342695492590251, 'D': 0.08213882641178073, 'E': 0.0942133051206792}
This is NO.8 iteration
{'A': 0.11704782763678755, 'B': 0.07974532674563471, 'C': 0.1023398359902312, 'D': 0.08159079610849534, 'E': 0.09367237521000937}
This is NO.9 iteration
{'A': 0.11626688445460587, 'B': 0.07941342589320749, 'C': 0.10191389656294961, 'D': 0.08137607469591118, 'E': 0.09346043577193132}
This is NO.10 iteration
{'A': 0.11596090644167344, 'B': 0.07928338523771122, 'C': 0.10174701105506273, 'D': 0.08129194561628596, 'E': 0.09337739668585598}
This is NO.11 iteration
{'A': 0.11584102250320749, 'B': 0.0792324345638632, 'C': 0.10168162435695777, 'D': 0.08125898336089928, 'E': 0.0933448614961869}
This is NO.12 iteration
{'A': 0.11579405128928147, 'B': 0.07921247179794463, 'C': 0.10165600547402895, 'D': 0.08124606856039251, 'E': 0.09333211402247502}
This is NO.13 iteration
{'A': 0.11577564769855933, 'B': 0.07920465027188772, 'C': 0.10164596784892257, 'D': 0.08124100846756292, 'E': 0.09332711948924231}
This is NO.14 iteration
{'A': 0.11576843706627717, 'B': 0.0792015857531678, 'C': 0.10164203504989867, 'D': 0.08123902589420218, 'E': 0.09332516260250723}
This is NO.15 iteration
{'A': 0.11576561189923809, 'B': 0.07920038505717619, 'C': 0.10164049415670945, 'D': 0.08123824911060093, 'E': 0.09332439588307308}
{'A': 0.11576561189923809,
'B': 0.07920038505717619,
'C': 0.10164049415670945,
'D': 0.08123824911060093,
'E': 0.09332439588307308}
參考資料
[1] wiki: https://en.wikipedia.org/wiki/PageRank;
[2] Eric Roberts, CS 54N, The Google Page Rank Algorithm;
[3] PageRank算法--從原理到實(shí)現(xiàn): https://www.cnblogs.com/rubinorth/p/5799848.html;
[4] 深入淺出PageRank算法: https://segmentfault.com/a/1190000000711128;
[5] Google的PageRank算法無(wú)所不能?: https://36kr.com/p/214680;
[6] Christof Winter et.al, Google Goes Cancer: Improving Outcome Prediction for Cancer Patients by Network-Based Ranking of Marker Genes, PLOS Computational Biology, 2012.
[7]PageRank 與基于圖的推薦算法: https://donche.github.io/2017/10/31/PageRankNPersonalRank.html;
[8]鏈接分析算法總結(jié): http://www.reibang.com/p/d81bc99f1fe2;
[9]鏈接分析算法之:主題敏感PageRank: https://blog.csdn.net/hguisu/article/details/8005192;
[10] 大話主題敏感PageRank: https://blog.csdn.net/malefactor/article/details/7192168;
[11] PersonalRank:一種基于圖的推薦算法:https://www.cnblogs.com/zhangchaoyang/articles/5470763.html