Scipy优化边界的Curve_fit错误

时间:2017-05-29 14:34:51

标签: python python-3.x scipy curve-fitting bounds

当我尝试跑步时:

bet = (nu[minimum],10**4,3000,0,0,5000)   # Array of initial bet parameters
bound = ( (nu[0],nu[len(nu)-1]),(10**3,10**6),(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf) )
popt,pcov = curve_fit(S_21,x,y, p0=bet, bounds = bound)
  

TypeError:leastsq()得到了一个意外的关键字参数'bounds'

有什么问题?我在Windows上使用Python 3.4.4。

2 个答案:

答案 0 :(得分:3)

scipy.optimize.leastsq不支持边界,curve_fit使用直到scipy版本0.17。 OTOH,scipy.optimize.least_squares(在最新版本的scipy中由curve_fit使用)可以支持边界,但在使用lm(Levenberg-Marquardt)方法时却不支持,因为这很简单围绕scipy.optimize.leastsq的包装器。这有点令人困惑。

请允许我建议尝试lmfithttp://lmfit.github.io/lmfit-py/),它支持所有参数的边界,并且无需更改模型函数即可轻松修复/更改参数。 Lmfit有一个方便的曲线拟合方法,它的Model类,以及大量用于探索参数置信区间的工具。

答案 1 :(得分:1)

另一种解决方法对我来说在0.17以下的scipy版本中有用(在0.14和0.15中尝试过)是告诉leastsq对func进行更多调用(但这取决于你的func的收敛速度)。

例如,您可以尝试:

popt,pcov = curve_fit(S_21,x,y, p0=bet, maxfev=10000)