2016-10-17 13 views
1

推薦システムの共同フィルタリング手法として、特異値分解(SVD)を実装したいと考えました。私はこれを持っていますsparse_matrix、項目を表すユーザーと列を表す行と、ユーザー項目評価としての各マトリックス項目。Numpyドットプロダクト小行列用MemoryError

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

まず私はSVDを使用してこの行列を因数分解:

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

それから私は、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 

私が得ましたMemoryError。

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

tmpが11メガバイトの周りで、vtは1.4メガバイトであることを意味します。しかし、私はtmpvtのサイズとメモリの使用状況を確認しました。しかし、np.dot(tmp, vt)の時点で私のシステムは50GB以上の空きメモリを持っており、この計算には十分であるようです。では、なぜ私はこのMemoryErrorを取得していますか?私のコードに何か問題がありますか?または、np.dotはメモリ使用量が非常に高価ですか?

+1

を使用します。

はまばらなドキュメント(https://docs.scipy.org/doc/scipy/reference/sparse.html

試して確認してください。 'tmp'もあります。あなたは小さな2次元で 'tmp'と' vt'を組み合わせています。したがって、 'pred'は大きな配列になります(686556、85539) – hpaulj

+0

@hpauljあなたは' pred'が686556 * 85539 ​​ 8bytes = 470GBになることを意味しますか? – Ida

+0

はい、そのようなもの! – hpaulj

答えて

0

np.dotがスパース行列を処理できないため、このエラーが発生すると思います。

ご確認の上、行列をフルに変換してみてください。

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

または `s_diag`が密である

u.dot(s_diag) 
+0

thxが返答しますが、 'u'、' vt'、 's_diag'は' numpy.ndarray'型であり、 'toarray'属性はありません – Ida

関連する問題