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)