1.3 创建一个稀疏矩阵
问题描述
高效地表示只有零星非零值的数据。
解决方案
创建一个稀疏矩阵:
讨论
在机器学习中,数据集十分庞大且其中大部分元素都是零的情况很常见。举个例子,想象一个矩阵,列元素是Netflix上的所有电影,行元素是Netflix的所有用户,矩阵中元素的值代表对于某部电影每个用户看过几次。这个矩阵将会拥有成千上万列以及数百万行!但由于大多数用户只看过一部分电影,所以绝大多数元素的值是零。
稀疏矩阵只保存非零元素并假设剩余元素的值都是零,这样能节省大量的计算成本。在上述解决方案中,我们创建了带有两个非零值的NumPy数组,然后将其转换成一个稀疏矩阵。如果查看这个稀疏矩阵,就能看到只有其中的非零值被保存下来了:
稀疏矩阵的类型有很多。在压缩的稀疏行(CSR)矩阵中,(1,1)和(2,0)
使用下标(下标的编号从0开始递增)分别表示非零值1和3。例如,元素1就位于矩阵的第二行和第二列。如果创建一个更大的矩阵,而这个矩阵有更多的非零元素,那么与普通矩阵相比,稀疏矩阵的优势就体现出来了:
如上所示,尽管实际上这个更大的矩阵中增加了很多非零元素,但是它的表示和原来那个稀疏矩阵是一模一样的。也就是说,增加的零元素没有改变稀疏矩阵的大小。
前面说过,稀疏矩阵的类型有很多,比如,压缩的稀疏列、表中表以及键值对词典。对稀疏矩阵的类型及含义的介绍超出了本书的范围,但是值得注意的是,不存在“完美”的稀疏矩阵类型,它们之间的差异都是有意义的,而且知道在什么场景下选择哪种类型的稀疏矩阵是很有必要的。
延伸阅读
● SciPy文档:稀疏矩阵(http://bit.ly/2HReBZR)
●《存储稀疏矩阵的101种方式》(http://bit.ly/2HS43cI)
本书评论