在python中为大型scipy.sparse矩阵操作分配内存

时间:2015-09-24 23:22:14

标签: python memory scipy ipython sparse-matrix

有没有办法可以为scipy稀疏矩阵函数分配内存以处理大型数据集?

具体来说,我试图使用非对称最小二乘平滑(翻译成python here和原始here)来对大质量数据集执行基线校正(长度为〜 60,000)。

该函数(见下文)使用scipy.sparse矩阵运算。

def baseline_als(y, lam, p, niter):
  L = len(y)
  D = sparse.csc_matrix(np.diff(np.eye(L), 2))
  w = np.ones(L)
  for i in xrange(niter):
    W = sparse.spdiags(w, 0, L, L)
    Z = W + lam * D.dot(D.transpose())
    z = spsolve(Z, w*y)
    w = p * (y > z) + (1-p) * (y < z)
  return z

当我传递长度为10,000或更少的数据集时,我没有问题:

baseline_als(np.ones(10000),100,0.1,10)

但是在传递较大的数据集时,例如

baseline_als(np.ones(50000), 100, 0.1, 10)

我为行

得到了一个MemoryError
  D = sparse.csc_matrix(np.diff(np.eye(L), 2))

1 个答案:

答案 0 :(得分:2)

尝试更改

D = sparse.csc_matrix(np.diff(np.eye(L), 2))

diag = np.ones(L - 2)
D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2)

D将是DIA gonal格式的稀疏矩阵。如果事实证明CSC格式很重要,请使用tocsc()方法转换它:

D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2).tocsc()

以下示例显示旧版本和新版本生成相同的矩阵:

In [67]: from scipy import sparse

In [68]: L = 8

原件:

In [69]: D = sparse.csc_matrix(np.diff(np.eye(L), 2))

In [70]: D.A
Out[70]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])

新版本:

In [71]: diag = np.ones(L - 2)

In [72]: D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2)

In [73]: D.A
Out[73]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.],
       [-2.,  1.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  1.,  0.,  0.],
       [ 0.,  0.,  1., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  1., -2.],
       [ 0.,  0.,  0.,  0.,  0.,  1.]])