2017-08-10 21 views
2

sklearnのTruncatedSVDのランダム化バージョンを使用しようとしています(私は実際には実際のu、s、v行列を得るために内部関数randomized_svdを呼び出しています)。それは本当の行列に対して正常に動作している一方で、複雑なマトリックスのために、私は元の行列を取り戻すことができない特異値は正確に正しいにもかかわらず:sklearn truncated svdが複雑な行列に対して機能しない

>>> import numpy as np 
>>> from sklearn.utils.extmath import randomized_svd 
>>> N = 3 
>>> a = np.random.rand(N, N)*(1 + 1j) 
>>> u1, s1, v1 = np.linalg.svd(a) 
>>> u2, s2, v2 = randomized_svd(a, n_components=N, n_iter=7) 
>>> np.allclose(s1, s2) 
True 
>>> np.allclose(a, u1.dot(np.diag(s1)).dot(v1)) 
True 
>>> np.allclose(a, u2.dot(np.diag(s2)).dot(v2)) 
False 

間違っている可能性がどのような任意のアイデア?

答えて

0

それは特にこの変換に、これはrandomized_svdのバグであることが判明:この交換

B = safe_sparse_dot(Q.T, M) 

B = safe_sparse_dot(Q.T.conj(), M) 

ことで、問題を解決します。

関連する問題