2016-10-17 4 views
1

추천 시스템의 협업 필터링 방법으로 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 것을 의미 : 그러나, 나는 tmpvt의 크기와 메모리 사용량을 확인. 그러나 np.dot(tmp, vt)의 시간에는 제 시스템에 50GB 이상의 여유 메모리가 있습니다.이 계산에는 충분합니다. 그런데 왜 내가이 MemoryError를 얻고 있습니까? 내 코드에 문제가 있습니까? 또는 np.dot은 메모리 사용면에서 고가입니까?

+1

's_diag'를 사용하여 조밀하다. 'tmp'도 있습니다. 작은 2 차원에서'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이지만'u','vt' 및's_diag'는'numpy.ndarray' 유형이며'toarray' 속성이 없습니다 – Ida