Google的PageRank及其Map-reduce应用(日志五)
上一篇:Hadoop的安装(日志四)
1,算法的原理解释:
如下图所示,G就是传说中的谷歌矩阵,这个矩阵是n*n型号的,n表示共计有n个网页。
如矩阵中所示:
11位置处的元素,是表示第一个网页指向的第一个网页的比例值。
12元素,第二个网页指向第一个网页的比例值。
所谓的比例值,这个名称是我给取的,意思就是指向的链接占据所有链接的比例,例如,1网页指向了2,3,4网页,那么其1指向2网页的比例值就为1/3。
按照上面的原理,解析所有的链接,便得到了一个Google矩阵。
Google论文中有:
下面的公式之中α的取值范围是0在1之间任意取值,用于更加方便和精准的计算收敛的q。
至于q=Gq,由于G本身是一个矩阵,所以这个公式其实就是一个线性变换的过程。初始的时候,q可以取任意的值,例如(1,1,1,1,1),但需要注意的是,其维数,一定是要和网页个数相同的。不断对q进行线性变换,最终变换得到的q会收敛于q,而这个就是q表示最终排名的向量。
以上便是上面算法的所有原理解释。
2,例题(及其java实现):
1)A网页有链接指向B,C,D,E
2)B网页有链接指向A,D
3)C网页有链接指向A,D
4)D网页有链接指向C
5)E网页有链接指向A,C
A 请写出这个网页链接结构的Google矩阵
B 手动或编程计算这5个页面的PR值
Google矩阵:
代码实现:这个代码实现,是本人一步步探索出来的,给出的注释比较详细,应该好理解,但其中还所许多需要优化的地方,看上去依旧很low b,请不要见怪哈。
主要原理,就是利用二维数组实现矩阵的运算,搞定了这个,一切就简单。
package com.cgtz.main;
/**
* @author Administrator
*
*/public class HelloWorld {
public static void main(String[] args) {
//原始矩阵
double[][] sMatrix=new double[][]{
{0, 0.5, 0.5, 0, 0.5},
{0.25 , 0 , 0 , 0, 0},
{0.25 , 0 , 0 , 1, 0.5},
{0.25 , 0.5, 0.5 ,0 , 0},
{0.25 , 0 , 0 , 0 , 0}
};
//单位矩阵
double uMatrix[][]=new double[][]{
{1, 0, 0, 0, 0},
{0 , 1 , 0 , 0, 0},
{0 , 0 , 1 , 0, 0},
{0 , 0, 0 ,1 , 0},
{0 , 0 , 0 , 0 , 1}
};
double qMatrix[]=new double[]{
1,1,1,1,1
};
double gMatrix[][]=new double[5][5];
gMatrix=getGMatrix(sMatrix,uMatrix);
printMatrix(gMatrix);
double[] lastQMatrix=getLastQMatrix(gMatrix, qMatrix);
for (int i = 0; i < lastQMatrix.length; i++) {
System.out.println(lastQMatrix[i]);
}
}
//计数,可以调试时使用,也可以用来确定整个迭代的循环进行了多少次
static int count=0;
//整个方法,就是得出最后的排名向量,是一个核心的方法
private static double[] getLastQMatrix(double[][] gMatrix, double[] qMatrix) {
//每迭代一次,count的次数就加上一。
count+=1;
/**
创建一个临时的数组,次数组的的长度和需要线性变换的向量的长度相同,此数组可以当成数学中的一个向量。
整个temp向量的作用就是用来存放最原始的特征向量,以便与最终的向量进行比较
*/
double[] temp=new double[qMatrix.length];
//
for (int i = 0; i < temp.length; i++) {
temp[i]=qMatrix[i];
}
System.out.println("temp[1]---1:"+temp[0]);
/**
下面的嵌套的for循环,是用来q特征向量与G矩阵进行相乘,特征新的向量,需要说明的是,这里其实就是五维空间到五维空间的映射。
*/
for (int i = 0; i < gMatrix.length; i++) {
double newQ=0;
for (int j = 0; j < qMatrix.length; j++) {
double tempValue=gMatrix[i][j]*qMatrix[j];
System.out.println("tempValue:"+tempValue);
newQ+=tempValue;
}
qMatrix[i]=newQ;
System.out.println("----------------");
}
//打印出迭代一次之后得到新的排名向量
System.out.println("第"+count+"次迭代得到的矩阵。。。");
for (int s = 0; s < temp.length; s++) {
System.out.println("qMatrix---"+qMatrix[s]);
}
/**
下面的运算,是求两个向量之间的距离,
公式为:
*/
double distace=0;
double sDistance=0;
System.out.println("temp.length:"+temp.length);
System.out.println("temp[1]---2:"+temp[0]);
for (int i = 0; i < temp.length; i++) {
double x=temp[i]-qMatrix[i];
double x2=java.lang.StrictMath.pow(x,2);
sDistance+=x2;
}
distace=Math.sqrt(sDistance);
System.out.println("第"+count+"次迭代sDistance:"+sDistance);
//这里自己任意取一个合适的distance来确定多大距离时停止迭代
if(distace<0.0001){
for (int i = 0; i < temp.length; i++) {
System.out.println(qMatrix[i]);
}
return qMatrix;
}else{
getLastQMatrix(gMatrix,qMatrix);
}
return qMatrix;
}
public static void printMatrix(double[][] matrix){
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
System.out.print(matrix[i][j]+"--");
}
System.out.println();
}
}
private static double[][] getGMatrix(double[][] sMatrix, double[][] uMatrix) {
double gMatrix[][]=new double[5][5];
for(int i=0;i<sMatrix.length;i++){
for(int j=0;j<sMatrix.length;j++){
gMatrix[i][j]=(0.5)*sMatrix[i][j];
}
}
for(int i=0;i<uMatrix.length;i++){
for(int j=0;j<uMatrix.length;j++){
gMatrix[i][j]+=(0.5)*(0.2)*uMatrix[i][j];
}
}
return gMatrix; } }
计算的结果:
第14次迭代得到的矩阵。。。
qMatrix—2.8735992663233403E-5
qMatrix—4.620592012663504E-6
qMatrix—3.089895664396781E-5
qMatrix—1.604329405333448E-5
qMatrix—4.620592012663504E-6
由结果可知,c的网页的排名最高。
3,当网页数量较多的时候,就使用分布式计算的方案:
原理见下面的图片:
每个网页乘以对应的分向量,而后变得到了新的q,即为变换之后的q
4,Google的分词技术:
Google的PageRank及其Map-reduce应用(日志五)的更多相关文章
- Google的分布式计算模型Map Reduce map函数将输入分割成key/value对
http://www.nowamagic.net/librarys/veda/detail/1768 上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map R ...
- map reduce
作者:Coldwings链接:https://www.zhihu.com/question/29936822/answer/48586327来源:知乎著作权归作者所有,转载请联系作者获得授权. 简单的 ...
- 用通俗易懂的大白话讲解Map/Reduce原理
Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...
- 分布式基础学习(2)分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...
- Hadoop简介(1):什么是Map/Reduce
看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop整体有所了解了. Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Red ...
- 生动有趣地讲解Map/Reduce基本原理
Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...
- 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...
- python基础——map/reduce
python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...
- hadoop入门级总结二:Map/Reduce
在上一篇博客:hadoop入门级总结一:HDFS中,简单的介绍了hadoop分布式文件系统HDFS的整体框架及文件写入读出机制.接下来,简要的总结一下hadoop的另外一大关键技术之一分布式计算框架: ...
随机推荐
- Dapper源码学习和源码修改
之前ORM比较火热,自己也搞了个WangSql,但是感觉比较low,大家都说Dapper性能好,所以现在学习学习Dapper,下面简单从宏观层面讲讲我学习的Dapper. 再了解一个东西前,先得学会使 ...
- Python快速入门(2)
var = raw_input() 获取用户输入,该函数会将获取的值转化为一个字符串,因此有时需要强制类型转换. if-elif-else: 三元操作符:condition1 if exp else ...
- Python全栈开发第13天
#多用户登录 import getpass #引用getpass import os #引用os import configparser #引用配置文件操作的库 count = 0 count_oth ...
- Python_入门
本章内容: 1.Python的种类 2.Python的环境 3.Python入门(解释器.编码.pyc文件.脚步传入参数.变量.输入.流程控制与缩进.while循环) 4.练习题 Python的种类 ...
- Eclipse中将含有图片资源的项目打包成jar文件
前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...
- cat: can't open '/lib/modules/2.6.35.3-571-gcca29a0/modules.dep': No such file or directory
在使用modprobe 或者modinfo cat: can't open '/lib/modules/2.6.35.3-571-gcca29a0/modules.dep': No such fil ...
- python3基础之整数常用的方法整理
希望对大家学习或者使用python3能具有一定的参考价值. __abs__ #返回一个数的绝对值 >>> num3=-22 >>> num3.__abs__ ...
- 老李分享:导出xml报告到手机
老李分享:导出xml报告到手机 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...
- TextField和TextView
本文概要 1.简介 2.介绍TextField控件 3.介绍TextView控件 4.键盘的打开和关闭 5.关闭和大开键盘的通知 6.键盘的种类 详情 1.简介 与Label一样,TextField和 ...
- 爬虫入门系列(一):快速理解HTTP协议
4月份给自己挖一个爬虫系列的坑,主要涉及HTTP 协议.正则表达式.爬虫框架 Scrapy.消息队列.数据库等内容. 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备 ...