【问题标题】:lmfit - minimizer does not accept scipy minimizer keyword argumentslmfit - 最小化器不接受 scipy 最小化器关键字参数
【发布时间】:2019-11-06 10:13:47
【问题描述】:

我正在尝试使用lmfit 为我的数据拟合一些模型。请参阅下面的 MWE:

import lmfit
import numpy as np

def lm(params, x):
    slope = params['slope']
    interc = params['interc']

    return interc + slope * x

def lm_min(params, x, data):
    y = lm(params, x)
    return data - y

x = np.linspace(0,100,1000)
y = lm({'slope':1, 'interc':0.5}, x)

ydata = y + np.random.randn(1000)

params = lmfit.Parameters()
params.add('slope', 2)
params.add('interc', 1)

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), fit_kws={'xatol':0.01})
fit = fitter.minimize(method='nelder')

为了早点完成(目前准确度不是最重要的),我想更改停止拟合的标准。根据docs 和对SO 的一些搜索,我尝试提供一些关键字参数(下一行中的fit_kws),这些参数将传递给所使用的最小化程序。我还尝试使用kws**{'xatol':0.01}。除此之外,我还在最后一行中尝试了前面提到的选项,我称之为fitter.minimize()。但是,在所有情况下,我都会收到 TypeError,说它有意外的关键字参数:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/STACK/WUR/PhD/Experiments/Microclimate experiment/Scripts/Fluctuations/mwe.py in <module>()
     25 
     26 fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), fit_kws={'xatol':0.01})
---> 27 fit = fitter.minimize(method='nelder')
     28 

~/anaconda3/envs/py/lib/python3.6/site-packages/lmfit/minimizer.py in minimize(self, method, params, **kws)
   1924                         val.lower().startswith(user_method)):
   1925                     kwargs['method'] = val
-> 1926         return function(**kwargs)
   1927 
   1928 

~/anaconda3/envs/py/lib/python3.6/site-packages/lmfit/minimizer.py in scalar_minimize(self, method, params, **kws)
    906         else:
    907             try:
--> 908                 ret = scipy_minimize(self.penalty, variables, **fmin_kws)
    909             except AbortFitException:
    910                 pass

TypeError: minimize() got an unexpected keyword argument 'fit_kws'

有人知道如何为特定求解器添加关键字参数吗?

版本信息:

蟒蛇:3.6.9
scipy:1.3.1
lmfit:0.9.12

【问题讨论】:

  • 只是通过字典,没有'fit_kws'等关键字
  • 正如我所说,我已经尝试使用 **{'xatol':0.01} 传递字典
  • 对不起,我不是说字典。只需传递 xatol = 0.01 而不传递 ** 它将作为字典接收 {'xatol':0.01}
  • 也已经尝试过了,给出了相同类型的错误,但随后出现了 xatol。
  • 您使用的是哪个版本的lmfit

标签: python scipy lmfit


【解决方案1】:

将关键字参数传递给底层 scipy 求解器的最佳方法就是使用

# Note: valid but will not do what you want
fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), xatol=0.01)
fit = fitter.minimize(method='nelder')

# Also: valid but will not do what you want
fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata))
fit = fitter.minimize(method='nelder', xatol=0.01)

这里的主要问题是xatol 不是底层求解器scipy.optimize.minimize() 的有效关键字参数。相反,您的意思可能是使用tol

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), tol=0.01)
fit = fitter.minimize(method='nelder')

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata))
fit = fitter.minimize(method='nelder', tol=0.01)

【讨论】:

  • 前 2 个选项不起作用,正如我之前解释的那样。论点 tol 确实被排除在外,并且符合我的期望。我找到了另一个解决方案,我将在下面发布。顺便说一句,感谢您更改标题,愚蠢的错误...
【解决方案2】:

在 github issue 我找到了以下解决方案:

fit = fitter.minimize(method='nelder', **{'options':{'xatol':4e-4}})

更新
正如@dashesy 提到的,这与写作相同:

fit = fitter.minimize(method='nelder', options={'xatol':4e-4})

这也适用于其他求解器选项。

【讨论】:

  • 这相当于fit = fitter.minimize(method='nelder', options={'xatol':4e-4}})
  • @dashesy:你是对的。相应地更新了我的答案。
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2018-07-30
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多