簡體   English   中英

在python中為大型scipy.sparse矩陣操作分配內存

[英]allocate memory in python for large scipy.sparse matrix operations

有什么辦法可以為稀疏稀疏矩陣函數分配內存以處理大型數據集嗎?

具體來說,我嘗試使用非對稱最小二乘平滑(翻譯成蟒蛇這里和原來這里 )到大的質譜數據集進行基線校正(中〜60000長度)。

該函數(見下文)使用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))

嘗試改變

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.]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM