推薦システムの共同フィルタリング手法として、特異値分解(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メガバイトであることを意味します。しかし、私はtmp
とvt
のサイズとメモリの使用状況を確認しました。しかし、np.dot(tmp, vt)
の時点で私のシステムは50GB以上の空きメモリを持っており、この計算には十分であるようです。では、なぜ私はこのMemoryErrorを取得していますか?私のコードに何か問題がありますか?または、np.dot
はメモリ使用量が非常に高価ですか?
を使用します。
はまばらなドキュメント(https://docs.scipy.org/doc/scipy/reference/sparse.html)
試して確認してください。 'tmp'もあります。あなたは小さな2次元で 'tmp'と' vt'を組み合わせています。したがって、 'pred'は大きな配列になります(686556、85539) – hpaulj
@hpauljあなたは' pred'が686556 * 85539 8bytes = 470GBになることを意味しますか? – Ida
はい、そのようなもの! – hpaulj