[Hadoop數據分析平台:第一周]關於Google矩陣和PageRank的求解方法


Google 矩陣和Page Rank的簡單介紹                                                                                                                                                                         

  Page Rank是Google排名算法法則的一部分,是Google用於標識網頁的等級/重要性的一種方法,是Google用來衡量一個網站好壞的標准。在揉合了諸如Title標識和Keywords標識等所有其它因素之后,Google通過PageRank來調整結果,使那些更具“等級/重要性”的網頁在搜索結果中的排名獲得提升,從而提高搜索結果的相關性和質量。其級別從0到10級,10級為滿分。PR值越高說明該網頁越重要。
    Google的PageRank根據網站的外部鏈接和內部鏈接的數量和質量來衡量網站的價值。
    [以上引自:百度百科,詳細見http://baike.baidu.com/view/1518.htm,就不多作介紹了]
   

Google矩陣及PageRank的求解方法                                                                                                                                                                               
1. Google矩陣  

  Google矩陣,是表現網頁間鏈接關系的,如果有N個頁面,就可以寫出N×N的矩陣,其中的元素pij,如果存在從頁i被頁j指向的鏈接,那么pij就大於0,反之就等於0,同時各列矢量總和為1,現在以一題目為例,說明如何計算Google矩陣及PageRank。

  假設有A,B,C,D,E五個網頁,其中
    1)A網頁有鏈接指向B,C,D
    2)B網頁有鏈接指向A,E
    3)C網頁有鏈接指向A,E
    4)D網頁有鏈接指向C
    5)E網頁有鏈接指向A,C
  請寫出這個網頁鏈接結構的Google矩陣

 

 

  這樣,我們就得到了Google的初始矩陣L(也有資料叫這轉移矩陣)。

2. PageRank的求解

  得到初始矩陣后,我們就可以得到PR值,當只有a概率的用戶會點擊網頁鏈接,剩下(1-a)概率的用戶會跳到無關的頁面上去,而訪問的頁面恰好是這5個頁面中A的概率只有(1-a)/5(a是阻尼系數,Google取a等於0.85),所以真正的Google矩陣

  

  於是得到q(n)=G*q(n-1),特征向量q的初始值為值為1的5*1矩陣,直到q(n)=q(n-1),q(n)就是PR的值。

編程實現了此PageRank的計算(Java)                                                                                                                                                                          

package com.hadoop;
public class PageRank {

    /**
     * 矩陣g乘以矩陣p

     * @param g
     * @param p
     * @return 矩陣g乘以矩陣p的結果矩陣
     */
    private static float[] multiMatrix(float[][] g, float[] p){
        float[] multiResult = new float[p.length];
        for(int i=0; i<g.length; i++){
            float rowResult = 0.0f;
            for(int j=0; j<g.length; j++){
                rowResult+=g[j]*p[j];
            }
            multiResult = rowResult;
        }
        return multiResult;
    }
   
    /**
     * 根據初始矩陣計算真正的Google矩陣
     * @param 初始矩陣
     * @param weight
     * @param oneMatrix
     * @return 真正的Google矩陣
     */
    private static void getGoogleMatrix(float[][] transitionMatrix, float weight){
        
        //transitionMatrix*weight   
        for(int i=0; i<transitionMatrix.length; i++){
            for(int j=0; j<transitionMatrix.length; j++){
                transitionMatrix[j] *= weight;
                transitionMatrix[j] += (1-weight)/transitionMatrix.length;
            }
        }        
    }
   
    /**
     * 如果pageRankN=pageRankN_1,返回true;否則,返回false

     * @param pageRankN
     * @param pageRankN_1
     * @return
     */
    private static boolean compareMatrix(float[] pageRankN, float[] pageRankN_1){
        for(int i=0; i<pageRankN.length; i++){
            if(pageRankN-pageRankN_1>0.0000001){
                return false;
            }
        }
        return true;
    }
   
    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        float[][] transitionMatrix={{0,1/2f,1/2f,0,1/2f},{1/3f,0,0,0,0},{1/3f,0,0,1,1/2f},{1/3f,0,0,0,0},{0,1/2f,1/2f,0,0}};//初始矩陣
        float[] p={1,1,1,1,1}; 
        float weight = 0.85f; //a的值

     
        //真正的Google矩陣
        getGoogleMatrix(transitionMatrix, weight);
        
        //q(n)=G*q(n-1),如果q(n)=q(n-1),q(n)是PageRank
        float[] pageRank = multiMatrix(transitionMatrix, p);
        while(!compareMatrix(pageRank, p)){
            p = pageRank;
            pageRank = multiMatrix(transitionMatrix, p);
        }

   //輸出PageRank        
        for(int i=0; i<pageRank.length; i++){
            System.out.println(pageRank);   
        }
    }

}

輸出結果:
1.4308448
0.5554062
1.4542446
0.5554062
1.0041016

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM