算法學(xué)習(xí)(2)--- 谷歌PageRank算法

圖片來自網(wǎng)絡(luò)

1. 從Google網(wǎng)頁排序到PageRank算法

(1)谷歌網(wǎng)頁怎么排序协屡?

  • 先對搜索關(guān)鍵詞進行分詞全谤,如“技術(shù)社區(qū)”分詞為“技術(shù)”和“社區(qū)”;
  • 根據(jù)建立的倒排索引返回同時包含分詞后結(jié)果的網(wǎng)頁认然;
  • 將返回的網(wǎng)頁相關(guān)性(類似上篇文章所講的文本相似度)網(wǎng)頁,相關(guān)性越高排名越靠前

(2)怎么處理垃圾網(wǎng)頁盈匾?
那么問題來了子刮,假如有某個垃圾網(wǎng)頁中雖然也包含大量的查詢詞,但卻并非滿足用戶需要的文檔挺峡,因此,頁面本身的重要性在網(wǎng)頁排序中也起著很重要的作用橱赠。
(3)如何度量網(wǎng)頁本身的重要性箫津?
實際上互聯(lián)網(wǎng)上的每一篇HTML文檔除了包含文本狭姨、圖片苏遥、視頻等信息外,還包含了大量的鏈接關(guān)系师抄,利用這些鏈接關(guān)系,能夠發(fā)現(xiàn)某些重要的網(wǎng)頁叨吮,其中網(wǎng)頁是節(jié)點瞬矩,網(wǎng)頁間的鏈接關(guān)系是邊茶鉴。

圖片來自網(wǎng)絡(luò)

如上圖景用,某網(wǎng)頁1鏈向網(wǎng)頁2,則可以認為網(wǎng)頁1覺得網(wǎng)頁2有鏈接價值围肥,是比較重要的網(wǎng)頁剿干。某網(wǎng)頁被指向的次數(shù)越多穆刻,則它的重要性越高;越是重要的網(wǎng)頁氢伟,所鏈接的網(wǎng)頁的重要性也越高。
通過下圖我們可以更形象地看出鏈向網(wǎng)頁E的鏈接遠遠大于鏈向網(wǎng)頁C的鏈接谬盐,但是網(wǎng)頁C的重要性卻大于網(wǎng)頁E。這是因為網(wǎng)頁C被網(wǎng)頁B所鏈接飞傀,而網(wǎng)頁B有很高的重要性诬烹。

圖片來自網(wǎng)絡(luò)

(4)PageRank核心思想
PageRank對網(wǎng)頁的排序可以獨立于用戶搜索進行。如果一個網(wǎng)頁被很多其它網(wǎng)頁所鏈接绞吁,說明它受到普遍的承認和信賴,那么它的排名就高家破。這就是 Page Rank 的核心思想。當(dāng)然 Google 的 Page Rank 算法實際上要復(fù)雜得多汰聋。比如說,對來自不同網(wǎng)頁的鏈接對待不同庄拇,本身網(wǎng)頁排名高的鏈接更可靠,于是給這些鏈接予較大的權(quán)重措近。
通俗理解女淑,我們可以將互聯(lián)網(wǎng)中的網(wǎng)頁理解成我們現(xiàn)實中的每個人,人與人之間的聯(lián)系就類似于網(wǎng)頁與網(wǎng)頁之間聯(lián)系鸭你,一般人的社交影響力是跟其人脈的廣度與人脈的質(zhì)量有關(guān)擒权,網(wǎng)頁也同理阁谆,其重要性也跟網(wǎng)頁的被鏈的數(shù)量與質(zhì)量有關(guān)碳抄。
具體參考:PageRank算法講解

2 PageRank的python實現(xiàn)

2.1 需求

利用PageRank隨機瀏覽模型求如下圖個網(wǎng)頁的PageRank值场绿。


網(wǎng)頁關(guān)系

即網(wǎng)頁之間的關(guān)系如下表格:

鏈接源ID 鏈接目標(biāo) ID
1 2,3,4,5, 7
2 1
3 1,2
4 2,3,5
5 1,3,4,6
6 1,5
7 5

2.2 Python實現(xiàn)

"""
Created on Sun Jan  8 23:41:29 2017

@author: whenif
"""
 
import numpy as np 
import networkx as nx
import matplotlib.pyplot as plt

def getGm(A):
    '''
    功能:求狀態(tài)轉(zhuǎn)移概率矩陣Gm
    @A:網(wǎng)頁鏈接圖的鄰接矩陣
    '''
    Gm = []   
    for i in range(len(A)):
        cnt = 0
        for j in range(len(A[i])):
         if A[i][j] != 0:
             cnt += 1
        tran_prob = 1/cnt#轉(zhuǎn)移概率
        Gm_tmp = []
        for j in range(len(A[i])):
         Gm_tmp.append(tran_prob*A[i][j])
        Gm.append(Gm_tmp)
    Gm = np.transpose(Gm) 
    return Gm

def getBaseLev(N):
    '''
    功能:計算網(wǎng)頁所獲得的基本級別(1-P)*e/n 
    @N:網(wǎng)頁總個數(shù)
    '''
    P = 0.85
    e = np.ones(N)
    R = [ [(1-P)*i*1/N] for i in e ]  
    return R

    
def getPR(P,Gm,R,PR):
    '''
    功能:獲取PR值
    @P:加權(quán)系數(shù)焰盗,通常取 0.85 左右,按照超鏈接進行瀏覽的概率
    @Gm:狀態(tài)轉(zhuǎn)移概率矩陣
    @R:網(wǎng)頁所獲得的基本級別
    @PR:每個網(wǎng)頁節(jié)點的PageRank值
    '''
    #狀態(tài)轉(zhuǎn)移概率矩陣Gm與PR值相乘矩陣相乘
    Gm_PR = np.dot(Gm,PR) 
    #矩陣乘以常數(shù)P
    P_Gm_PR = P*Gm_PR
    #矩陣相加
    new_PR = P_Gm_PR+R #PR=P*Gm'PR+(1-d)*e/n PageRank算法的核心  
    return new_PR

def res_vis(A,PR):
    '''
    將計算出來的值進行可視化展示
    @A:網(wǎng)頁鏈接圖的鄰接矩陣
    @PR:每個網(wǎng)頁節(jié)點最終的PageRank值
    '''
    #G=nx.Graph()構(gòu)造的是無向圖, G=nx.DiGraph()構(gòu)造的是有向圖
    #初始化有向圖熬拒,節(jié)點數(shù)為7,edge(邊)被創(chuàng)造的隨機概率
    all_edges = []
    for i in range(7):
        for j in range(len(A)):
            if A[i][j]==1:
                all_edges.append([i+1,j+1])         
    #(1)初始化有向圖
    G = nx.DiGraph() 
    #(2)添加節(jié)點
    G.add_nodes_from(range(1,len(A)))
    #(3)添加有向邊
    G.add_edges_from(all_edges)
    #(4)添加PR值
    pr = {}
    for i in range(len(PR)):
        pr[i+1] = PR[i][0]
    # (5)畫圖
    layout = nx.spring_layout(G)
    plt.figure(1)
    nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],
                                  node_color='m',with_labels=True)
    plt.show() 
    
def main():
    #初始化參數(shù)
    N = 7 #網(wǎng)頁個數(shù)
    P = 0.85 #一個加權(quán)系數(shù),通常取 0.85 左右,按照超鏈接進行瀏覽的概率
    #網(wǎng)頁鏈接圖的鄰接矩陣蛀序,每一列表示一個網(wǎng)頁的出度
    A =  np.array([[0,1,1,0,1,1,0],
                   [1,0,1,1,0,0,0],
                   [1,0,0,1,1,0,0],
                   [1,0,0,0,1,0,0],
                   [1,0,0,1,0,1,1],
                   [0,0,0,0,1,0,0],
                   [1,0,0,0,0,0,0]])
    A = np.transpose(A) #轉(zhuǎn)置    
    #初始化PR值為0 
    new_PR = []  
    for i in range(N):  
        new_PR.append([0])       
    count = 0#迭代計數(shù)器
    while True:  
        PR = new_PR  
        R = getBaseLev(N)
        Gm = getGm(A)
        new_PR = getPR(P,Gm,R,PR)
        count = count +1
        print("第 %s 輪迭代" % count)
        print(str(round(new_PR[0][0],5)) 
                +"\t" + str(round(new_PR[1][0],5)) 
                + "\t" + str(round(new_PR[2][0],5)) 
                + "\t" + str(round(new_PR[3][0],5))
                + "\t" + str(round(new_PR[4][0],5))
                + "\t" + str(round(new_PR[5][0],5))
                + "\t" + str(round(new_PR[6][0],5)))
        #設(shè)置迭代條件
        if (    round(PR[0][0],5)==round(new_PR[0][0],5) 
            and round(PR[1][0],5)==round(new_PR[1][0],5) 
            and round(PR[2][0],5)==round(new_PR[2][0],5) 
            and round(PR[3][0],5)==round(new_PR[3][0],5)
            and round(PR[4][0],5)==round(new_PR[4][0],5)
            and round(PR[5][0],5)==round(new_PR[5][0],5)
            and round(PR[6][0],5)==round(new_PR[6][0],5)):   
            break
    print("-------------------")
    print("PageRank值已計算完成")
    res_vis(A,new_PR)

if __name__ == '__main__':  
    main()  

2.3 結(jié)果與分析

(1)迭代結(jié)果

第 1 輪迭代
0.02143 0.02143 0.02143 0.02143 0.02143 0.02143 0.02143
第 2 輪迭代
0.06241 0.04025 0.0357  0.02963 0.05846 0.02598 0.02507
......
第 57 輪迭代
0.28026 0.15875 0.13887 0.10821 0.18418 0.06057 0.06907
第 58 輪迭代
0.28026 0.15875 0.13887 0.10821 0.18418 0.06057 0.06907
-------------------
PageRank值已計算完成

(2)可視化結(jié)果

網(wǎng)頁關(guān)系可視化結(jié)果

其中圓圈編號表示網(wǎng)頁ID活烙,圓圈大小表示PR值大小,連線表示網(wǎng)頁之間的關(guān)系倦逐,有帶黑色箭頭表示出度方向譬正。
(3)結(jié)果匯總

名次 PageRank值 網(wǎng)頁ID 發(fā)出鏈接ID 被鏈接ID
1 0.28026 1 2,3,4,5,7 2,3,5,6
2 0.18418 5 1,3,4,6 1,4,6,7
3 0.15875 2 1 1,3,4
4 0.13887 3 1,2 1,4,5
5 0.10821 4 2,3,5 1,5
6 0.06907 7 5 1
7 0.06057 6 1,5 5

(4)結(jié)果分析

  • 被鏈接個數(shù)越多其PageRank值越大曾我,當(dāng)被鏈接個數(shù)相同則發(fā)出鏈接個數(shù)越多其PageRank值越大;
  • ID=1的頁面的PageRank值是0.28026抒巢,占據(jù)全體接近三分之一,成為了第1位蛉谜。從可視化圖與結(jié)果匯總表格可以看出,因為ID=1頁面是鏈出鏈接和鏈入鏈接最多的頁面型诚,也可以理解它是最受歡迎的頁面。
    同時需要注意的是在PageRank值排在第3位的ID=2頁面狰贯,被3個鏈接所鏈接赏廓,而只有面向ID=1頁面發(fā)出一個鏈接傍妒,因此(面向ID=1頁面的)鏈接就得到ID=2的所有的PageRank值。

3 應(yīng)用場景

在數(shù)據(jù)分析我們經(jīng)常需要從用戶的角度思考問題颤练,如用戶購買路徑,用戶之所以沒產(chǎn)生購買昔案,那么到底是在哪個環(huán)節(jié)出現(xiàn)了問題?基于用戶還有許許多多的分析問題踏揣,如流失用戶分析、流失用戶預(yù)警捞稿、用戶信用度分析等。
從基于用戶的分析我們可以延伸到用戶與信息娱局、用戶與商品、用戶與用戶之間的分析衰齐,當(dāng)然這三點對號入座的便分別是BAT的基因所在,其中人與人之間的分析即是社交關(guān)系分析废酷,這也是PageRank適合的領(lǐng)域之一。在不同行業(yè)的應(yīng)用場景不用澈蟆,如以下應(yīng)用場景:

  • 微信卓研、微博等應(yīng)用的社交網(wǎng)絡(luò)分析趴俘,可以實現(xiàn)基于用戶的相似度的內(nèi)容推薦奏赘、可以挖掘用戶的價值、用戶的社交影響力等磨淌;電商如京東等可利用用戶關(guān)系,在一定程度上協(xié)助風(fēng)險控制(抓刷單等)伦糯。
  • 在電信行業(yè)中利用交往圈數(shù)據(jù)可以得到用戶的社交影響力嗽元,從而在一定程度上可以協(xié)助垃圾短信等的治理喂击;
  • 文獻重要性研究(引用與被引用)
  • ......

后記

數(shù)據(jù)分析與挖掘很多都是從人出發(fā),逐漸延伸到人與人翰绊,甚至是人、人與人在時間與空間上的表現(xiàn)监嗜,其中人與人之間的關(guān)系可以說是很重要的一環(huán),所以個人覺得PageRank還是有挺大的應(yīng)用性裁奇,在工作中也是深有體會。當(dāng)然文中只是舉了簡單的例子并實現(xiàn)刽肠,代碼可優(yōu)化的地方應(yīng)該不少,望各路小伙伴一起交流一起進步音五。


參考:
[1] PageRank算法講解

本文所有代碼只用于技術(shù)交流,拒絕任何商用活動
個人Github
后續(xù)的學(xué)習(xí)細節(jié)將會記錄在個人博客DebugNLP中厨钻,歡迎各路同學(xué)互相交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坚嗜,一起剝皮案震驚了整個濱河市夯膀,隨后出現(xiàn)的幾起案子惶傻,更是在濱河造成了極大的恐慌其障,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件励翼,死亡現(xiàn)場離奇詭異,居然都是意外死亡汽抚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門否过,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苗桂,你說我怎么就攤上這事〉≡耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵围辙,是天一觀的道長放案。 經(jīng)常有香客問我姚建,道長吱殉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任考婴,我火速辦了婚禮,結(jié)果婚禮上缎罢,老公的妹妹穿的比我還像新娘。我一直安慰自己策精,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布咽袜。 她就那樣靜靜地躺著,像睡著了一般询刹。 火紅的嫁衣襯著肌膚如雪萎坷。 梳的紋絲不亂的頭發(fā)上凹联,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天哆档,我揣著相機與錄音蔽挠,去河邊找鬼瓜浸。 笑死澳淑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的春寿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼绑改,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厘线?” 一聲冷哼從身側(cè)響起出革,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骂束,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展箱,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年攀隔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆汹。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡婴栽,死狀恐怖满粗,靈堂內(nèi)的尸體忽然破棺而出愚争,到底是詐尸還是另有隱情,我是刑警寧澤准脂,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布檬洞,位于F島的核電站,受9級特大地震影響添怔,放射性物質(zhì)發(fā)生泄漏贤旷。R本人自食惡果不足惜砾脑,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一幼驶、第九天 我趴在偏房一處隱蔽的房頂上張望韧衣。 院中可真熱鬧,春花似錦畅铭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉懒。三九已至,卻和暖如春眶俩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仿便。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工攒巍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗽仪,地道東北人柒莉。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像兢孝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跨蟹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 鏈接分析 我們在最開始說過,搜索引擎在查找能夠滿足用戶需求的網(wǎng)頁時夯秃,主要會考慮兩方面的因素,一方面是用戶發(fā)出的查詢...
    我偏笑_NSNirvana閱讀 3,182評論 1 12
  • 這個系列的第六個主題仓洼,主要談一些搜索引擎相關(guān)的常見技術(shù)。 1995年是搜索引擎商業(yè)公司發(fā)展的重要起點色建,《淺談推薦系...
    我偏笑_NSNirvana閱讀 6,608評論 3 24
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評論 25 707
  • 佩奇排名(PageRank),又稱網(wǎng)頁排名某残、谷歌左側(cè)排名,是一種由搜索引擎根據(jù)網(wǎng)頁之間相互的超鏈接計算的技術(shù)驾锰,而作...
    Nicky_Ye閱讀 20,900評論 1 12
  • 當(dāng)黑暗占據(jù)陽光的余暉 星空閃閃 眨眼的星星看著黑暗的心情 默默地不說話 如果陽光是開心的向往 黑暗是靜思的沉默 他...
    楊又芷閱讀 141評論 0 3