压缩矩阵CRS & CCS

来源:互联网 发布:细说php第四版pdf下载 编辑:程序博客网 时间:2024/05/22 05:11

  在用python便编写推荐相关算法时,用到了scipy中的sparse matrix来存储相似矩阵或评分数据。本文是对行压缩与列压缩ccs的总结,因为二者原理是一致的,所以只总结crs的原理。

Compressed Row Storage (CRS)

  一般,我们要取矩阵中的一个值 val 需要知道其行索引 row_ind 和列索引col_ind,假设矩阵中非0值为nnz个,需要3nnz的空间存储row_indcol_indval。CRS,顾名思义,就是对列索引row_ind进行了压缩。
如下所示,三个列表值索引了整个稀疏矩阵,其中行索引压缩为行指针,它存储了矩阵每一行在 val 中开始的位置。

项 含义 val 非0值列表 col_ind 列索引列表 row_ptr 行指针列表

下面举一个具体的例子,假设有矩阵A如下:

A=10303000970840088000077902005920300131

将矩阵A转为CRS格式,如下(索引下标从1开始):
valcol_indrow_ptr101125331692936131742202516

  可以看到 row_ptr明显短于另外两个列表,因为它只需要n+1的空间,n表示矩阵行数。这里解释一下row_ind中的值,假设val(k)=A[i,j],那么row_ptr(i)val(k)<row_ptr(i)

  比如,我们要取值A[2,1],因为row_ptr[2]=3row_ptr[3]=6,索引范围锁定在[3,6)之间,因为col_ind[3]=1,所以val[3]=3就是我们要取的值,可以看出get操作的时间复杂度是大于O(1)的。

  但是这就是所谓的空间换时间吗?并不是。在scipy的稀疏矩阵库的使用过程中,可以感受到每种压缩方式都有各自的优缺点。行压缩和列压缩方式的矩阵算术操作效率很高,从数据结构中我们也可以看到,CRS可以很方便地锁定单行的范围。例如在计算itemcf相似矩阵的时候,需要获取用户u的物品列表,使用CRS的效率会非常高。

参考

scipy sparse matrix
Compressed Row Storage
Compressed Column Storage

原创粉丝点击