05 MapReduce应用案例03

8、PageRank

Page-rank源于Google,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。
Page-rank实现了将链接价值概念作为排名因素。


算法原理

– 入链 == 投票
• Page-rank  让链接来“ 投票 “ ,到一个页面的超链接相当于对该页投一票。

– 入链数量
• 如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。

– 入链质量
• 指向页面A的入链质量不同,质量高的页面会通过链接向其他页面传递更多的权重。所以越是质量高的页面指向页面A ,则页面
A 越重要。



– 初始值
• 每个页面设置相同的PR值
• Google的page-rank算法给每个页面的PR初始值为1。

– 迭代递归计算(收敛)
• Google不断的重复计算每个页面的Page-rank。那么经过不断的重复计算,这些页面的PR值会趋向于稳定,也就是收敛的状态。
• 在具体企业应用中怎么样确定收敛标准?
– 1、每个页面的PR值和上一次计算的PR相等
– 2、设定一个差值指标(0.0001 )。当所有页面和上一次计算的PR差值平均小于该标准时,则收敛。
– 3、设定一个百分比(99% ),当99%的页面和上一次计算的PR相等


– 修正Page-rank计算公式
• 由于存在一些出链为0,也就是那些不链接任何其他网页的网,也称为孤立网页,使得很多网页不能被访问到。因此需要对Page-rank公式进行修正,即在简单公式的基础上增加了阻尼系数(damping factor ) q , q 一般取值q=0.85。

– 完整Page-rank计算公式



import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class PageRankRun {public static enum MyCounter{counter}public static class PRMapper extends Mapper<Text, Text, Text, Text>{//webname:weight	linkout1 linkout2 linkoutn//webname	weight:linkout1 linkout2 linkoutn//linkout1	weight//linkout2	weight//linkoutn	weight@Overrideprotected void map(Text key, Text value, Context context)throws IOException, InterruptedException {String[] links = value.toString().split(" ");int num = links.length;String[] pageRank = key.toString().split(":");context.write(new Text(pageRank[0]), new Text(pageRank[1] + ":" + value.toString()));double weight = Double.parseDouble(pageRank[1].trim());for(String s : links)context.write(new Text(s), new Text(weight/num + ""));}}public static class PRReducer extends Reducer<Text, Text, Text, Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {String links = "";double oldPR = 0;int totalWebNum = context.getConfiguration().getInt("totalWebNum", 1);double newPR = (1-0.85)/totalWebNum;for(Text t : values){String[] s = t.toString().trim().split(":");if (s.length > 1){links = s[1].trim();oldPR = Double.parseDouble(s[0]);}else{newPR += Double.parseDouble(s[0])*0.85;}}int i = (int)Math.abs((oldPR - newPR)*10000);context.getCounter(MyCounter.counter).increment(i);context.write(new Text(key.toString() + ":" + newPR), new Text(links));}}public static void main(String[] args) throws Exception{Configuration conf = new Configuration();conf.setInt("totalWebNum", 4);boolean flag = true;double limit = 0.0001;while(true){Job job = Job.getInstance(conf);job.setJarByClass(PageRankRun.class);job.setInputFormatClass(KeyValueTextInputFormat.class);job.setMapperClass(PRMapper.class);job.setReducerClass(PRReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);Path in;Path out;if (flag){in = new Path("/home/jinzhao/mrtest/input");out = new Path("/home/jinzhao/mrtest/output");flag = false;}else{out = new Path("/home/jinzhao/mrtest/input");in = new Path("/home/jinzhao/mrtest/output");flag = true;}FileInputFormat.setInputPaths(job, in);FileSystem fs = FileSystem.get(conf);if (fs.exists(out))fs.delete(out, true);FileOutputFormat.setOutputPath(job,  out);if (job.waitForCompletion(true)){long sum= job.getCounters().findCounter(MyCounter.counter).getValue();double avgd= sum*1.0/(conf.getInt("totalWebNum", 1)*10000);if(avgd < limit){fs.delete(in, true);break;}}}}
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用微信的weui框架上传、预览和删除图片

jQuery WeUI 是专为微信公众账号开发而设计的一个框架&#xff0c;jQuery WeUI的官网&#xff1a;http://jqweui.com/ 需求&#xff1a;需要在微信公众号网页添加上传图片功能 技术选型&#xff1a;实现上传图片功能可选百度的WebUploader、饿了么的Element和微信的jQuery WeUI…

【转】Java Socket编程基础及深入讲解

原文&#xff1a;https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础&#xff0c;了解还是有好处的&#xff0c; 这篇文章主要讲解Socket的基础编程。Socket用在哪呢&#xff0c;主要用在进程间&#xff0c;网络间通信。本篇比较长&am…

使用 vue-i18n 切换中英文

使用 vue-i18n 切换中英文vue-i18n 仓库地址&#xff1a;https://github.com/kazupon/vue-i18n兼容性&#xff1a;支持 Vue.js 2.x 以上版本安装方法&#xff1a;&#xff08;此处只演示 npm&#xff09;npm install vue-i18n使用方法&#xff1a;1、在 main.js 中引入 vue-i18…

ZooKeeper数据模型

Zookeeper的数据模型 层次化的目录结构&#xff0c;命名符合常规文件系统规范&#xff08;Linux&#xff09; 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识 节点Znode可以包含数据和子节点(即子目录)&#xff0c;但是EPHEMERAL类型的节点不能有子节点 Znod…

堆叠条形图

堆叠条形图 import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import matplotlib.dates as mdates#解决能显示中文 mpl.rcParams[font.sans-serif][SimHei] #指定默认字体 SimHei为黑体 mpl.rcParams[axes.unicode_minus]Fal…

01 Python变量和数据类型

Python变量和数据类型 1 数据类型 计算机&#xff0c;顾名思义就是可以做数学计算的机器&#xff0c;因此&#xff0c;计算机程序理所当然也可以处理各种数值。 但是&#xff0c;计算机能处理的远不止数值&#xff0c;还可以处理文本、图形、音频、视频、网页等各种各样的数…

02 List、Tuple、Dict、Set

List 线性表 创建List&#xff1a; >>> classmates [Michael, Bob, Tracy] >>> L [Michael, 100, True] #可以在list中包含各种类型的数据 >>> empty_list [] #空List 按索引访问List&#xff1a; >>> print L[0] #索引从0开始…

利用layui前端框架实现对不同文件夹的多文件上传

利用layui前端框架实现对不同文件夹的多文件上传 问题场景&#xff1a; 普通的input标签实现多文件上传时&#xff0c;只能对同一个文件夹下的多个文件进行上传&#xff0c;如果要同时上传两个或多个文件夹下的文件&#xff0c;是无法实现的。这篇文章就是利用layui中的插件&am…

yzh的神仙题

U66905 zz题 考虑一个点权值被计算了多少次。。。不知 所以对未来承诺&#xff0c;方便直接算上总数&#xff01; 然后其实是给边定向&#xff0c;即先删除fa和son的哪一个 f[x][j]&#xff0c;会计算j次 无法转移 f[x][j][k]&#xff0c;其中会从子树计算k次。 当边从儿子指向…

利用Caffe实现mnist的数据训练

阿里云的参考文档&#xff1a;https://help.aliyun.com/document_detail/49571.html在文档里提供了caffe的一个案例&#xff0c;利用Caffe实现mnist的数据训练。准备的数据源可以在“深度学习案例代码及数据下载”页找到Caffe数据下载并解压。要训练自己的图片&#xff0c;还是…

06 函数式編程

1 函数式编程简介 函数&#xff1a;function 函数式&#xff1a;functional 一种编程范式 特点&#xff1a; 把计算视为函数而非指令 纯函数式编程&#xff1a;不需要变量&#xff0c;没有副作用&#xff0c;测试简单 支持高阶函数&#xff0c;代码简洁 Python支持的函数式…

jQuery WeUI 上传

jQuery WeUI 是专为微信公众账号开发而设计的一个框架&#xff0c;jQuery WeUI的官网&#xff1a;http://jqweui.com/ 需求&#xff1a;需要在微信公众号网页添加上传图片功能 技术选型&#xff1a;实现上传图片功能可选百度的WebUploader、饿了么的Element和微信的jQuery WeUI…

1.rabbitmq 集群版安装及使用nginx进行四层负载均衡设置

1.安装erlang 需要注意erlang的版本是否满足rabbitmq的需求 这里用到的版本是&#xff1a;Erlang 19.0.4 RabbitMQ 3.6.15 wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpmrpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm yum -y inst…

H5+jqweui实现手机端图片压缩上传 Base64

H5jqweui实现手机端图片压缩上传主要功能&#xff0c;使用H5的formData上传base64格式的图片&#xff0c;canvas压缩图片&#xff0c;前端样式使用weui&#xff0c;为方便起见&#xff0c;使用了jquery封装过的weui&#xff0c;jqweui。话不多少&#xff0c;开始上代码。前端代…

09 类的继承

继承一个类 class Person(object): def __init__(self, name, gender): self.name name self.gender gender class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score score 判断类型 isinstance()可以…

启动代码格式:nginx安装目录地址 -c nginx配置文件地址

启动启动代码格式&#xff1a;nginx安装目录地址 -c nginx配置文件地址 例如&#xff1a;[rootLinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf停止nginx的停止有三种方式&#xff1a; 从容停止1、查看进程号[rootLinuxServer ~]# ps -ef…

Lecture 3 Divide and Conquer

1.Divide the problem(instance) into one or more sub-problem; 2.Conquer each sub-problem recursively; 3.Combine solutions.

Lecture 4 Quick Sort and Randomized Quick Sort

Quick Sort --Divide and Conquer --Sorts “in place” --Very practical with tuning Divide and Conquer: 1.Divide: Partition array into 2 sub-arrays around pivot x such that elements in lower sub-array < x < elements in upper sub-array; 2.Conquer: …

VUE config/index.js文件配置

&#xfeff;&#xfeff; 当我们需要和后台分离部署的时候&#xff0c;必须配置config/index.js: 用vue-cli 自动构建的目录里面 &#xff08;环境变量及其基本变量的配置&#xff09;123456789101112131415var path require(path)module.exports {build: {index: path.res…