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;