추천 시스템의 협업 필터링 방법으로 SVD (Singular Value Decomposition)를 구현하고 싶었습니다. 이 sparse_matrix
, 항목을 나타내는 사용자 및 열을 나타내는 행 및 사용자 항목 등급으로 각 매트릭스 항목이 있습니다.Numpy dot product 작은 매트릭스 용 MemoryError
from scipy.sparse.linalg import svds
u, s, vt = svds(sparse_matrix.asfptype(), k = 2)
s_diag = np.diag(s)
그럼 I가 u
, s_diag
의 내적을 취함으로써 예측을하고, vt
:
>>> tmp = np.dot(u, s_diag)
>>> pred = np.dot(tmp, vt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
I가있어
>>> type(sparse_matrix)
scipy.sparse.csr.csr_matrix
먼저 I이 SVD를 이용한 행렬을 인수 분해 MemoryError.
>>> tmp.shape
(686556, 2)
>>> tmp.nbytes
10984896
>>> vt.shape
(2, 85539)
>>> vt.nbytes
1368624
tmp
이 11메가바이트 주위와 vt
는 1.4MB 것을 의미 : 그러나, 나는 tmp
과 vt
의 크기와 메모리 사용량을 확인. 그러나 np.dot(tmp, vt)
의 시간에는 제 시스템에 50GB 이상의 여유 메모리가 있습니다.이 계산에는 충분합니다. 그런데 왜 내가이 MemoryError를 얻고 있습니까? 내 코드에 문제가 있습니까? 또는 np.dot
은 메모리 사용면에서 고가입니까?
's_diag'를 사용하여 조밀하다. 'tmp'도 있습니다. 작은 2 차원에서'tmp'와'vt'를 결합합니다. 그래서'pred'는 큰 조밀 배열이 될 것입니다 (686556, 85539) – hpaulj
@hpaulj 당신은'pred'가 686556 * 85539 * 8bytes = 470GB가되어 메모리 오류가 발생한다는 것을 의미합니까? – Ida
예, 그런 것입니다! – hpaulj