一、单个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的矩阵相乘的更多相关文章

  1. MapReduce实现矩阵相乘

    矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a:                1   2   ...

  2. Python+MapReduce实现矩阵相乘

    算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...

  3. python版 mapreduce 矩阵相乘

    参考张老师的mapreduce 矩阵相乘. 转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939 下面是我用pyt ...

  4. 利用Hadoop实现超大矩阵相乘之我见(二)

    前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...

  5. 利用Hadoop实现超大矩阵相乘之我见(一)

    前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...

  6. 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 ...

  7. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  8. <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>

    //矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...

  9. POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)

    题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...

随机推荐

  1. 最优化方法系列:Adam+SGD—>AMSGrad

    自动调参的Adam方法已经非常给力了,不过这主要流行于工程界,在大多数科学实验室中,模型调参依然使用了传统的SGD方法,在SGD基础上增加各类学习率的主动控制,以达到对复杂模型的精细调参,以达到刷出最 ...

  2. linux 拆分文件

    split [OPTION]... [INPUT [PREFIX]] :根据行或者大小拆分文件 split file_name :默认把文件file_name拆分成xaa,xab,xac,...... ...

  3. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

  4. CSS 类名的问题

    以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...

  5. CodeFrist基础_迁移更新数据

    一丶自动迁移 第一次启用迁移:NeGet-->Enable-Migrations public DemoDbContext() : base("name=ConncodeFirst&q ...

  6. webpack之webpack-dev-server 与 webpack-hot-server

    最近在弄框架,用到了webpack打包,当然不可避免的遇到了开发实际问题.在实际开发中,我们不可能改一个文件,就去构建一次,于是想到了实时更新.查看webpack,看到了webpack-dev-ser ...

  7. 记一些关于acm的小知识(自用,粗糙,勿点呀)

    #define INF 0x7ffffff,定义一个很大的数

  8. NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)

    一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...

  9. Storm 开箱笔记

    目录 Storm 开箱 1. 什么是 Storm 2. Hello World(WordCountTopology) 3. 常用API 4. 基本概念 5. 流分组策略 6. 并行度 7. Acker ...

  10. CF2B The least round way

    [题解] 可以发现10的因数除了1和10之外只有2和5了,那么走过的路径上各个数字的2的因数个数之和.5的因数个数之和中较小的一个即是答案.这样的话DP即可.同时需要注意有0的情况,有0的时候有一个答 ...