单轮MapReduce的矩阵乘法
http://blog.sina.com.cn/s/blog_62186b460101ai1x.html
矩陣的乘法只有在第一個(gè)矩陣的列數(shù)(column)和第二個(gè)矩陣的行數(shù)(row)相同時(shí)才有定義。一般單指矩陣乘積時(shí),指的便是一般矩陣乘積。若A為i×r矩陣,B為r×j矩陣,則他們的乘積AB(有時(shí)記做A?·?B)會(huì)是一個(gè)i×j矩陣。其乘積矩陣的元素如下面式子得出:
?
???
????書中提到的對(duì)矩陣乘法的MapReduce實(shí)現(xiàn)方法是:
????Map函數(shù):對(duì)于矩陣M的每個(gè)元素M[i,j],產(chǎn)生一系列的鍵值對(duì)(i,k)->(M,j, M[i,j]),其中k=1,2…,直到矩陣N的列數(shù)。同樣,對(duì)于矩陣N的每個(gè)元素N[j,k],產(chǎn)生一系列的鍵值對(duì)(i,k)->(N,j,N[j,k]),其中i=1,2…,直到矩陣M的行數(shù)。
????Reduce函數(shù):根據(jù)MR的原理,相同鍵i,k的數(shù)據(jù)會(huì)發(fā)送個(gè)同一個(gè)?reduce。如果M為2*2矩陣,N為2×3矩陣,reduce函數(shù)需要處理的數(shù)據(jù)為:
(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值排序并放在不同的兩個(gè)列表里面。將這個(gè)列表的第j個(gè)元素M[i,j]個(gè)N[j,k]相乘,然后將這些積相加,最后積的和與鍵(i,k)組對(duì)作為reduce函數(shù)的輸出。對(duì)于上面的例子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的實(shí)現(xiàn)步驟:
????(1).構(gòu)造矩陣M:300*150;矩陣N:150*500。兩矩陣的值放在一個(gè)M.data文件中,每行的格式為:文件標(biāo)識(shí)#行坐標(biāo)#列坐標(biāo)#坐標(biāo)值。
?
???
????(2).基于上面的方法編寫Map函數(shù)和Reduce函數(shù)。代碼詳見(jiàn):
????????https://github.com/intergret/snippet/blob/master/MartrixMultiplication.java
?
????
????(3).將運(yùn)行的結(jié)果文件copy到本地,并使用check.py對(duì)結(jié)果中元素[10,95]的正確性進(jìn)行驗(yàn)證。
總結(jié)
以上是生活随笔為你收集整理的单轮MapReduce的矩阵乘法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用素数表快速寻找 n 以内的所有素数
- 下一篇: 数组面试题