sparse matrix 的分布式存储和计算

矩阵乘法

我们先来补充一下矩阵乘法的数学知识:

  1. 矩阵乘法的意义: 对一个矩阵进行左乘一个矩阵的运算,相当于对该矩阵的每一列元素做线性变换;对一个矩阵进行右乘矩阵运算相当于对该矩阵的行进行线性变换。
  2. 矩阵乘法的计算公式: 若矩阵A为m * n的矩阵,矩阵B为n * p的矩阵,那么两矩阵相乘的公式如下:
A * B.png

用向量来解释为下图:

向量示意图.png

分布式计算

  1. 概念:把需要进行大量计算的工程数据分区成小块,由多台计算机分别计算,再上传运算结果后,将结果统一合并得出数据结论的科学
  2. 实现工具:目前最流行的分布式处理平台是Hadoop,其流程大致如下图:
Paste_Image.png

数据存储在HDFS上通过指令分发到多个Mapper(多个计算机)上进行处理,随后Mapper输出的结果(key - value)按照key进行shuffle最后传递到不同的reduce(统一合并)统计处理结果输出。
关键点:首先我们要将庞大的问题拆分成运算规则相同的子问题;随后通过设定Mapper输出的key将该合并的问题分类到同一个reduce下实现分布式计算。

稀疏矩阵的存储方式

  • Coordinate(COO)

![COO存储方式.png]
如上图所示。我们对于矩阵的存储我们需要直到三个值即可:columnid, rowid, value.于是对于一个稀疏矩阵我们可以存储为三行,三个值对应一个三元组存储为一列。如右图所示。对于等于0的元素我们可以选择不存储。因为在做矩阵运算时,如上面运算公式可以看出,这些元素对结果并没有什么贡献。这样我们对于矩阵的存储可以变为O(3K)的空间复杂度。(K为非零元素的个数),对于上面的存储方式,我们可以进一步对行索引进行压缩。就是下面所说的行压缩稀疏存储。

  • Compressed Sparse Row (CSR)

![CSR存储.png]
如上图所示,这时对行压缩优化的一个存储方式。其中三元组变为:行偏移量、列索引、value。
行向量偏移量:每一行第一个非零元素在所有非零元素中的索引。也就是将所有的非零元素按矩阵的顺序排列在数组中后的索引。如左图:所有非零元素组成数组:[1,7,2,8,5,3,9,6,4],所以每行的偏移量就是该行第一个元素在该数组中的索引。(1,2,5,6) --(0,2,4,7),最后加上所有非零元素个数。
可行性分析: 我们所要做的无非是用上述三个数组的信息是否可以恢复出原有的矩阵。我们发现有几个偏移量就有几行。并且每个元素的列是记录了的,所以可以恢复出原有的矩阵。
空间复杂度: O(2K + m), m为矩阵行数
进一步优化:用两个数组来表示一个矩阵,如下面的方法

  • ELLPACK (ELL)

![ELL存储.png]
该方法只是在CSR上做了进一步改进,因为我们发现只要记录了非零元素的列,我们只需直到非零元素在第几行就可以。于是我们将每一行的非零元素末尾加上 #来表示该位置为这一行的结尾。于是我们可以在上面的CSR中拿出列和值的数组,在其中插入#来区分每一行即可,上图矩阵记录如下:
column id [0,1,#,1,2,#,0,2,3,#,1,3]
value [1,7,#,2,8,#,5,3,9,#,6,4]
通过#的个数,我们可以直到该#为第几行的结尾,从而直到上一个#之前的元素是第几行元素。
空间复杂度:降到了二维的存储,并且可以格式很整齐,对后面分布式计算有很大的帮助。

矩阵乘法的分布式计算

  1. 可行性:我们从矩阵乘法的公式来看:
    A * B.png

    我们发现最终乘机得到的矩阵是一个m x p的矩阵,相当于每个元素都要进行上述公式的运算 O(n); 求出整个矩阵复杂度就为O( n m p) = n O(m p); 我们思考可以把这个问题拆分成n个子问题,每个子问题需要求出m * p 个值,而这里的每一个值都是对最终结果对应位置的贡献,也就是我们把上面加法的每一个元素放在一个map里去处理,以i#j作为key, 以![ ]为value输出作为索引为(i, j)的元素贡献值。随后在reduce中进对相同key的value加和作为最终结果中(i, j)的结果。这样我们就实现了矩阵在k个机器上的分布式计算。这也是最小粒度相乘的一个思路,将矩阵的乘积转化为数的乘积,随后叠加。如下图:
01.png
  1. 实现详解
    (1) 数据切分
    首先在hdfs上的文件存储我们采用ELL的存储方式,并将这个二维数组按照#切分成不同的split-part,例如上面的例子我们切分成了:
    [0,1] [1,2] [0,2,3] [1,3]
    [1,7] [2,8] [5,3,9] [6,4]
    上下组成columnid 与 value的对应关系,一共4组,我们对于A矩阵按照列压缩存储(存行号)如下,B矩阵按照行压缩存储(存列号)也就是上面所示。
    [0,2] [0,1,3] [1,2] [2,3]
    [1,5] [7,2,6] [8,3] [9,4]
    随后map中的工作就是将A与B中对应位置的分片值逐一相乘以(i,j)作为key输出;例如A的第一个分片与B的第一个分片相乘放在第一个mapper里去做结果如下:
    (0,0) 1 ; (0, 2) 5; (1,0) 7; (1,2) 35这些都是对最终结果(i, j)位置上的值的一个分量。对于A的第二个分片和B的第二个分片我们继续做上述工作得到:(1,0) 14; (1,1) 4;(1,3) 12; (2, 0) 56; (2, 1) 16; (2, 3) 48。A的第三个分片与B的第三个分片:(0,1) 40; (0,2) 15;(2,1) 24; (2, 2) 9; (3,1) 72; (3, 2) 27。A的第四个分片与B的第四个分片:(1, 2) 54; (1, 3) 24; (3, 2) 36; (3, 3) 16;
    随后每个mapper将key 设定为 (i # j); value 为计算所得到的数值;将所有的mapper值shuffle后进入reducer。这样,相同的i, j会在一起。相加后得到(1,j) 元素的值。完成计算。

转载请著名出处:http://www.jianshu.com/p/b335ad456990
[ ]: http://latex.codecogs.com/png.latex?a_i_k*b_k_j
[ELL存储.png]:http://upload-images.jianshu.io/upload_images/5666544-f794e5f9814a9612.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
[CSR存储.png]:http://upload-images.jianshu.io/upload_images/5666544-414e9610a52e3a5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
[COO存储方式.png]:http://upload-images.jianshu.io/upload_images/5666544-1ccdc71896ffb315.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,660评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,186评论 0 18
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 今天老爸给我打了电话,说了话来安慰我。我知道他是失望的,因为我。 但是,老爸总是能够带给我无限的勇气,抹平我所有的...
    掉在泥里了阅读 227评论 0 0
  • 背景: Mac系统最近提示更新XCode,一下子从7.3升到8,这一升不要紧,再编译的时候告诉我不支持iphone...
    Daniel_Guo阅读 205评论 0 2