sparse matrix 的分布式存儲(chǔ)和計(jì)算

矩陣乘法

我們先來(lái)補(bǔ)充一下矩陣乘法的數(shù)學(xué)知識(shí):

  1. 矩陣乘法的意義: 對(duì)一個(gè)矩陣進(jìn)行左乘一個(gè)矩陣的運(yùn)算豆励,相當(dāng)于對(duì)該矩陣的每一列元素做線性變換洼滚;對(duì)一個(gè)矩陣進(jìn)行右乘矩陣運(yùn)算相當(dāng)于對(duì)該矩陣的行進(jìn)行線性變換。
  2. 矩陣乘法的計(jì)算公式: 若矩陣A為m * n的矩陣皮璧,矩陣B為n * p的矩陣舟扎,那么兩矩陣相乘的公式如下:
A * B.png

用向量來(lái)解釋為下圖:

向量示意圖.png

分布式計(jì)算

  1. 概念:把需要進(jìn)行大量計(jì)算的工程數(shù)據(jù)分區(qū)成小塊,由多臺(tái)計(jì)算機(jī)分別計(jì)算悴务,再上傳運(yùn)算結(jié)果后睹限,將結(jié)果統(tǒng)一合并得出數(shù)據(jù)結(jié)論的科學(xué)
  2. 實(shí)現(xiàn)工具:目前最流行的分布式處理平臺(tái)是Hadoop,其流程大致如下圖:
Paste_Image.png

數(shù)據(jù)存儲(chǔ)在HDFS上通過(guò)指令分發(fā)到多個(gè)Mapper(多個(gè)計(jì)算機(jī))上進(jìn)行處理讯檐,隨后Mapper輸出的結(jié)果(key - value)按照key進(jìn)行shuffle最后傳遞到不同的reduce(統(tǒng)一合并)統(tǒng)計(jì)處理結(jié)果輸出羡疗。
關(guān)鍵點(diǎn):首先我們要將龐大的問(wèn)題拆分成運(yùn)算規(guī)則相同的子問(wèn)題;隨后通過(guò)設(shè)定Mapper輸出的key將該合并的問(wèn)題分類(lèi)到同一個(gè)reduce下實(shí)現(xiàn)分布式計(jì)算别洪。

稀疏矩陣的存儲(chǔ)方式

  • Coordinate(COO)

![COO存儲(chǔ)方式.png]
如上圖所示叨恨。我們對(duì)于矩陣的存儲(chǔ)我們需要直到三個(gè)值即可:columnid, rowid, value.于是對(duì)于一個(gè)稀疏矩陣我們可以存儲(chǔ)為三行,三個(gè)值對(duì)應(yīng)一個(gè)三元組存儲(chǔ)為一列挖垛。如右圖所示痒钝。對(duì)于等于0的元素我們可以選擇不存儲(chǔ)。因?yàn)樵谧鼍仃囘\(yùn)算時(shí)痢毒,如上面運(yùn)算公式可以看出送矩,這些元素對(duì)結(jié)果并沒(méi)有什么貢獻(xiàn)。這樣我們對(duì)于矩陣的存儲(chǔ)可以變?yōu)镺(3K)的空間復(fù)雜度哪替。(K為非零元素的個(gè)數(shù)),對(duì)于上面的存儲(chǔ)方式栋荸,我們可以進(jìn)一步對(duì)行索引進(jìn)行壓縮。就是下面所說(shuō)的行壓縮稀疏存儲(chǔ)。

  • Compressed Sparse Row (CSR)

![CSR存儲(chǔ).png]
如上圖所示蒸其,這時(shí)對(duì)行壓縮優(yōu)化的一個(gè)存儲(chǔ)方式敏释。其中三元組變?yōu)椋盒衅屏俊⒘兴饕alue钥顽。
行向量偏移量:每一行第一個(gè)非零元素在所有非零元素中的索引。也就是將所有的非零元素按矩陣的順序排列在數(shù)組中后的索引靠汁。如左圖:所有非零元素組成數(shù)組:[1,7,2,8,5,3,9,6,4],所以每行的偏移量就是該行第一個(gè)元素在該數(shù)組中的索引蜂大。(1,2,5,6) --(0,2,4,7),最后加上所有非零元素個(gè)數(shù)。
可行性分析: 我們所要做的無(wú)非是用上述三個(gè)數(shù)組的信息是否可以恢復(fù)出原有的矩陣蝶怔。我們發(fā)現(xiàn)有幾個(gè)偏移量就有幾行奶浦。并且每個(gè)元素的列是記錄了的,所以可以恢復(fù)出原有的矩陣踢星。
空間復(fù)雜度: O(2K + m), m為矩陣行數(shù)
進(jìn)一步優(yōu)化:用兩個(gè)數(shù)組來(lái)表示一個(gè)矩陣澳叉,如下面的方法

  • ELLPACK (ELL)

![ELL存儲(chǔ).png]
該方法只是在CSR上做了進(jìn)一步改進(jìn),因?yàn)槲覀儼l(fā)現(xiàn)只要記錄了非零元素的列沐悦,我們只需直到非零元素在第幾行就可以成洗。于是我們將每一行的非零元素末尾加上 #來(lái)表示該位置為這一行的結(jié)尾。于是我們可以在上面的CSR中拿出列和值的數(shù)組藏否,在其中插入#來(lái)區(qū)分每一行即可瓶殃,上圖矩陣記錄如下:
column id [0,1,#,1,2,#,0,2,3,#,1,3]
value [1,7,#,2,8,#,5,3,9,#,6,4]
通過(guò)#的個(gè)數(shù),我們可以直到該#為第幾行的結(jié)尾副签,從而直到上一個(gè)#之前的元素是第幾行元素遥椿。
空間復(fù)雜度:降到了二維的存儲(chǔ),并且可以格式很整齊淆储,對(duì)后面分布式計(jì)算有很大的幫助冠场。

矩陣乘法的分布式計(jì)算

  1. 可行性:我們從矩陣乘法的公式來(lái)看:
    A * B.png

    我們發(fā)現(xiàn)最終乘機(jī)得到的矩陣是一個(gè)m x p的矩陣,相當(dāng)于每個(gè)元素都要進(jìn)行上述公式的運(yùn)算 O(n); 求出整個(gè)矩陣復(fù)雜度就為O( n m p) = n O(m p); 我們思考可以把這個(gè)問(wèn)題拆分成n個(gè)子問(wèn)題遏考,每個(gè)子問(wèn)題需要求出m * p 個(gè)值慈鸠,而這里的每一個(gè)值都是對(duì)最終結(jié)果對(duì)應(yīng)位置的貢獻(xiàn)蓝谨,也就是我們把上面加法的每一個(gè)元素放在一個(gè)map里去處理灌具,以i#j作為key, 以![ ]為value輸出作為索引為(i, j)的元素貢獻(xiàn)值譬巫。隨后在reduce中進(jìn)對(duì)相同key的value加和作為最終結(jié)果中(i, j)的結(jié)果咖楣。這樣我們就實(shí)現(xiàn)了矩陣在k個(gè)機(jī)器上的分布式計(jì)算。這也是最小粒度相乘的一個(gè)思路芦昔,將矩陣的乘積轉(zhuǎn)化為數(shù)的乘積诱贿,隨后疊加。如下圖:
01.png
  1. 實(shí)現(xiàn)詳解
    (1) 數(shù)據(jù)切分
    首先在hdfs上的文件存儲(chǔ)我們采用ELL的存儲(chǔ)方式,并將這個(gè)二維數(shù)組按照#切分成不同的split-part珠十,例如上面的例子我們切分成了:
    [0,1] [1,2] [0,2,3] [1,3]
    [1,7] [2,8] [5,3,9] [6,4]
    上下組成columnid 與 value的對(duì)應(yīng)關(guān)系,一共4組料扰,我們對(duì)于A矩陣按照列壓縮存儲(chǔ)(存行號(hào))如下,B矩陣按照行壓縮存儲(chǔ)(存列號(hào))也就是上面所示焙蹭。
    [0,2] [0,1,3] [1,2] [2,3]
    [1,5] [7,2,6] [8,3] [9,4]
    隨后map中的工作就是將A與B中對(duì)應(yīng)位置的分片值逐一相乘以(i,j)作為key輸出晒杈;例如A的第一個(gè)分片與B的第一個(gè)分片相乘放在第一個(gè)mapper里去做結(jié)果如下:
    (0,0) 1 ; (0, 2) 5; (1,0) 7; (1,2) 35這些都是對(duì)最終結(jié)果(i, j)位置上的值的一個(gè)分量。對(duì)于A的第二個(gè)分片和B的第二個(gè)分片我們繼續(xù)做上述工作得到:(1,0) 14; (1,1) 4;(1,3) 12; (2, 0) 56; (2, 1) 16; (2, 3) 48孔厉。A的第三個(gè)分片與B的第三個(gè)分片:(0,1) 40; (0,2) 15;(2,1) 24; (2, 2) 9; (3拯钻,1) 72; (3, 2) 27。A的第四個(gè)分片與B的第四個(gè)分片:(1, 2) 54; (1, 3) 24; (3, 2) 36; (3, 3) 16;
    隨后每個(gè)mapper將key 設(shè)定為 (i # j); value 為計(jì)算所得到的數(shù)值撰豺;將所有的mapper值shuffle后進(jìn)入reducer粪般。這樣,相同的i, j會(huì)在一起污桦。相加后得到(1,j) 元素的值亩歹。完成計(jì)算。

轉(zhuǎn)載請(qǐng)著名出處:http://www.reibang.com/p/b335ad456990
[ ]: http://latex.codecogs.com/png.latex?a_i_k*b_k_j
[ELL存儲(chǔ).png]:http://upload-images.jianshu.io/upload_images/5666544-f794e5f9814a9612.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
[CSR存儲(chǔ).png]:http://upload-images.jianshu.io/upload_images/5666544-414e9610a52e3a5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
[COO存儲(chǔ)方式.png]:http://upload-images.jianshu.io/upload_images/5666544-1ccdc71896ffb315.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凡橱,一起剝皮案震驚了整個(gè)濱河市捆憎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梭纹,老刑警劉巖躲惰,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異变抽,居然都是意外死亡础拨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)绍载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诡宗,“玉大人,你說(shuō)我怎么就攤上這事击儡∷郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵阳谍,是天一觀的道長(zhǎng)蛀柴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)矫夯,這世上最難降的妖魔是什么鸽疾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮训貌,結(jié)果婚禮上制肮,老公的妹妹穿的比我還像新娘冒窍。我一直安慰自己,他們只是感情好豺鼻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布综液。 她就那樣靜靜地躺著,像睡著了一般儒飒。 火紅的嫁衣襯著肌膚如雪意乓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天约素,我揣著相機(jī)與錄音届良,去河邊找鬼。 笑死圣猎,一個(gè)胖子當(dāng)著我的面吹牛士葫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播送悔,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慢显,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了欠啤?” 一聲冷哼從身側(cè)響起荚藻,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洁段,沒(méi)想到半個(gè)月后应狱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祠丝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年疾呻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片写半。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岸蜗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叠蝇,到底是詐尸還是另有隱情璃岳,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布悔捶,位于F島的核電站铃慷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炎功。R本人自食惡果不足惜枚冗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一缓溅、第九天 我趴在偏房一處隱蔽的房頂上張望蛇损。 院中可真熱鬧,春花似錦、人聲如沸淤齐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)更啄。三九已至稚疹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祭务,已是汗流浹背内狗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留义锥,地道東北人柳沙。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拌倍,于是被迫代替她去往敵國(guó)和親赂鲤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)柱恤。 張土汪:刷leetcod...
    土汪閱讀 12,737評(píng)論 0 33
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,268評(píng)論 0 18
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法数初,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法梗顺,繼承相關(guān)的語(yǔ)法泡孩,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 今天老爸給我打了電話寺谤,說(shuō)了話來(lái)安慰我珍德。我知道他是失望的,因?yàn)槲摇?但是矗漾,老爸總是能夠帶給我無(wú)限的勇氣锈候,抹平我所有的...
    掉在泥里了閱讀 239評(píng)論 0 0
  • 背景: Mac系統(tǒng)最近提示更新XCode,一下子從7.3升到8敞贡,這一升不要緊泵琳,再編譯的時(shí)候告訴我不支持iphone...
    Daniel_Guo閱讀 236評(píng)論 0 2