web-dev-qa-db-ja.com

LinAlgError( "SVDは収束しませんでした")を発生させますLinAlgError:SVDはmatplotlib pca決定で収束しませんでした

コード:

import numpy
from matplotlib.mlab import PCA
file_name = "store1_pca_matrix.txt"
ori_data = numpy.loadtxt(file_name,dtype='float', comments='#', delimiter=None,                 converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
result = PCA(ori_data)

これは私のコードです。私の入力マトリックスにはnanとinfがありませんが、以下のエラーが発生します。

raise LinAlgError("SVD did not converge") LinAlgError: SVD did not converge

どうしたの?

17
user 3317704

これは、データにinf値またはnan値がある場合に発生する可能性があります。

これを使用して、nan値を削除します。

ori_data.dropna(inplace=True)
28
jseabold

この質問に対する答えはありませんが、ナンとインフのない複製シナリオがあります。残念ながら、データセットはかなり大きい(96MB gzip圧縮)。

import numpy as np
from StringIO import StringIO
from scipy import linalg
import urllib2
import gzip

url = 'http://physics.muni.cz/~vazny/gauss/X.gz'
X = np.loadtxt(gzip.GzipFile(fileobj=StringIO(urllib2.urlopen(url).read())), delimiter=',')
linalg.svd(X, full_matrices=False)

どの上昇:

LinAlgError: SVD did not converge

オン:

>>> np.__version__
'1.8.1'
>>> import scipy
>>> scipy.__version__
'0.10.1'

ただし、例外は発生しませんでした:

>>> np.__version__
'1.8.2'
>>> import scipy
>>> scipy.__version__
'0.14.0'
5
Jiří Polcar

私はこの投稿が古いことを知っていますが、他の誰かが同じ問題に遭遇した場合に備えて。 @jseaboldは、問題がnanまたはinfであると言ったときは正しかったのですが、データにnanまたはinfが含まれていなかったと言ったとき、opはおそらく正しかったでしょう。ただし、ori_dataの列の1つが常に同じ値である場合、mlabでのPCAの実装により入力データが正規化されるため、データはNansになります。

ori_data = (ori_data - mean(ori_data)) / std(ori_data).

解決策は次のとおりです。

result = PCA(ori_data, standardize=False)

この方法では、標準偏差で除算せずに平均のみが減算されます。

4
Vlamir

InfまたはNaN値がない場合は、メモリの問題である可能性があります。より高いRAMを搭載したマシンで試してください。

0
Paritosh Gupta

Numpy 1.11.0を使用しています。マトリックスに0に等しい複数のeigvalueがある場合、「SVDは収束しませんでした」が発生します。

0
nos

これは、入力データマトリックス(PCAに供給している)の特異性による可能性があります

0
Sumit Waghmare

データが正しい場合でも、メモリが不足するために発生する可能性があります。私の場合、32ビットマシンからより大きなメモリを備えた64ビットマシンに移行することで問題は解決しました。

0
Slava

@ c-chavezの回答に従って、私にとってうまくいったのは、最初にinfと-infをnanに置き換えてから、nanを削除することでした。例えば:

data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()
0
hevronig