实验报告
学
专
院
计算机学院
业 计算机科学与技术
年级班别
2015 级
学
号
学生姓名
指导教师
毛毛
张
2018 年 05 月
实验课程名称:__实时大数据分析_
实验项目名称
PageRank 算法
专业班级
实 验 者
实验日期
一、实验内容
实验成绩
学
号
1. 采用基于“抽税”法在 MapReduce 框架下,分析图 1 的网页 PageRank 排名;
2
5
1
6
3
4
图 1 Web 链接实例图
2. 图 1 中,若节点②和节点⑤是主题节点,采用面向主题的 PageRank 算法重新计算所有节点
的 PageRank 值。
二、实验设计(原理分析及流程)
1. 原理分析
PageRank 链接分析技术
首先,根据公平原则定义所有网页的初始概率分布向量是一个每维均为 1/n 的 n 维向量 v0;
然后,按照 PageRank 定义,由每个网页的出链数构造网页转移矩阵 M;
最后,依据 M 和 v0 计算多次迭代后的网页概率分布向量 Miv0,其中 i 为多次迭代的次数。
“抽税”PageRank 处理方法
修改 PageRank 计算公式,允许每个随机冲浪者以一个较小的跳转概率随机跳转到一个随
机网页,而不一定要沿着当前网页上的出链前进。
根据前面的 PageRank 估计值 v 和转移矩阵 M,修改后的 PageRank 值 v’的迭代公式为:
v’= βMv + (1-β)e / n,其中,β是抽税参数,1-β表示抽出的税率。
面向主题的 PageRank 技术
假定 S 是一个网页的集合,其中的网页属于类别 S(随机跳转集合)。es 是一个向量,如果
其分量对应的网页属于 S,则该分量置为 1,否则为 0。于是 S 的面向主题的 PageRank 的
迭代公式如下: v’= βMv + (1-β) es / |S|,其中,M 是 Web 的转移矩阵,|S|是集合 S
的大小。
PageRank 算法的 Map-Reduce 实现:
Map 阶段:
对 Web 网页的转移矩阵每一行进行操作,组成该行对应网页的入链键-值对,比如第一行
对应网页 A,则输出为
,….
Reduce 阶段:
Reduce 操作收集网页键相同的值,累加并按权重计算,pj = β* ( p1 + p2 + … + pm ) +
(1 - β) * 1/n,其中 m 是链向网页 j 的网页数,n 是所有网页的网页数。
2. 流程
三、实验代码及数据记录
1. 代码
TaxPageRank 类
public class TaxPageRank
{
private static final int N = 6; // 网页数
private static final double β = 4.0 / 5; // 抽税率
private static final double accuracy = 0.0001;// 精度,小于此值迭代结束
private static int m = 0; // 迭代的次数
private static int index = 0; // 网页序号
private static double remainder = 0.0f; // 公式余项
private static ArrayList taxPageRank = new ArrayList(); // 最终
pageRank值
private static ArrayList tmpPageRank = new ArrayList(); // 临时
pageRank值
// 根据网页数,计算公式余项,并初始化pageRank值
private static void initialPageRank()
{
remainder = (1 - β) * (1.0 / N); // (1 - β)e / n
for (int i = 0; i < N; i++)
{
tmpPageRank.add(new Double(1.0 / N));
}
}
// 判断pageRank值是否改变
private static boolean isPageRankChange()
{
boolean isChange = false;
for (int i = 0; i < N; i++)
{
double tax = taxPageRank.get(i).doubleValue();
double tmp = tmpPageRank.get(i).doubleValue();
// 两者差值大于要求的精度,继续迭代
if (Math.abs(tax - tmp) > accuracy)
{
isChange = true;
break;
}
}
return isChange;
}
// 打印迭代过程中的pageRank值
private static void printPageRank()
{
for (int i = 0; i < taxPageRank.size(); i++)
{
System.out.print("网页" + (i + 1) + "的pageRank值:");
System.out.println(taxPageRank.get(i).doubleValue());
}
}
public static class MyMapper extends Mapper
for (DoubleWritable value : values)
{
sum += value.get();
}
// 计算公式:v’= βMv + (1-β)e/n
double pageRankValue = β * sum + remainder;
taxPageRank.add(new Double(pageRankValue));
context.write(key, new DoubleWritable(pageRankValue));
}
}
public static void main(String[] args) throws Exception
{
Path input = new Path("hdfs://localhost:9000/data/input/transitionMatrix.txt");
Path output = new Path("/data/output/result");
initialPageRank(); // 初始化
while (true) // 循环计算pageRank值
{
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "pageRank");
job.setJarByClass(TaxPageRank.class);
job.setMapperClass(MyMapper.class);
job.setCombinerClass(MyReducer.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
// 自动删除输出文件
FileSystem fs = FileSystem.get(conf);
fs.delete(output, true);
FileInputFormat.addInputPath(job, input);
FileOutputFormat.setOutputPath(job, output);
job.waitForCompletion(true);
System.out.println("第" + (++m) + "次迭代:");
printPageRank();
// 输出迭代的结果
if (!isPageRankChange())
{
break; // pageRank值不变,迭代完成
}
// 网页序号重新置为0
index = 0;
tmpPageRank.clear(); // 清空临时pageRank值
tmpPageRank.addAll(taxPageRank); // 加入最终pageRank值
taxPageRank.clear(); // 清空最终pageRank值
}
}
}
TopicPageRank 类
public class TopicPageRank
{
private static final int N = 6; // 网页数
private static final double β = 4.0 / 5; // 抽税率
private static final double accuracy = 0.0001;// 精度,小于此值迭代结束
private static int m = 0; // 迭代的次数
private static int index = 0; // 网页序号
private static double remainder[] = new double[N]; // 公式余项
private static ArrayList taxPageRank = new ArrayList(); // 最终
pageRank值
private static ArrayList tmpPageRank = new ArrayList(); // 临时
pageRank值
// 根据网页数,计算公式余项,并初始化pageRank值
private static void initialPageRank()
{
for (int i = 0; i < N; i++)
{
// 计算公式余项,是与TaxPageRank的主要区别
if(i == 1 || i == 4)
{
// 网页2、5作为主题节点,公式:(1 - β)es / |S|
remainder[i] = (1 - β) * (1.0 / 2);
}
else
{
}
remainder[i] = 0.0f;
tmpPageRank.add(new Double(1.0 / N));
}
}
// 判断pageRank值是否改变
private static boolean isPageRankChange()
{
boolean isChange = false;
for (int i = 0; i < N; i++)
{
double tax = taxPageRank.get(i).doubleValue();
double tmp = tmpPageRank.get(i).doubleValue();
// 两者差值大于要求的精度,继续迭代
if (Math.abs(tax - tmp) > accuracy)
{
isChange = true;
break;
}
}
return isChange;
}
// 打印迭代过程中的pageRank值
private static void printPageRank()
{
for (int i = 0; i < taxPageRank.size(); i++)
{
System.out.print("网页" + (i + 1) + "的pageRank值:");
System.out.println(taxPageRank.get(i).doubleValue());
}
}
public static class MyMapper extends Mapper