MapReduce编程——矩阵乘法(Python版本)

数据格式

  • 对于矩阵元素 A i j A_{ij} Aij,将其处理为 < i , j , M a t r i x N a m e , v a l u e > <i,j,MatrixName,value> <i,j,MatrixName,value>的四元组格式,例如矩阵\[2, 1, 3, 4, 10, -8, 7, 2, 9, 1, 6, -2]可被转化为如下形式

    python 复制代码
    1 1 A 2
    1 2 A 1
    1 3 A 3
    1 4 A 4
    2 1 A 10
    2 2 A -8
    2 3 A 7
    2 4 A 2
    3 1 A 9
    3 2 A 1
    3 3 A 6
    3 4 A -2

程序说明

  • 假设有矩阵 A m × q A_{m \times q} Am×q与 B q × n B_{q \times n} Bq×n相乘,且矩阵 A A A与 B B B都被转化为了以上格式存储在一个txt文件中

Map函数

  • Map函数接收一个四元组 < i , j , M a t r i x N a m e , v a l u e > <i,j,MatrixName,value> <i,j,MatrixName,value>作为输入,对于 A i j A_{ij} Aij返回键值对 < < i , k > , < A , j , v a l u e > > ( k = 1 , 2 , 3 , . . . , n ) <<i,k>,<A,j,value>>(k=1,2,3,...,n) <<i,k>,<A,j,value>>(k=1,2,3,...,n);对于 B i j B_{ij} Bij返回键值对 < < k , j > , < B , i , v a l u e > > ( k = 1 , 2 , 3 , . . . , m ) <<k,j>,<B,i,value>>(k=1,2,3,...,m) <<k,j>,<B,i,value>>(k=1,2,3,...,m)

Reduce函数

  • Reduce函数接收shuffle后得到的键值对 < < i , k > , < < 来自 A 的第 i 行 > , < 来自 B 的第 k 列 > > > <<i,k>,<<来自A的第i行>,<来自B的第k列>>> <<i,k>,<<来自A的第i行>,<来自B的第k列>>>,此时只需使得A与B中对应的元素相乘再相加即可得到结果 C i j C_{ij} Cij

代码

python 复制代码
# 文件命名为matmul.py,矩阵数据写在matrix.txt文件中
from mrjob.job import MRJob
import numpy as np

# M为矩阵A的行数,N为矩阵B的列数
M, N = 3, 3

class MatrixMultiplication(MRJob):
    def mapper(self, _, line):
        # 根据数据的格式,解析输入并区分矩阵A和矩阵B的元素
        # 假设输入格式为 (i, j, matrix_name, value)
        i, j, matrix_name, value = line.split()

        if matrix_name == 'A':
            for k in range(1, N+1):
                yield (int(i), k), (matrix_name, int(j), int(value))
        else:
            for k in range(1, M+1):
                yield (k, int(j)), (matrix_name, int(i), int(value))

    def reducer(self, key, values):
        A_set, B_set = [], []
        for v in values:
            if v[0] == 'A':
                A_set.append(v)
            else:
                B_set.append(v)

        res = 0
        for v1 in A_set:
            for v2 in B_set:
                if v2[1] == v1[1]:
                    res += v1[2]*v2[2]
                    break
        yield key, res

if __name__ == '__main__':
    MatrixMultiplication.run()
    print("np:", np.matmul(np.array([[2, 1, 3, 4], [
          10, -8, 7, 2], [9, 1, 6, -2]]), np.array([[3, 2, -8], [1, 5, 2], [4, -7, 3], [4, 1, -7]])))

运行命令

python 复制代码
python matmul.py -r inline matrix.txt
相关推荐
benchmark_cc22 分钟前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
维克兜率天1 小时前
【维克】趋势型CTA:期货市场的“追涨杀跌“
人工智能·python
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
梦想不只是梦与想2 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合2 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
别问!问就是全会3 小时前
Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌
ide·python·其他·jupyter
深蓝AI4 小时前
Python 缓存击穿实测:16 个并发请求如何只回源 1 次
python
benchmark_cc4 小时前
用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践
python·数据分析·pandas·量化交易·股票数据·quantdash
zh路西法5 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace
后台模板学习5 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt