我想實現奇異值分解(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)
然後我採取的u
,s_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。然而,我檢查的tmp
和vt
大小和存儲器使用:
>>> 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
在內存使用方面超級昂貴?
's_diag'密集。 'tmp'也是。你在小二維上結合了'tmp'和'vt'。所以'pred'將會是一個大密集陣列(686556,85539) – hpaulj
@hpaulj你的意思是'pred'會是686556 * 85539 8bytes = 470GB,這會導致內存錯誤? – Ida
是的,就是這樣的! – hpaulj