14

を使用して、Pythonの曲線にいくつかのデータを適合させようとしていscipy.optimize.curve_fitます。エラーが発生していますValueError: array must not contain infs or NaNs

私のデータxまたはyデータにinfまたはNaNが含まれているとは思わない:

>>> x_array = np.asarray_chkfinite(x_array)
>>> y_array = np.asarray_chkfinite(y_array)
>>>

x_array私とy_arrayどちらかの端でどのように見えるか(x_arrayカウントと分位数)のいくつかのアイデアを与えるためにy_array

>>> type(x_array)
<type 'numpy.ndarray'>
>>> type(y_array)
<type 'numpy.ndarray'>
>>> x_array[:5]
array([0, 0, 0, 0, 0])
>>> x_array[-5:]
array([2919, 2965, 3154, 3218, 3461])
>>> y_array[:5]
array([ 0.9999582,  0.9999163,  0.9998745,  0.9998326,  0.9997908])
>>> y_array[-5:]
array([  1.67399000e-04,   1.25549300e-04,   8.36995200e-05,
     4.18497600e-05,  -2.22044600e-16])

そして私の機能:

>>> def func(x,alpha,beta,b):
...    return ((x/1)**(-alpha) * ((x+1*b)/(1+1*b))**(alpha-beta))
...

私が実行しているもの:

>>> popt, pcov = curve_fit(func, x_array, y_array)

結果としてエラースタックトレースが発生します。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 426, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 338, in leastsq
cov_x = inv(dot(transpose(R),R))
File "/usr/lib/python2.7/dist-packages/scipy/linalg/basic.py", line 285, in inv
a1 = asarray_chkfinite(a)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 590, in asarray_chkfinite
"array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

エラーは私の配列に関するものではなく、中間ステップでscipyによって作成された配列に関するものである可能性があると思いますか私は関連するscipyソースファイルを少し掘り下げましたが、その方法で問題をデバッグするのは非常に迅速になります。私がここで間違っていることは明らかですか?他の質問で何気なく言及したことがありますが、特定の初期パラメーターの推測(現在は明示的ではありません)がこの種のエラーを引き起こす可能性がありますが、その場合でも、a)理由を知っておくとよいでしょう。つまり、b)それを回避する方法です。

4

3 に答える 3

12

失敗する理由

入力配列がnansorを伴うわけではありませんinfsが、いくつかの X ポイントでの目的関数の評価とパラメーターのいくつかの値の結果はnansorです。つまり、いくつかの x、alpha、beta、および b のinfs値を持つ配列はorを与えています最適化ルーチン。func(x,alpha,beta,b)nansinfs

Scipy.optimize 曲線近似関数は、Levenberg-Marquardt アルゴリズムを使用します。減衰最小二乗最適化とも呼ばれます。これは反復手順であり、最適な関数パラメーターの新しい推定値が各反復で計算されます。また、最適化中のある時点で、アルゴリズムは、関数が定義されていないパラメーター空間の領域を探索しています。

直し方

1/初期推測

パラメーターの初期推定は、収束の決定的な要素です。初期推定が最適解からかけ離れている場合、目的関数が定義されていない領域を調査する可能性が高くなります。したがって、最適なパラメーターが何であるかについてより良い手がかりを得ることができ、この最初の推測をアルゴリズムに与えることができれば、続行中のエラーを回避できる可能性があります。

2/モデル

また、モデルを変更して、 を返さないようにすることもできますnansparams元の関数が定義されていないパラメーターの値については、func目的関数が巨大な値を取ること、つまり、 func(params)適合する Y 値から遠く離れていることを望みます。

また、目的関数が定義されていないポイントでは、たとえばAVG(Y)*10e5AVG の平均など、大きな浮動小数点数を返す場合があります (適合する Y 値の平均よりもはるかに大きいことを確認するため)。

リンク

この投稿を見ることができます: Fitting data to an equation in python vs gnuplot

于 2013-01-23T06:02:38.497 に答える
3

関数には負のべき乗 (x^-alpha) があり、これは (1/x)^(alpha) と同じです。x が 0 の場合、関数は inf を返し、カーブ フィット操作が中断されます。0 で除算したことを通知する警告/エラーが以前にスローされないことに驚いています。

ところで、なぜあなたは1を掛けたり割ったりしているのですか?

于 2013-01-23T00:11:35.517 に答える
1

次のように、python2.7でこのエラーを再現できました。

from sklearn.decomposition import FastICA
X = load_data.load("stuff")    #this sets X to a 2d numpy array containing 
                               #large positive and negative numbers.
ica = FastICA(whiten=False)

print(np.isnan(X).any())   #this prints False
print(np.isinf(X).any())   #this prints False

ica.fit(X)                 #this produces the error:

常にエラーが発生します:

/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py:58: RuntimeWarning: invalid value encountered in sqrt
  return np.dot(np.dot(u * (1. / np.sqrt(s)), u.T), W)
Traceback (most recent call last):
  File "main.py", line 43, in <module>
    ica()
  File "main.py", line 18, in ica
    ica.fit(X)
  File "/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py", line 523, in fit
    self._fit(X, compute_sources=False)
  File "/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py", line 479, in _fit
    compute_sources=compute_sources, return_n_iter=True)
  File "/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py", line 335, in fastica
    W, n_iter = _ica_par(X1, **kwargs)
  File "/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py", line 108, in _ica_par
    - g_wtx[:, np.newaxis] * W)
  File "/usr/lib64/python2.7/site-packages/sklearn/decomposition/fastica_.py", line 55, in _sym_decorrelation
    s, u = linalg.eigh(np.dot(W, W.T))
  File "/usr/lib64/python2.7/site-packages/scipy/linalg/decomp.py", line 297, in eigh
    a1 = asarray_chkfinite(a)
  File "/usr/lib64/python2.7/site-packages/numpy/lib/function_base.py", line 613, in asarray_chkfinite
    "array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

解決:

from sklearn.decomposition import FastICA
X = load_data.load("stuff")    #this sets X to a 2d numpy array containing 
                               #large positive and negative numbers.
ica = FastICA(whiten=False)

#this is a column wise normalization function which flattens the
#two dimensional array from very large and very small numbers to 
#reasonably sized numbers between roughly -1 and 1
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

print(np.isnan(X).any())   #this prints False
print(np.isinf(X).any())   #this prints False

ica.fit(X)                 #this works correctly.

その正規化ステップでエラーが修正されるのはなぜですか?

ここで発見の瞬間を見つけました: sklearn's PLSRegression: "ValueError: array must not contain infs or NaNs"

私が考えているのは、numpy が巨大な数と非常に小さな数を与えられており、その小さな脳の中で NaN と Inf を作成していることです。つまり、sklearn のバグです。回避策は、入力データをアルゴリズムにフラット化して、非常に大きな数値や非常に小さな数値がないようにすることです。

悪いsklearn!ビスケットはありません!

于 2016-04-03T20:00:58.983 に答える