Google矩阵及PageRank的求解方法
2015-09-04 13:01
375 查看
1. Google矩阵
假设有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(也有资料叫这转移矩阵)。
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)就是PageRank的值。
编程实现此PageRank的计算(Java)
输出结果:
1.4308440997406415
0.5554058455846969
1.4542437907845167
0.5554058455846969
1.0041011330680263
假设有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(也有资料叫这转移矩阵)。
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)就是PageRank的值。
编程实现此PageRank的计算(Java)
package com.zzg.math; public class PageRank { /** * 矩阵g乘以矩阵p * @param g * @param p * @return 矩阵g乘以矩阵p的结果矩阵 */ private static double[] multiMatrix(double[][] g, double[] p){ double[] multiResult = new double[p.length]; for(int i=0; i<g.length; i++){ double rowResult = 0.0f; for(int j=0; j<g.length; j++){ rowResult+=g[i][j]*p[j]; } multiResult[i] = rowResult; } return multiResult; } /** * 根据初始矩阵计算真正的Google矩阵 * @param 初始矩阵 * @param weight * @param oneMatrix * @return 真正的Google矩阵 */ private static void getGoogleMatrix(double[][] transitionMatrix, double weight){ //transitionMatrix*weight for(int i=0; i<transitionMatrix.length; i++){ for(int j=0; j<transitionMatrix.length; j++){ transitionMatrix[i][j] *= weight; transitionMatrix[i][j] += (1-weight)/transitionMatrix.length; } } } /** * 如果pageRankN=pageRankN_1,返回true;否则,返回false * @param pageRankN * @param pageRankN_1 * @return */ private static boolean compareMatrix(double[] pageRankN, double[] pageRankN_1){ for(int i=0; i<pageRankN.length; i++){ if(pageRankN[i]-pageRankN_1[i]>0.0000001){ return false; } } return true; } /** * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub double[][] transitionMatrix={{0,1/2f,1/2f,0,1/2f},{1/3f,0,0,0,0},{1/3f,0,0,1f,1/2f},{1/3f,0,0,0,0},{0,1/2f,1/2f,0,0}};//初始矩阵 double[] p={1,1,1,1,1}; double weight = 0.85f; //a的值 //真正的Google矩阵 getGoogleMatrix(transitionMatrix, weight); //输出看一下 // for(int i=0; i<transitionMatrix.length; i++){ // for(int j=0; j<transitionMatrix.length; j++){ // System.out.print(transitionMatrix[i][j]); // System.out.print(" "); // } // System.out.println(); // } //q(n)=G*q(n-1),如果q(n)=q(n-1),q(n)是PageRank double[] pageRank = multiMatrix(transitionMatrix, p); while(!compareMatrix(pageRank, p)){ p = pageRank; pageRank = multiMatrix(transitionMatrix, p); } for(int i=0; i<pageRank.length; i++){ System.out.println(pageRank[i]); } } }
输出结果:
1.4308440997406415
0.5554058455846969
1.4542437907845167
0.5554058455846969
1.0041011330680263
相关文章推荐
- hdoj 3996 Gold Mine 【最小割 之 最大权闭合图】
- bandwagon支付宝支付教程
- UVA11090 Going in Cycle (二分+判负环)
- Microsoft Natural Ergonomic 4000 zoom改键
- django 1.8 官方文档翻译: 3-3-2 File对象
- GO语言学习笔记3(函数接口并发)
- GO语言学习笔记2(指针数组MAP)
- poj 1179 Polygon
- go (golang) DNS域名解析实现
- 第二章 概述
- POJ 1003 Hangover
- 访问google的一些方法
- mongo 常用的命令
- 谷歌Logo的变迁之路:从课后作业级走向世界级
- 运用Polygon类绘制六边形
- <转>四个重要属性——Action、Data、Category、Extras
- 【英语】Bingo口语笔记(63) - 一个单词的多种发音
- 【英语】Bingo口语笔记(62) - 生气道歉场景的表达
- Goods:图书模块按分类查询各层实现
- 第三方Windows To Go工具Rufus下载:把Win10操作系统装进U盘