[英]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.