稀疏矩陣儲存方式

2022-01-19 07:59:59 字數 3070 閱讀 2155

在資料預處理中,我們需要採集前的資料是非常龐大的。不妨將資料集d視作乙個矩陣,每一行對應乙個樣本,每一列對應某個特徵。

而在現實生活中,例如文件分類任務,以每乙個字詞作為乙個特徵,特徵屬性多大成千上萬,即數千數萬列,而相當一部分特徵對於所考慮的問題具有「稀疏性」,也就是矩陣中許多列與當前學習任務無關。這一部分涉及到了特徵降維等知識。

在此之前,由於屬性的繁多,並不是每乙個樣本都具有所有屬性。矩陣的每一行都將充斥著相當一部分零元素。當樣本具有這樣的稀疏性時,對學習任務會有不少的好處!例如,線性支援向量機之所以能在文書處理上有良好的效能,恰是由於文字資料在使用字頻時具有高度的稀疏性,使得大部分問題都線性可分。而為了儲存的高效性,必須了解一些稀疏矩陣的儲存方法。

一、coordinate(coo)

圖一、coordinate儲存方式示例

這是最簡單的儲存格式,每乙個元素需要乙個三元組來表示,分別是 行號、 列號 以及 數值。這種方式簡單易理解,但是空間不是最優的。

二、compressed sparse row(csr)

圖二、compressed sparse row儲存方式示例一

csr不是三元組,而是整體的編碼方式。數值values和列號column indices與coo一致,表示乙個元素以及其列號。行偏移row offsets表示某一行的第乙個元素在數值values裡面的起始偏移位置。如上圖,行偏移長度為rows+1 (最後乙個元素為矩陣內的樣本總數,本例中為9)。設 i 表示第i行(矩陣索引號),i= 0, 1 , …… ,n ,當前行元素個數為num_i,則

num_i = rowoffsets[ i + 1 ]-rowoffsets[ i ]。

如第0行元素個數為2 - 0 = 2;第3行有元素[6  4],即rowoffsets[4]- rowoffsets[3] = 9-7 = 2。

下面再看乙個csr的例子:

圖三、compressed sparse row儲存方式示例二

compressed sparse column(csc) 是和csr相對應的一種稀疏矩陣儲存方式,即按列壓縮的意思。一圖二中csr示例一矩陣為示範進行csc儲存:

column offsets:0  2  5  7  9

row indices:   0  2  0  1  3  1  2  2  3

values:    1  5  7  2  6  8  3  9  4

三、ellpack(ell)

圖四、ellpack儲存方式示例

ellpack用兩個與原矩陣行相同的矩陣分別儲存列號(column indices)和數值(values)。如果沒有元素了可以用 * 代替。特別地,如果某一樣本(特定一行)所包含的屬性資訊過多,會導致列號矩陣和數值矩陣變得異常的「胖」,其他行結尾存在許多 * 標記,浪費儲存空間。

四、hybrid(hyb) ell+coo

圖五、hybrid儲存方式示例

為了解決單獨ell儲存時出現的:某乙個樣本(某一特定行)屬性過多(非零元素過多)導致的儲存空間浪費(補太多的符號 *),我們將ell儲存和coo儲存結合。設定乙個最大列數設定ell儲存時的數值矩陣和列號矩陣。將多餘的元素再通過coo儲存方式以三元組的方式進行儲存。

五、diagonal(dia)

圖六、diagonal儲存方式示例

顧名思義,對角線儲存法以每一對角線的元素為對線,將其按列存入矩陣中。按照對角線方式儲存時,儲存矩陣的列代表對角線,行代表行。省略全零的對角線。

這裡的行對應行,所以5 、6是分別在第三行第四行的,前面補上無效元素*。按照這種方式儲存矩陣,如果源實矩陣就是乙個對角性很好的矩陣那麼壓縮效率會非常高。比如圖七的上圖,而如果是隨機矩陣的話(圖七下圖),效率會非常糟糕。

圖七、diagonal儲存方式示意圖

圖八、儲存方式實用性簡單總結

選擇稀疏矩陣儲存格式的一些經驗:

1. dia和ell格式在進行稀疏矩陣-向量乘積(sparse matrix-vector products)時效率最高,所以它們是應用迭代法(如共軛梯度法)解稀疏線性系統最快的格式;

2. coo和csr格式比起dia和ell來,更加靈活,易於操作;

3. ell的優點是快速,而coo優點是靈活,二者結合後的hyb格式是一種不錯的稀疏矩陣表示格式;

4. 根據nathan bell的工作,csr格式在儲存稀疏矩陣時非零元素平均使用的位元組數(bytes per nonzero entry)最為穩定(float型別約為8.5,double型別約為12.5),而dia格式儲存資料的非零元素平均使用的位元組數與矩陣型別有較大關係,適合於structuredmesh結構的稀疏矩陣(float型別約為4.05,double型別約為8.10),對於unstructured mesh以及random matrix,dia格式使用的位元組數是csr格式的十幾倍;

5. 從我使用過的一些線性代數計算庫來說,coo格式常用於從檔案中進行稀疏矩陣的讀寫,如matrix market即採用coo格式,而csr格式常用於讀入資料後進行稀疏矩陣計算。

稀疏矩陣的儲存方式

稀疏矩陣就是指乙個矩陣中的大部分元素都是0或者是某乙個相同的元素,而稀疏矩陣往往有一些有規律的形式,比如上三角 下三角等等,這種有規律的矩陣又稱為特殊矩陣。特殊矩陣的儲存需要根據特殊矩陣哪點特殊,然後用數學的手段來進行儲存,這裡就不展開了。我們只講一般情況下的稀疏矩陣的儲存方式。儲存方式常見的有兩大...

稀疏矩陣儲存格式

當運算資料數量很大且稀疏的時候,使用稀疏的資料儲存格式可以節省大量的儲存空間且加快計算速度。本文介紹三種比較常見的稀疏矩陣表示方式 coo coordinate format座標表示 csr compressed sparse row行壓縮 csc compressed sparse column列...

稀疏矩陣的儲存

class unit def init self,val none,i none,j none 乙個三元組 self.val val self.i i self.j j class xishumatrix def init self self.matrix def destroy self self...