当我尝试跑步时:
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。
答案 0 :(得分:3)
scipy.optimize.leastsq
不支持边界,curve_fit
使用直到scipy版本0.17。 OTOH,scipy.optimize.least_squares
(在最新版本的scipy中由curve_fit
使用)可以支持边界,但在使用lm
(Levenberg-Marquardt)方法时却不支持,因为这很简单围绕scipy.optimize.leastsq
的包装器。这有点令人困惑。
请允许我建议尝试lmfit
(http://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)