【算法】PageRank

1、基本概念:PageRank 是基于【从许多优质的网页链接过来的网页,必定还是优质网页】的回归关系,来判定所有网页的重要性

2、具体算法:将某个页面的 PageRank 除以存在于这个页面的正向链接,由此得到的值分别和正向链接所指向的页面的 PageRank 相加,即是被链接的页面的 PageRank。

3、PageRank概念图:

4、PageRank的要点:

反向链接数 (单纯的意义上的受欢迎度指标)

反向链接是否来自推荐度高的页面 (有根据的受欢迎指标)

反向链接源页面的链接数 (被选中的几率指标)

5、例子来说明PageRank的具体过程

假设一个由4个页面组成的小团体:A、B、C、D。如果所有页面都链向A,那么A的PR(PageRank)值将是B,C及D的和。

PR(A) = PR(B) + PR(C) + PR(D)

继续假设B也有链接到C,并且D也有链接到包括A的3个页面。一个页面不能投票2次。所以B给每个页面半票。以同样的逻辑,D投出的票只有三分之一算到了A的PageRank上。

PR(A) = PR(B) / 2 + PR(C) + PR(D)/ 3

换句话说,根据链出总数平分一个页面的PR值

PR(A) = PR(B) / L(B) + PR(C) / L(C) + PR(D) / L(D)

为了防止没有外链的页面传递出去的PR是0,Google通过数学系统给每个页面分配一个很小的值(1-d)/N,以来表示该页面没有外链或者用户停止浏览直接jump

说明:

在Sergey Brin和Lawrence Page的1998年原文中给每一个页面设定的最小值是1-d,而不是这里的(1-d)/N(关于这一部分内容也可以参考英文版的维基百科词条)。 所以一个页面的PageRank是由其他页面的PageRank计算得到。Google不断的重复计算每个页面的PageRank。如果给每个页面一个随机PageRank值(非0),那么经过不断的重复计算,这些页面的PR值会趋向于稳定,也就是收敛的状态。

通过上述描述,简单总结PageRank的公式如下:

说明:处理那些“没有向外链接的页面”(这些页面就像“黑洞”会吞噬掉用户继续向下浏览的概率)带来的问题,(这里的被称为阻尼系数(damping factor),其意义是,在任意时刻,用户到达某页面后并继续向后浏览的概率。(就是用户停止点击,随机跳到新URL的概率)的算法被用到了所有页面上,估算页面可能被上网者放入书签的概率

是被研究的页面,是链入页面的集合,链出页面的数量,而是所有页面的数量。

PageRank值是一个特殊矩阵中的特征向量。这个特征向量为

  

R是等式的答案

  

如果不链向,而且对每个都成立时,等于0

  

6、模拟html页面的关系,Java实现PageRank算法:

  1 package com.pachira.d;
  2
  3 public class PageRank {
  4     public static void main(String[] args) {
  5         double[][] G = {
  6                 {    0, 1, 1/2.0,     0, 1/4.0, 1/2.0,  0},
  7                 {1/5.0, 0, 1/2.0, 1/3.0,     0,     0,  0},
  8                 {1/5.0, 0,     0, 1/3.0, 1/4.0,     0,  0},
  9                 {1/5.0, 0,     0,     0, 1/4.0,     0,  0},
 10                 {1/5.0, 0,     0, 1/3.0,     0, 1/2.0,  1},
 11                 {    0, 0,     0,     0, 1/4.0,     0,  0},
 12                 {1/5.0, 0,     0,     0,     0,     0,  0}
 13                 };
 14         double[] PR = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
 15         double alpha = 0.85;
 16         double eps = 0.0000001;
 17         pageRank(PR, G, alpha, eps);
 18     }
 19     public static void showVector(double[] v){
 20         for (int i = 0; i < v.length; i++) {
 21             System.out.print(v[i] + "\t");
 22         }
 23         System.out.println();
 24     }
 25     public static void showMatrix(double[][] m){
 26         for (int i = 0; i < m.length; i++) {
 27             for (int j = 0; j < m[i].length; j++) {
 28                 System.out.print(m[i][j] + "\t");
 29             }
 30             System.out.println();
 31         }
 32     }
 33
 34     /**
 35      * 计算PageRank的主函数
 36      * @param vector 初始的PageRank向量
 37      * @param matrix 初始的HTML反向链接概率矩阵
 38      * @param alpha  阻尼因子
 39      * @param eps    收敛阈值
 40      * @return
 41      */
 42     public static double[] pageRank(double[] vector, double[][] matrix, double alpha, double eps) {
 43         double[] vectorMove = vector;
 44         while (true) {
 45             showVector(vector);
 46             vectorMove = vectorXmatrix(vector, matrix, alpha);
 47             double dis = norm(vector, vectorMove);
 48             if (dis <= eps) {
 49                 break;
 50             }
 51             vector = vectorMove;
 52         }
 53         return vector;
 54     }
 55
 56     /**
 57      * 计算两个向量的误差
 58      * @param vector
 59      * @param vectorMove
 60      * @return 向量的误差
 61      */
 62     public static double norm(double[] vector, double[] vectorMove) {
 63         if (vector.length != vectorMove.length) {
 64             return -1;
 65         }
 66         double sum = 0;
 67         for (int i = 0; i < vector.length; i++) {
 68             sum += Math.abs(vector[i] - vectorMove[i]);
 69         }
 70         return sum;
 71     }
 72
 73     /**
 74      * 计算PageRank值
 75      * @param matrix HTML反向链接概率
 76      * @param vector PageRank向量
 77      * @return 新的PageRank向量
 78      * @url: http://zh.wikipedia.org/zh/%E7%9F%A9%E9%98%B5
 79      * 两个矩阵的乘法仅当第一个矩陣A的列數和另一个矩阵B的行數相等时才能定义。
 80      * 如A是m×n矩陣和B是n×p矩陣,它們的乘積AB是一個m×p矩陣,它的一个元素
 81      * | 1  0  2|   |3  1|   |(1*3 + 0*2 + 2*1)  (1*1 + 0*1 + 2*0)  |   |5  1|
 82      * |-1  3  1| x |2  1| = |(-1*3 + 3*2 + 1*1) (-1*1 + 3*1 + 1*0) | = |4  2|
 83      *              |1  0|
 84      * | 1  0  2|   | 1 |    | 1*1 + 0*1 + 2*1|   | 3 |
 85      * |-1  3  1| x | 1 |  = |-1*1 + 3*1 + 1*1| = | 3 |
 86      *              | 1 |
 87      *              |3  1|
 88      * | 1  1  1| x |2  1| = |(1*3 + 1*2 + 1*1) (1*1 + 1*1 + 1*0)| = |6  2|
 89      *              |1  0|
 90      */
 91     public static double[] vectorXmatrix(double[] vector, double[][] matrix, double alpha) {
 92         if(null == vector || matrix == null || vector.length == 0 || matrix.length == 0 || vector.length != matrix[0].length){
 93             return null;
 94         }
 95         double[] result = new double[vector.length];
 96         for (int i = 0; i < matrix.length; i++) {
 97             double sum = 0;
 98             for (int j = 0; j < matrix[i].length; j++) {
 99                 sum += vector[j] * matrix[i][j];
100             }
101             sum = alpha * sum + (1 - alpha) / vector.length;
102             result[i] = sum;
103         }
104         return result;
105     }
106 }

以上内容多摘自wiki的PageRank;

时间: 2024-11-08 20:07:34

【算法】PageRank的相关文章

Google(谷歌)矩阵是怎算的? --- 核心算法PageRank

如图为谷歌矩阵的模型: 首先这是一个四乘以四的矩阵,行从1 2 3 4  列1 2 3 4 0表示没有指向自己的连接,非零表示有指向自己的连接. 那么其中的 1/3 和 1/2是什么意思? 是这样的,表示第一列代表的是1, 第二列代表的是2 那么第一个一共有三个指向外面的箭头,那么每一个就是1/3. 这就是很经典的核心算法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算法学习与整理

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

基于Neo4j的个性化Pagerank算法文章推荐系统实践

新版的Neo4j图形算法库(algo)中增加了个性化Pagerank的支持,我一直想找个有意思的应用来验证一下此算法效果.最近我看Peter Lofgren的一篇论文<高效个性化Pagerank算法>(Efficient Algorithms for Personalized PageRank)(https://arxiv.org/pdf/1512.04633.pdf),在论文中,有一个比较有趣的示例: 我们想在论文引用网络中进行个性化搜索的尝试,但是要怎样设置个性化PageRank的参数,才

搜索引擎网页排序算法

2.1基于词频统计——词位置加权的搜索引擎 利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索引擎的核心排序技术.其基本原理是:关键词在文档中词频越高,出现的位置越重要,则被认为和检索词的相关性越好. 1)词频统计 文档的词频是指查询关键词在文档中出现的频率.查询关键词词频在文档中出现的频率越高,其相关度越大.但当关键词为常用词时,使其对相关性判断的意义非常小.TF/IDF很好的解决了这个问

几种搜索引擎算法研究

http://www.cnblogs.com/zxjyuan/archive/2010/01/06/1640136.html 1.引言 万维网WWW(World Wide Web)是一个巨大的,分布全球的信息服务中心,正在以飞快的速度扩展.1998年WWW上拥有约3.5亿个文档[14],每天增加约1百万的文档[6],不到9个月的时间文档总数就会翻一番[14].WEB上的文档和传统的文档比较,有很多新的特点,它们是分布的,异构的,无结构或者半结构的,这就对传统信息检索技术提出了新的挑战. 传统的W

机器学习10大经典算法

1.C4.5 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值.决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出. 从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树. 决策树学习也是数据挖掘中一个普通的方法.在这里,每个决策树都表述了一种树型结构,他由他的分支来对该类型的对象依靠属性进行分类.每个决

经典的十个机器学习算法

1.C4.5 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的 属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值.决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输 出. 从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树. 决策树学习也是数据挖掘中一个普通的方法.在这里,每个决策树都表述了一种树型结构,他由他的分支来对该类型的对象依靠属性进行分类.每

关键词抽取:pagerank,textrank

摘抄自微信公众号:AI学习与实践 TextRank,它利用图模型来提取文章中的关键词.由 Google 著名的网页排序算法 PageRank 改编而来的算法. PageRank PageRank 是一种通过网页之间的超链接来计算网页重要性的技术,以 Google 创办人 Larry Page 之姓来命名,Google 用它来体现网页的相关性和重要性. PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级,把从 A 页面到 B 页面的链接解释为 A 页面给 B 页面投票,Google 根

11-pagerank 图机器学习之PageRank

pagerank:链接分析 如同图谱的网络 每个网页相互链接,是一个有向图,强连通分量 设计一个计算十堰,找到给定节点的输入与输出成分(?) 节点:网页 边:超链接 次要问题:动态页面如何解决?暗网--无法直接进入的网页 网页的现状:不一定通过导航链接,而通过交易事务(?),例如邮件,评论,评论,点赞,购买等 是一个有向图 其他类型的信息网络:如引用网络,百科中的引用 In(v) OUT(v)的定义:通过输入或输出关系可以接触节点v的节点集合 有向图的推理 有向图的两种类型: 1)强连接(任意两