稀疏矩陣存儲方式


  在數據預處理中,我們需要采集前的數據是非常龐大的。不妨將數據集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格式常用於讀入數據后進行稀疏矩陣計算。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM