MapReduce的矩阵相乘
一、单个mapreduce的实现
转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html
王斌_ICTIR老师的《大数据:互联网大规模数据挖掘与分布式处理》,下面是对第二章提到的的单轮计算矩阵乘法进行的学习实现过程。
矩阵的乘法只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为i×r矩阵,B为r×j矩阵,则他们的乘积AB(有时记做A · B)会是一个i×j矩阵。其乘积矩阵的元素如下面式子得出:
书中提到的对矩阵乘法的MapReduce实现方法是:
Map函数:对于矩阵M的每个元素M[i,j],产生一系列的键值对(i,k)->(M,j, M[i,j]),其中k=1,2…,直到矩阵N的列数。同样,对于矩阵N的每个元素N[j,k],产生一系列的键值对(i,k)->(N,j,N[j,k]),其中i=1,2…,直到矩阵M的行数。
Reduce函数:根据MR的原理,相同键i,k的数据会发送个同一个 reduce。如果M为2*2矩阵,N为2×3矩阵,reduce函数需要处理的数据为:
(1,1)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,1])、(N,2, N[2,1])],
(1,2)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,2])、(N,2, N[2,2])],
(1,3)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,3])、(N,2, N[2,3])],
(2,1)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,1])、(N,2, N[2,1])],
(2,2)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,2])、(N,2, N[2,2])],
(2,3)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,3])、(N,2, N[2,3])]。
这样只要将所有(M,j, M[i,j])和(N,j, N[j,k])分别按照j值排序并放在不同的两个列表里面。将这个列表的第j个元素M[i,j]个N[j,k]相乘,然后将这些积相加,最后积的和与键(i,k)组对作为reduce函数的输出。对于上面的例子reduce的输出就是:
(1,1)->(M[1,1]* N[1,1]+ M[1,2]* N[2,1])
(1,2)->(M[1,1]* N[1,2]+ M[1,2]* N[2,2])
(1,3)->(M[1,1]* N[1,3]+ M[1,2]* N[2,3])
(2,1)->(M[2,1]* N[2,1]+ M[2,2]* N[2,1])
(2,2)->(M[2,1]* N[1,2]+ M[2,2]* N[2,2])
(2,3)->(M[2,1]* N[1,3]+ M[2,2]* N[2,3])
下面是MapReduce的实现步骤:
(1).构造矩阵M:300*150;矩阵N:150*500。两矩阵的值放入HDFS的文件中,每行的格式为:文件标识#行坐标#列坐标#坐标值。
(2).基于上面的方法编写Map函数和Reduce函数。
http://f.dataguru.cn/thread-133912-1-1.html(也有提到)
二、两次mapreduce
转自:http://f.dataguru.cn/forum.php?mod=viewthread&tid=37927
矩阵相乘:
i*k阶的矩阵M与k*j阶的矩阵N相乘得到到i*j阶的矩阵Q
使用两次map-reduce方法实现矩阵相乘。
第一次mapreduce实现:
对于左矩阵M:
map过程:<(i,k,M),value> ==> <k,(i,value,M)>
map的InputKey为自定义对象,含有三个属性,分别是行号i,列号k,及其矩阵标识号M,
InputValue为矩阵M的i,k的值;
map的OutputKey为列号k,
OutputValue为自定义的对象,含有三个属性:分别是行号i,矩阵标识号M及其值value。
右矩阵N:
map过程:<(k,j,N),value> ==> <k,(j,value,N)>
map的InputKey为自定义对象,含有三个属性,分别是行号k,列号j,及其矩阵标识号N,
InputValue为矩阵M的k,j的值;
map的OutputKey为行号k,
OutputValue为自定义的对象,含有三个属性:分别是列号j,矩阵标识号N及其值value。
reduce的过程:
<k,(i0,value1,M)>
<k,(i1,value2,M)>
......
<k,(j0,value,N)>
<k,(j1,value,N)>
.....
上述作为:reducer的InputKey和InputValue
OutputKey为k,OutputValue为:(i0,value,M),(i1,value,M)......(j0,value,N),(j1,value,N)......列表。
第二次mapreduce实现:
map的过程:
InputKey:k;OutputKey:(i0,value,M),(i1,value,M)......(j0,value,N),(j1,value,N)......
(i0,value,M),(i1,value,M)......与(j0,value,N),(j1,value,N)......进行笛卡尔乘积,计算的结果:
(i0,j0,value*value),(i0,j1,value*value),(i1,j0,value*value),(i1,j1,value*value)......
map的输出结果为:<(i,j),value>
reducer的过程:
输入为:<(i,j),value>
输出结果为:相同的(i,j)将值相加即可,输出为的<(i,j),sum(value)>.
这样的话:M(i,k) * N(k,j) = Q(i,k).
有空写一下代码~
MapReduce的矩阵相乘的更多相关文章
- MapReduce实现矩阵相乘
矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a: 1 2 ...
- Python+MapReduce实现矩阵相乘
算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...
- python版 mapreduce 矩阵相乘
参考张老师的mapreduce 矩阵相乘. 转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939 下面是我用pyt ...
- 利用Hadoop实现超大矩阵相乘之我见(二)
前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...
- 利用Hadoop实现超大矩阵相乘之我见(一)
前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...
- java 写一个 map reduce 矩阵相乘的案例
1.写一个工具类用来生成 map reduce 实验 所需 input 文件 下面两个是原始文件 matrix1.txt 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...
- HDU1575Tr A(矩阵相乘与快速幂)
Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...
- POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)
题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...
随机推荐
- 最优化方法系列:Adam+SGD—>AMSGrad
自动调参的Adam方法已经非常给力了,不过这主要流行于工程界,在大多数科学实验室中,模型调参依然使用了传统的SGD方法,在SGD基础上增加各类学习率的主动控制,以达到对复杂模型的精细调参,以达到刷出最 ...
- linux 拆分文件
split [OPTION]... [INPUT [PREFIX]] :根据行或者大小拆分文件 split file_name :默认把文件file_name拆分成xaa,xab,xac,...... ...
- 梦想CAD控件图块COM接口知识点
梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...
- CSS 类名的问题
以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...
- CodeFrist基础_迁移更新数据
一丶自动迁移 第一次启用迁移:NeGet-->Enable-Migrations public DemoDbContext() : base("name=ConncodeFirst&q ...
- webpack之webpack-dev-server 与 webpack-hot-server
最近在弄框架,用到了webpack打包,当然不可避免的遇到了开发实际问题.在实际开发中,我们不可能改一个文件,就去构建一次,于是想到了实时更新.查看webpack,看到了webpack-dev-ser ...
- 记一些关于acm的小知识(自用,粗糙,勿点呀)
#define INF 0x7ffffff,定义一个很大的数
- NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...
- Storm 开箱笔记
目录 Storm 开箱 1. 什么是 Storm 2. Hello World(WordCountTopology) 3. 常用API 4. 基本概念 5. 流分组策略 6. 并行度 7. Acker ...
- CF2B The least round way
[题解] 可以发现10的因数除了1和10之外只有2和5了,那么走过的路径上各个数字的2的因数个数之和.5的因数个数之和中较小的一个即是答案.这样的话DP即可.同时需要注意有0的情况,有0的时候有一个答 ...