scipy.optimize.curvefit() - 数组不能包含infs或NaN

Bry*_*mas 13 python curve-fitting scipy

我试图在Python中使用一些数据拟合曲线scipy.optimize.curve_fit.我遇到了错误ValueError: array must not contain infs or NaNs.

我不相信我的xy数据包含infs或NaNs:

>>> x_array = np.asarray_chkfinite(x_array)
>>> y_array = np.asarray_chkfinite(y_array)
>>>
Run Code Online (Sandbox Code Playgroud)

给什么我的一些想法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])
Run Code Online (Sandbox Code Playgroud)

我的功能:

>>> def func(x,alpha,beta,b):
...    return ((x/1)**(-alpha) * ((x+1*b)/(1+1*b))**(alpha-beta))
...
Run Code Online (Sandbox Code Playgroud)

我执行的是:

>>> popt, pcov = curve_fit(func, x_array, y_array)
Run Code Online (Sandbox Code Playgroud)

导致错误堆栈跟踪:

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
Run Code Online (Sandbox Code Playgroud)

这个错误可能不是我的数组,而是scipy在中间步骤创建的数组?我已经对相关的scipy源文件进行了一些挖掘,但事情很快就会很快调试问题.有什么明显的东西我在这里做错了吗?我在其他问题中随便提到,有时候某些初始参数猜测(我目前没有任何明确的参数猜测)可能会导致这类错误,但即使是这种情况,也很好知道a)为什么那就是以及b)如何避免它.

kir*_*off 11

为什么会失败

不是你的输入阵列将会导致nansinfs,但在某些X点和在参数的结果的一些值的目标函数的评价nansinfs:换言之,与值的阵列func(x,alpha,beta,b)对于某些X,α,β和b是给nansinfs以上优化程序.

Scipy.optimize曲线拟合函数使用Levenberg-Marquardt算法.它也被称为阻尼最小二乘优化.这是一个迭代过程,并且在每次迭代时计算最佳函数参数的新估计.此外,在优化过程中的某个时刻,算法正在探索未定义函数的参数空间的某些区域.

怎么修

1 /初步猜测

参数的初始猜测对于收敛是决定性的.如果初始猜测远非最优解,那么您更有可能探索一些未定义目标函数的区域.因此,如果您可以更好地了解最佳参数,并使用此初始猜测提供算法,则可以避免在继续操作时出错.

2 /型号

此外,您可以修改您的模型,以便它不会返回nans.对于那些未定义params原始函数的参数值func,您希望目标函数采用巨大的值,或者换句话说 func(params)远离Y值.

此外,在没有定义目标函数的点上,你可以返回一个大的浮点数,例如AVG(Y)*10e5AVG的平均值(这样你就可以确保比要安装的Y值的平均值大得多).

链接

您可以看一下这篇文章:将数据拟合到python与gnuplot中的等式