Scipy 优化边界的 Curve_fit 错误
Scipy Optimize Curve_fit error for 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() got an unexpected keyword argument 'bounds'
问题是什么?我在 Windows.
上使用 Python 3.4.4
scipy.optimize.leastsq
不支持边界,在 scipy 版本 0.17 之前被 curve_fit
使用。 OTOH,scipy.optimize.least_squares
(在 scipy 的更新版本中被 curve_fit
使用)可以支持边界,但在使用 lm
(Levenberg-Marquardt) 方法时不支持,因为这是 scipy.optimize.leastsq
的简单包装。这有点令人困惑。
请允许我推荐尝试 lmfit
(http://lmfit.github.io/lmfit-py/),它确实支持所有参数的界限,并且可以轻松 fix/vary 参数而无需更改模型函数。 Lmfit 的模型 class 提供了一种方便的曲线拟合方法,还有大量用于探索参数置信区间的工具。
另一个在 scipy 0.17 以下版本(在 0.14 和 0.15 中尝试过)对我有用的解决方法是告诉 leastsq 对 func 进行更多调用(但这取决于你的 func 的收敛速度) .
比如你可以试试:
popt,pcov = curve_fit(S_21,x,y, p0=bet, maxfev=10000)
当我尝试 运行:
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() got an unexpected keyword argument 'bounds'
问题是什么?我在 Windows.
上使用 Python 3.4.4scipy.optimize.leastsq
不支持边界,在 scipy 版本 0.17 之前被 curve_fit
使用。 OTOH,scipy.optimize.least_squares
(在 scipy 的更新版本中被 curve_fit
使用)可以支持边界,但在使用 lm
(Levenberg-Marquardt) 方法时不支持,因为这是 scipy.optimize.leastsq
的简单包装。这有点令人困惑。
请允许我推荐尝试 lmfit
(http://lmfit.github.io/lmfit-py/),它确实支持所有参数的界限,并且可以轻松 fix/vary 参数而无需更改模型函数。 Lmfit 的模型 class 提供了一种方便的曲线拟合方法,还有大量用于探索参数置信区间的工具。
另一个在 scipy 0.17 以下版本(在 0.14 和 0.15 中尝试过)对我有用的解决方法是告诉 leastsq 对 func 进行更多调用(但这取决于你的 func 的收敛速度) .
比如你可以试试:
popt,pcov = curve_fit(S_21,x,y, p0=bet, maxfev=10000)