向MapReduce转换:通过部分成绩计算矩阵乘法

代码共分为四部分:

<strong><span style="font-size:18px;">/***
 * @author YangXin
 * @info 封装共现关系列
 */
package unitSix;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.mahout.cf.taste.hadoop.item.VectorOrPrefWritable;
import org.apache.mahout.math.VectorWritable;

public class CooccurrenceColumnWrapperMapper extends Mapper<IntWritable, VectorWritable, IntWritable, VectorOrPrefWritable>{
	public void map(IntWritable key, VectorWritable value, Context context) throws IOException, InterruptedException{
		context.write(key, new VectorOrPrefWritable(value.get()));
	}
}
</span></strong>

<strong><span style="font-size:18px;">/***
 * @author YangXin
 * @info 分割用户数量
 */
package unitSix;

import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.mahout.cf.taste.hadoop.item.VectorOrPrefWritable;
import org.apache.mahout.math.VarLongWritable;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;

public class UserVectorSplitterMapper extends Mapper<VarLongWritable, VectorWritable, IntWritable, VectorOrPrefWritable>{
	public void map(VarLongWritable key, VectorWritable value, Context context) throws IOException, InterruptedException{
		long userID = key.get();
		Vector userVector = value.get();
		Iterator<Vector.Element> it = userVector.nonZeroes().iterator();
		IntWritable itemIndexWritable = new IntWritable();
		while(it.hasNext()){
			Vector.Element e = it.next();
			int itemIndex = e.index();
			float preferenceValue = (float)e.get();
			itemIndexWritable.set(itemIndex);
			context.write(itemIndexWritable, new VectorOrPrefWritable(userID, preferenceValue));
		}
	}
}</span></strong>
<strong><span style="font-size:18px;">/***
 * @author YangXin
 * @info 计算部分推荐向量
 */
package unitSix;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.mahout.cf.taste.hadoop.item.VectorAndPrefsWritable;
import org.apache.mahout.math.VarLongWritable;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;

public class PartialMultiplyMapper extends Mapper<IntWritable, VectorAndPrefsWritable, VarLongWritable, VectorWritable>{
	public void map(IntWritable key, VectorAndPrefsWritable vectorAndPrefsWritable, Context context) throws IOException, InterruptedException{
		Vector cooccurrenceColumn = vectorAndPrefsWritable.getVector();
		List<Long> userIDs = vectorAndPrefsWritable.getUserIDs();
		List<Float> prefValues = vectorAndPrefsWritable.getValues();
		for(int i = 0; i < userIDs.size(); i++){
			long userID = userIDs.get(i);
			float prefValue = prefValues.get(i);
			Vector partialProduct = cooccurrenceColumn.times(prefValue);
			context.write(new VarLongWritable(userID), new VectorWritable(partialProduct));;
		}
	}
}
</span></strong>
<strong><span style="font-size:18px;">/***
 * @author YangXin
 * @info 实现部分成绩的combiner
 */
package unitSix;

import java.io.IOException;

import org.apache.hadoop.mapreduce.Reducer;
import org.apache.mahout.math.VarLongWritable;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.VectorWritable;

public class AggregateCombiner extends Reducer<VarLongWritable, VectorWritable, VarLongWritable, VectorWritable>{
	public void reduce(VarLongWritable key, Iterable<VectorWritable> values, Context context) throws IOException, InterruptedException{
		Vector partial = null;
		for(VectorWritable vectorWritable : values){
			partial = partial == null ? vectorWritable.get() : partial.plus(vectorWritable.get());
		}
		context.write(key, new VectorWritable(partial));
	}
}
</span></strong>

时间: 2024-10-11 02:48:41

向MapReduce转换:通过部分成绩计算矩阵乘法的相关文章

分布式缓存法计算矩阵乘法

1)做矩阵F是.txt格式,右矩阵B是SequenceFile,代码如下: 1 package matrix; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.net.URI; 7 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.f

蓝桥杯 BASIC_17 矩阵乘法 (矩阵快速幂)

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 2 1 2 3 4 样例输出 7 10 15 22 这道题题目很简单,而且数据量也很

POJ C程序设计进阶 编程题#1:计算矩阵边缘之和

编程题#1:计算矩阵边缘元素之和 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个整数矩阵,计算位于矩阵边缘的元素之和.所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素. 输入 第一行为整数k,表示有k组数据. 每组数据有多行组成,表示一个矩阵: 第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以空格分隔. 接下

矩阵乘法的Mapreduce实现过程

MapReduce实现矩阵的乘法 在学习pageRank算法时看到这么一个小小的编程应用.并且一直自诩只要有原理就能写出代码(只是时间问题),矩阵乘法的原理很简单,基本上理工科生(只要学过线性代数或者相关课程)都知道.但是从来没有想过通过并行计算的方式来完成矩阵乘法. 这里矩阵的知识就不啰嗦了,矩阵的乘积记作为P=M*N.则P中的元素 简单粗暴的讲,就是左矩阵M的行依次与右矩阵的列元素对应相乘,然后再相加. 可能说到mapreduce算法可能都会想到map用来整理数据(这里指的就是矩阵中的元素)

Armadillo之计算矩阵的行列式(determinant)

计算矩阵的行列式很简单,用det方法或是log_det方法 1 det(A) 如果A不是方阵的(square),将抛出std::logic_error异常 例: mat m = "3,2,4;1,-2,3;2,3,2;"; double d = det(m); cout << d << endl; 运行结果是-3 2 log_det(value, sign,A) 文档里推荐当矩阵A比较大时,使用本函数来代替det函数(估计会加快计算速度) det(A)=exp(

【甘道夫】MapReduce实现矩阵乘法--实现代码

之前写了一篇分析MapReduce实现矩阵乘法算法的文章:[甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序执行,今天编写了实现代码供大家参考. 编程环境: java version "1.7.0_40" Eclipse Kepler Windows7 x64 Ubuntu 12.04 LTS Hadoop2.2.0 Vmware 9.0.0 build-812388 输入数据: A矩阵存放地址:hdfs://singlehadoop:8020/wordsp

PHP日期操作类代码-农历-阳历转换、闰年、计算天数等

这是一个实用的PHP日期时间操作类,里面包括了公历-农历转换.转换成中文日期格式.计算农历相隔天数.根据阴历年获取生肖.获取阴历月份的天数.获取农历每年的天数.获取闰月.计算阴历日期与正月初一相隔的天数.计算2个公历(阳历)日期之间的天数.根据距离正月初一的天数计算阴历日期.获取天干地支纪年等,PHP日期操作类:Lunar.class.php代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

成绩计算实例

import java.util.Random; import java.util.Scanner; /* * 1.班级考试要进行分组,键盘录入该班级总共多少组,以及每组的学生数量, * 2.根据录入的组数及每组学员的数量创建二维数组 * 3.利用随机数产生0-100的成绩(包含0和100) * 4.要求: * (1)打印该班级中每组的不及格人数 * (2)打印该班级中每组的平均分 * (3)打印组的最高平均分 * (4)打印班级中的不及格人数 * (5)打印班级平均分 * (6)演示格式如下:

【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对