【问题标题】:Scipy Optimize Curve_fit error for boundsScipy 优化边界的 Curve_fit 错误
【发布时间】:2017-10-29 21:54:00
【问题描述】:

当我尝试运行时:

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。

【问题讨论】:

  • bounds 参数是在 scipy 版本 0.17 中添加的。您使用的是哪个版本?检查import scipy; print(scipy.__version__)

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


【解决方案1】:

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

例如,你可以试试:

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

【讨论】:

    【解决方案2】:

    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/),它确实支持所有参数的界限,并且无需更改模型函数即可轻松修复/更改参数。 Lmfit 的 Model 类提供了一种方便的曲线拟合方法,以及用于探索参数置信区间的大量工具。

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2014-09-05
      • 2016-10-11
      • 2013-08-15
      • 2021-07-22
      • 2016-08-31
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多