PageRank 算法

PageRank基本模型:

如果当前在A网页,上网者将会各以1/3的概率跳转到B、C、D,这里的3表示A有3条出链,如果一个网页有k条出链,那么跳转任意一个出链上的概率是1/k,同理D到B、C的概率各为1/2,而B到C的概率为0。一般用转移矩阵表示上网者的跳转概率,如果用n表示网页的数目,则转移矩阵M是一个n*n的方阵;如果网页j有k个出链,那么对每一个出链指向的网页i,有M[i][j]=1/k,而其他网页的M[i][j]=0

初始时,假设上网者在每一个网页的概率都是相等的,即1/n,于是初试的概率分布就是一个所有值都为1/n的n维列向量V0,用V0去右乘转移矩阵M,就得到了第一步之后上网者的概率分布向量MV0,(nXn)*(nX1)依然得到一个nX1的矩阵。下面是V1的计算过程:

矩阵M中M[i][j]不为0表示用一个链接从j指向i,M的第一行乘以V0,表示累加所有网页到网页A的概率即得到9/24。得到了V1后,再用V1去右乘M得到V2,一直下去,最终V会收敛,即Vn=MV(n-1),上面的图示例,不断的迭代,最终V=[3/9,2/9,2/9,2/9]’:

终止点问题(所有连接最终到达终止点而无法再流动,全部网站概率趋向于0)

互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为0。假设我们把上面图中C到A的链接丢掉,C变成了一个终止点,得到下面这个图:

对应的转移矩阵为:

连续迭代下去,最终所有元素都为0:

陷阱问题(所有连接最终到达终止点而不断循环,其他网站概率趋向于0,本网站趋向于1)

即有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:

上网者跑到C网页后,就像跳进了陷阱,陷入了漩涡,再也不能从C中出来,将最终导致概率分布值全部转移到C上来,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图对应的转移矩阵为:

不断的迭代下去,就变成了这样:

解决终止点问题和陷阱问题

上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如两个示例中的C),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是1/n。假设上网者每一步查看当前网页的概率为a,那么他从浏览器地址栏跳转的概率为(1-a),于是原来的迭代公式转化为:

现在我们来计算带陷阱的网页图的概率分布:

重复迭代下去:

代码

import java.util.Arrays;

public class PageRank {

    private double m[][] = null;
    private double e[] = null;
    private double a = 0.0;
    private int iteration = 0;

    public PageRank(double[][] m, double a, int iteration) {
        super();
        this.m = m;
        this.a = a;
        this.iteration = iteration;
        for (int i = 0, len = m.length; i < len; i++) {
            e[i] = 1.0 / len;
        }
    }

    public PageRank(int[][] map, double a, int iteration) {
        super();
        this.a = a;
        this.iteration = iteration;
        this.m = new double[map.length][map.length];
        for (int i = 0, n = map.length; i < n; i++) {
            int sum = 0;
            for (int j = 0, len = map[i].length; j < len; j++) {
                sum += map[i][j];
            }
            for (int j = 0, len = map[i].length; j < len; j++) {
                if (map[i][j] == 1) {
                    m[j][i] = 1.0 / sum;
                }
            }
        }
        this.e = new double[map.length];
        for (int i = 0, len = m.length; i < len; i++) {
            e[i] = 1.0 / len;
        }
    }

    private double[] multiMatrix(double a[][], double b[]) {
        double c[] = new double[b.length];
        for (int i = 0, n = a.length; i < n; i++) {
            double sum = 0.0;
            for (int j = 0, m = b.length; j < m; j++) {
                sum += a[i][j] * b[j];
            }
            c[i] = sum;
        }
        return c;
    }

    private double[] multiMatrixNumber(double a[], double b) {
        double c[] = new double[a.length];
        for (int i = 0, n = a.length; i < n; i++) {
            c[i] = a[i] * b;
        }
        return c;
    }

    private double[] sumMatrix(double a[], double b[]) {
        double c[] = new double[a.length];
        for (int i = 0, len = a.length; i < len; i++) {
            c[i] = a[i] + b[i];
        }
        return c;
    }

    public double[] getRank() {
        double v[] = Arrays.copyOf(e, e.length);
        for (int i = 0; i < iteration; i++) {
            double x[] = multiMatrixNumber(multiMatrix(m, v), (this.a));
            double y[] = multiMatrixNumber(e, 1 - (this.a));
            v = sumMatrix(x, y);
        }
        return v;
    }

    public static void main(String[] args) {
        int map[][] = new int[][] { { 0, 1, 1, 1 }, { 1, 0, 0, 1 },
                { 0, 0, 1, 0 }, { 0, 1, 1, 0 } };
        PageRank pageRank = new PageRank(map, 0.8, 5);
        pageRank.getRank();
    }
}
时间: 2024-11-10 00:51:37

PageRank 算法的相关文章

pagerank算法

转自 http://blog.csdn.net/hguisu/article/details/7996185 1. PageRank算法概述 PageRank,即网页排名,又称网页级别.Google左侧排名或佩奇排名. 是Google创始人拉里·佩奇和谢尔盖·布林于1997年构建早期的搜索系统原型时提出的链接分析算法,自从Google在商业上获得空前的成功后,该算法也成为其他搜索引擎和学术界十分关注的计算模型.目前很多重要的链接分析算法都是在PageRank算法基础上衍生出来的.PageRank

【转】深入浅出PageRank算法

原文链接 http://segmentfault.com/a/1190000000711128 PageRank算法 PageRank算法是谷歌曾经独步天下的“倚天剑”,该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的, 论文点击下载: The PageRank Citation Ranking: Bringing Order to the Web. 本文首先通过一些参考文献引出问题,然后给出了PageRank的几种实现算法, 最后将其推广至在MapReduce框架下

pagerank算法的MapReduce实现

pagerank是一种不容易被欺骗的计算Web网页重要性的工具,pagerank是一个函数,它对Web中(或者至少是抓取并发现其中连接关系的一部分web网页)的每个网页赋予一个实数值.他的意图在于,网页 的pagerank越高,那么它就越重要.并不存在一个固定的pagerank分配算法. 对于pagerank算法的推到我在这里不想做过多的解释,有兴趣的可以自己查看资料看看,这里我直接给出某个网页pagerank的求解公式: P(n)=a/G+(1-a)*求和(P(m)/C(m))     (m属

PageRank算法(python实现)

Python 实现的PageRank算法,纯粹使用python原生模块,没有使用numpy.scipy.这个程序实现还比较原始,可优化的地方较多. #-*- coding:utf-8 -*- import random N = 8 #八个网页 d = 0.85 #阻尼因子为0.85 delt = 0.00001 #迭代控制变量 #两个矩阵相乘 def matrix_multi(A,B): result = [[0]*len(B[0]) for i in range(len(A))] for i

PageRank算法原理及实现

PageRank算法原理介绍 PageRank算法是google的网页排序算法,在<The Top Ten Algorithms in Data Mining>一书中第6章有介绍.大致原理是用户搜索出的多个网页需要按照一定的重要程度(即后面讲的权重)排序,每个网页的权重由所有链接到它的其他网页的权重的加权和,加权系数为每个网页链出的网页数的倒数,也就是说每个网页的权重会平均分配到其链向的所有网页. 例如A链接到B和C,B链接到C,C链接到A,P(X)表示X的权重,如下图所示 则每个节点的权重关

PageRank算法学习与整理

PageRank 算法学习与整理 由于最近在研究图计算框架的相关问题,决定复习整理一下它的测试算法PageRank,不足之处请大家批评指正! 一. PageRank 相关背景 PageRank 的创始人拉里佩奇(Larry Page)和谢尔盖.布林(Sergey Brin),在1998年提出了该算法,并应用在Google搜索引擎的检索结果排序上,该技术也是Google早期的核心技术之一,是Google用来衡量一个网站好坏的标准. 二. Google搜索引擎工作流程 首先看一下Google搜索网页

浅析PageRank算法

很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看了一些相关的资料(PS:在动车上看看书真是一种享受),趁热打铁,将所看的东西整理成此文. 本文首先会讨论搜索引擎的核心难题,同时讨论早期搜索引擎关于结果页面重要性评价算法的困境,借此引出PageRank产生的背景.第二部分会详细 讨论PageRank的思想来源.基础框架,并结合互联网页面拓扑结构讨论PageRank处理Dead Ends及平滑化的方法.第三部分讨论To

MapReduce原理——PageRank算法Java版

Page Rank就是MapReduce的来源,下文是一个简单的计算PageRank的示例. import java.text.DecimalFormat; /**  * Created by jinsong.sun on 2014/7/15.  */ public class PageRankCaculator {     public static void main(String[] args) {         double[][] g = calcG(genS(), 0.85);  

Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的时间内提升工资超过15000.成为一位完全精通Hadoop应用开发的高端人才. Hadoop是什么,为什么要学习Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式

【大创_社区划分】——PageRank算法MapReduce实现

PageRank算法的分析和Python实现参考:http://blog.csdn.net/gamer_gyt/article/details/47443877 举例来讲: 假设每个网页都有一个自己的默认PR值,相当于人为添加给它是一种属性,用来标识网页的等级或者重要性,从而依据此标识达到排名目的.假设有ID号是1的一个网页,PR值是10,假如它产生了到ID=3,ID=6,ID=8 ,ID=9这4个网页的链接.那么可以理解为ID=1的网页向ID=3,6,8,9的4个网页各贡献了2.5的PR值.如