составляющей.оптимизировать.curvefit () - массив не должен содержать infs или NaNs

я пытаюсь поместить некоторые данные в кривую в Python, используя scipy.optimize.curve_fit. Я сталкиваюсь с ошибкой ValueError: array must not contain infs or NaNs.

я не верю, что мой x или y данные содержат infs или NaNs:

>>> 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) как этого избежать.

3 ответов


почему это не

не ваши входные массивы влекут за собой nans или infs, но оценка вашей целевой функции в некоторых точках X и для некоторых значений параметров приводит к nans или infs: другими словами, массив со значениями func(x,alpha,beta,b) для некоторых x, alpha, beta и b дает nans или infs над процедурой оптимизации.

Scipy.оптимизация функции подгонки кривой использует Levenberg-Marquardt алгоритм. Его также называют демпфированной оптимизацией наименьших квадратов. Это итерационная процедура, и на каждой итерации вычисляется новая оценка оптимальных параметров функции. Кроме того, в какой-то момент во время оптимизации алгоритм исследует некоторую область пространства параметров, где ваша функция не определена.

как исправить

1 / начальная догадка

начальное предположение для параметров является решающим для конвергенция. Если первоначальная догадка далека от оптимального решения, вы с большей вероятностью исследуете некоторые области, где целевая функция не определена. Таким образом, если вы можете лучше понять, каковы ваши оптимальные параметры, и кормить свой алгоритм этой первоначальной догадкой, ошибки при продолжении можно избежать.

2/Модель

кроме того, вы можете изменить свою модель, чтобы она не возвращалась nans. Для этих значений параметров,params где исходная функция func не определено, вы хотите, чтобы целевая функция принимала огромные значения, или другими словами, что func(params) далеко от значений Y, котор нужно приспосабливать.

кроме того, в точках, где ваша целевая функция не определена, вы можете вернуть большой поплавок, например AVG(Y)*10e5 С AVG среднее (так что вы убедитесь, что будет намного больше, чем среднее из значений Y, которые будут установлены).

ссылке

вы могли бы посмотрите на этот пост: подгонка данных к уравнению в python vs gnuplot


ваша функция имеет отрицательную мощность (x^-alpha) это то же самое, что(1/x)^(alpha). Если x когда-либо 0, ваша функция вернет inf, и Ваша операция подгонки кривой сломается, я удивлен, что предупреждение/ошибка не выдается ранее, сообщая вам о делении на 0.

кстати, почему вы умножаете и делите на 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.

Почему этот шаг нормализации исправляет ошибку?

Я нашел момент эврики здесь:PLSRegression sklearn: "ValueError: массив не должен содержать infs или NaNs"

то, что я думаю, происходит этому тупице скармливают гигантские числа и очень маленькие числа, а внутри его крошечного мозга он создает НАН и инф. Значит, это жук в склеарне. Работа заключается в сглаживании входных данных алгоритма, чтобы не было очень больших или очень маленьких чисел.

плохой sklearn! Без печенья!