1. 程式人生 > >機器學習之十大經典演算法(八) PageRank演算法

機器學習之十大經典演算法(八) PageRank演算法

PageRank演算法

        (一)  PageRank演算法簡介:

        Google的創始人之一LarryPage於1998年提出了PageRank,並應用在Google搜尋引擎的檢索結果排序上,該技術也是Google早期的核心技術之一。

        Larry Page是Google的創始執行長,2001年4月轉任現職產品總裁。他目前仍與Eric Schmidt和Sergey Brin一起共同負責 Google的日常運作。他在斯坦福大學攻讀電腦科學博士學位期間,遇到了Sergey Brin,他們於1998年合夥創立Google。

        PageRank是一種在搜尋引擎中根據網頁之間相互的連結關係計算網頁排名的技術。其級別從1到10級,PR值越高說明該網頁越受歡迎(越重要)。PageRank近似於一個使用者,是指在Internet上隨機地單擊連結將會到達特定網頁的可能性。通常,能夠從更多地方到達的網頁更為重要,因此具有更高的PageRank。如果要檢視此站點PageRank值,請安裝GOOGLE工具條並啟用PageRank特性,或者在firefox安裝SearchStatus外掛。

        PageRank是基於從許多優質的網頁連結過來的網頁,必定還是優質網頁的迴歸關係,來判定所有網頁的重要性。(也就是說,一個人朋友圈中的人很優秀,他優秀的概率就越大,所以,多和優秀的人交往,你也變優秀了,不是嗎?)

        優點:

        完全獨立於查詢,只依賴於網頁連結結構,可以離線計算。

        缺點:

        1)  PageRank 演算法忽略了網頁搜尋的時效性。

        2)  沒有過濾廣告連結和功能連結(例如常見的分享功能)。通常沒有什麼實際價值,前者連結到廣告頁面,後者常常連結到某個社交網站首頁。

        3)舊網頁排序很高,存在時間長,積累了大量的 in-links,擁有最新資訊的新網頁排名卻很低,因為它們幾乎沒有 in-links。儘管這樣,也為使用者提供了友好的搜尋體驗。

  (二)PageRank演算法實現步驟:

       # -*- coding: utf-8 -*-

    from __future__ import division

    T = 0.000000001

    page_rank = [1.5, 1, 0.5, 0.5, 1.5]

    page_links =    [[0, 1, 1, 0,0],

              [1, 0, 1, 0, 1],

              [1, 1, 0, 1, 1],

              [0, 0, 1, 0, 1],

              [0, 1, 1, 1, 0]]

    weights = []

    for page_link in page_links:

        link_sum = sum(page_link)

        page_weight = []

        for page in page_link:

            if page == 1:

               page_weight.append(1/link_sum)

            else:

               page_weight.append(0)

       weights.append(page_weight)

    while True:

        page_rank_out =len(page_rank) * [0]

        for page_rank_now,page_weight_out in zip(page_rank, weights):

            page_rank_now_out =map(lambda x: page_rank_now * x, page_weight_out)

           page_rank_out = map(lambda x: sum(x), zip(page_rank_out,page_rank_now_out))

        check_stable = True

        for rank, rank_out inzip(page_rank, page_rank_out):

            if rank - rank_out>= T:

            check_stable =False

        if check_stable:

            break

        page_rank = page_rank_out

        print(page_rank)