scipy稀疏数组的内存有效规范化

时间:2016-09-15 16:17:49

标签: python numpy scipy normalization sparse-matrix

我有一个脚本,可以读入许多短文档的语料库,并使用sklearn对它们进行矢量化。结果是一个大的,稀疏的矩阵(具体来说,一个scipy.sparse.csr.csr_matrix),尺寸为371k x 100k。我的目标是将其标准化,使得每行总和为1,即将每个条目除以其行中条目的总和。我尝试了几种方法,每次都给了我一个MemoryError

  • M /= M.sum(axis=1)
  • M_normalized = sklearn.preprocessing.normalize(M, axis=1, norm='l1')
  • 一个for循环,它一次一个地对行进行求和和除,并将结果添加到一个全零矩阵

对于第一个选项,我使用pdb在规范化步骤之前停止脚本,这样我就可以用htop监视内存消耗。有趣的是,只要我在脚本中执行M /= M.sum(axis=1),就会在一秒钟内立即抛出内存错误。

我的机器有16GB内存+ 16GB交换,但在进行规范化的程序中只有大约8GB + 16GB空闲。

任何人都能解释为什么所有这些方法都会遇到内存问题吗?当然第三个至少应该只使用少量内存,因为它一次只能查看一行。是否有一种更节省内存的方法来实现这一目标?

0 个答案:

没有答案