什么是稀疏矩阵?
大多数元素都是0的矩阵称为稀疏矩阵,否则称为稠密矩阵。规模巨大的稀疏矩阵在应用机器学习中很常见,尤其在自然语言处理领域中,例如独热编码。稀疏矩阵的表示、计算会增加空间和时间复杂度,因此描述稀疏矩阵的稀疏性需要进行特殊的表示,以提高存储和计算性能。
本文由浅入深地结合Python实例来剖析稀疏矩阵的很多存储和计算方式,比如SciPy库在稀疏矩阵的计算上支持很好。文章内容主要包含以下几个部分。
稀疏矩阵的稀疏性
矩阵的稀疏性可以用分数来量化,等于矩阵中零值的个数除以矩阵中的元素总数:
sparsity = count zero elements / total elements
下面是一个3 x 6稀疏矩阵的例子。
1, 0, 0, 1, 0, 0
A = 0, 0, 2, 0, 0, 1
0, 0, 0, 2, 0, 0
该矩阵有13个零值元素,元素总数为18,因此该矩阵的稀疏性为:13/18=0.722.
机器学习中的稀疏矩阵
对于机器学习来说,稀疏矩阵很常见,比如用户是否看过电影库中的所有电影,用户是否购买了产品目录中的产品,歌曲目录中每首歌曲的收听次数等。
稀疏矩阵的表示方法如下:
1)Coordinate Format (COO):是一种坐标形式的稀疏矩阵。采用三个数组row、col和data保存非零元素的信息,这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。存储的主要优点是灵活、简单,仅存储非零元素以及每个非零元素的坐标。但是COO不支持元素的存取和增删,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。
2)Diagonal Storage Format (DIA,对角线存储格式):对角线矩阵,它由两个数组进行存储:values是一个二维数组,distance是一个一维数组,distance[i]表示对角线相对主对角线的偏移量。values[i][j]表示第i行,相对主对角线偏离distance[j]的那条对角线上的数值。
3)Compressed Sparse Row Format (CSR):压缩稀疏行矩阵,它由values、columns、rows三个数组组成。values是一个一维数组,columns是一个和values等长的一维数组,表示values中每个元素所在的列。rows是一个一维数组,rows[i]表示第i行元素在columns和values中的起始位置。rows数组的长度等于行数+1。