2016-10-17 61 views
1

我想實現奇異值分解(SVD)作爲推薦系統的協作過濾方法。我有這個sparse_matrix,行代表用戶和列表示項目,每個矩陣條目作爲用戶項目評級。用於小型矩陣的Numpy dot product MemoryError

>>> type(sparse_matrix) 
scipy.sparse.csr.csr_matrix 

首先我因式分解使用SVD這個矩陣:vt

from scipy.sparse.linalg import svds 
u, s, vt = svds(sparse_matrix.asfptype(), k = 2) 
s_diag = np.diag(s) 

然後我採取的us_diag點積做出預測,並且:

>>> tmp = np.dot(u, s_diag) 
>>> pred = np.dot(tmp, vt) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 

我得到了一個的MemoryError。然而,我檢查的tmpvt大小和存儲器使用:

>>> tmp.shape 
(686556, 2) 
>>> tmp.nbytes 
10984896 
>>> vt.shape 
(2, 85539) 
>>> vt.nbytes 
1368624 

這意味着tmp約爲11MB和vt是1.4MB。但在np.dot(tmp, vt)時,我的系統有超過50GB的空閒內存可用,這似乎足以進行此計算。那麼,爲什麼我得到這個MemoryError?我的代碼有問題嗎?或者np.dot在內存使用方面超級昂貴?

+1

's_diag'密集。 'tmp'也是。你在小二維上結合了'tmp'和'vt'。所以'pred'將會是一個大密集陣列(686556,85539) – hpaulj

+0

@hpaulj你的意思是'pred'會是686556 * 85539 ​​ 8bytes = 470GB,這會導致內存錯誤? – Ida

+0

是的,就是這樣的! – hpaulj

回答

0

我想你會得到這個錯誤,因爲np.dot不能處理稀疏矩陣。

作爲支票,請嘗試將矩陣轉換爲滿。

檢查稀疏文件(https://docs.scipy.org/doc/scipy/reference/sparse.html

嘗試:

np.dot(u.toarray(), s_diag.toarray()) 

或使用

u.dot(s_diag) 
+0

thx for reply,但'u','vt'和's_diag'是'numpy.ndarray'類型,它沒有屬性'toarray' – Ida