2016-12-20 13 views
0

140GBのRAMを搭載した64ビットマシンでscipy.sparse.linalg.svdsを使用して、疎なマトリックス(40,000×1,400,000)を分解しようとしました。scipy.sparse.linalg.svdsを適用するとメモリエラーが発生しますか?

k = 5000 
tfidf_mtx = tfidf_m.tocsr() 
u_45,s_45,vT_45 = scipy.sparse.linalg.svds(tfidf_mtx, k=k) 

Kが1000から4500までの範囲であれば動作します。

--------------------------------------------------------------------------- 
MemoryError        Traceback (most recent call last) 
<ipython-input-6-31a69ce54e2c> in <module>() 
     4 k = 4000 
     5 tfidf_mtx = tfidf_m.tocsr() 
----> 6 get_ipython().magic(u'time u_50,s_50,vT_50 =linalg.svds(tfidf_mtx, k=k)) 
     7 # print len(s),s 
     8 

/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.pyc in magic(self, arg_s) 
    2163   magic_name, _, magic_arg_s = arg_s.partition(' ') 
    2164   magic_name = magic_name.lstrip(prefilter.ESC_MAGIC) 
-> 2165   return self.run_line_magic(magic_name, magic_arg_s) 
    2166 
    2167  #------------------------------------------------------------------------- 

/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.pyc in run_line_magic(self, magic_name, line) 
    2084     kwargs['local_ns'] = sys._getframe(stack_depth).f_locals 
    2085    with self.builtin_trap: 
-> 2086     result = fn(*args,**kwargs) 
    2087    return result 
    2088 

/usr/lib/python2.7/dist-packages/IPython/core/magics/execution.pyc in time(self, line, cell, local_ns) 

/usr/lib/python2.7/dist-packages/IPython/core/magic.pyc in <lambda>(f, *a, **k) 
    189  # but it's overkill for just that one bit of state. 
    190  def magic_deco(arg): 
--> 191   call = lambda f, *a, **k: f(*a, **k) 
    192 
    193   if callable(arg): 

/usr/lib/python2.7/dist-packages/IPython/core/magics/execution.pyc in time(self, line, cell, local_ns) 
    1043   else: 
    1044    st = clock2() 
-> 1045    exec code in glob, local_ns 
    1046    end = clock2() 
    1047    out = None 

<timed exec> in <module>() 

/usr/local/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.pyc in svds(A, k, ncv, tol, which, v0, maxiter, return_singular_vectors) 
    1751   else: 
    1752    ularge = eigvec[:, above_cutoff] 
-> 1753    vhlarge = _herm(X_matmat(ularge)/slarge) 
    1754 
    1755   u = _augmented_orthonormal_cols(ularge, nsmall) 

/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc in dot(self, other) 
    244 
    245   """ 
--> 246   return self * other 
    247 
    248  def __eq__(self, other): 

/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.pyc in __mul__(self, other) 
    298     return self._mul_vector(other.ravel()).reshape(M, 1) 
    299    elif other.ndim == 2 and other.shape[0] == N: 
--> 300     return self._mul_multivector(other) 
    301 
    302   if isscalarlike(other): 

/usr/local/lib/python2.7/dist-packages/scipy/sparse/compressed.pyc in _mul_multivector(self, other) 
    463 
    464   result = np.zeros((M,n_vecs), dtype=upcast_char(self.dtype.char, 
--> 465               other.dtype.char)) 
    466 
    467   # csr_matvecs or csc_matvecs 

MemoryError: 

ザkはの合計に対する特異値の二乗の和の比が、3000および4500である場合:しかし、Kが5000であり、それはMemoryError.The正確なエラーを以下に示すスローすべての行列実体の二乗はそれぞれ0.7033と0.8230です。私はネットで長い時間を探しています。しかし、使用しないでください。これを達成する方法を教えてください。

+0

これは巨大なマトリックスであり、スパース行列のSVDは一般にスパースではありません。だからあなたはおそらくメモリが足りなくなっているでしょう。このような巨大マトリックスのSVDを計算するには何が必要ですか? – littleO

+0

マトリックスは、Word文書行列であり、Iは、単語間の類似性を測定するためにそれを分解する。 Word2vecは、意味的な類似性に優れますが、意味的な関連で役に立ちません。 –

答えて

0

したがって、戻り値は(M、k)配列です。普通の古いマシンでは:

In [368]: np.ones((40000,1000)) 
.... 
In [369]: np.ones((40000,4000)) 
... 
In [370]: np.ones((40000,5000)) 
... 
--> 190  a = empty(shape, dtype, order) 
    191  multiarray.copyto(a, 1, casting='unsafe') 
    192  return a 
MemoryError: 

私はあなたのコードが同じサイズでメモリエラーを打つのは間違いないかもしれません。しかし、問題を十分に大きくすると、ある時点でメモリエラーが発生します。疎行列と密2Dアレイ(その他)を乗算しながらあなたのスタックトレースがエラーを示す

が発生し、結果は同様に緻密であろう。

+0

あなたは正しいです。そして、ありがとう。私はscipyとsklearn.decomposition.TruncatedSVDで大きな行列を分解しようとしました。 kが大きい場合には、私は同じエラーを打ちます。 –

関連する問題