1

我正在尝试使用 python 中的模块执行多参数拟合lmfit,但要遵守某些参数组必须总和为一个的约束。

例如,假设我的卡方中有参数 B1_0 和 B1_1,我params.add('B1_0', value=0.5, min=0, max=1)为第一个和params.add('B1_1', expr='1-B1_0-B1_2') 第二个设置了参数。然后我可以使用该minimize方法找到我的模型最适合我的数据。

在我的代码中并不是这么简单;有许多自动生成的参数适合,所以我使用这样的方法:

for term in listOfTerms:
    con = constraint(term,listOfTerms)    # finds the constraint (all sum to 1)
    params.add(term,value=getValue(term),expr=con)

其中该方法getValue(term)从另一个已知最小化卡方的拟合方法返回值。当我尝试运行我的代码时,我收到如下错误消息:

Traceback (most recent call last):
  File "/home/user/Desktop/MPhys/chisquare.py", line 123, in <module>
    result = minimize(objfunc,params,args=(trans,sum_in,sum_out,data))
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 467, in minimize
    iter_cb=iter_cb, scale_covar=scale_covar, **fit_kws)
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 92, in __init__
    self.prepare_fit()
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 219, in prepare_fit
    self.update_constraints()
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 122, in update_constraints
    self.__update_paramval(name)
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
    self.__update_paramval(dep)
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
    self.__update_paramval(dep)

... ...等,以:

  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
    self.__update_paramval(dep)
  File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 106, in __update_paramval
    par = self.params[name]
RuntimeError: maximum recursion depth exceeded while calling a Python object

我不知道为什么 lmfit 在这种情况下会抛出错误。有人有想法吗?它在没有限制的情况下“工作”,但会给出不可用的结果。

4

2 回答 2

1

params.add在这个特定的问题中,通过lmfit 模块中的方法设置参数并带有一些约束。发生错误是因为程序试图在定义某些参数之前应用约束。

可以通过首先定义所有参数然后使用params['<enter parameter here>'].expr = '<expression defining constraint>.

例如:

# create a set of Parameters
params = Parameters()
params.add('amp',   value= 10,  min=0)
params.add('decay', value= 0.1) 
params.add('shift', value= 0.0, min=-np.pi/2., max=np.pi/2)
params.add('omega', value= 0.01)

params['amp'].expr = '1-decay-shift-omega'

希望这可以帮助其他人使用这个模块!

于 2013-01-18T14:36:35.993 回答
0

除了上述之外,当表达式中存在参数相互依赖时,也可以达到错误。我最近正在研究一个需要以下约束并收到相同消息的问题:

#define mr as mi/mii
params['mr'].expr='mi/mii'
params['mi'].expr='mii*(mr)'
params['mii'].expr='mi*(1/mr)'

由于这里的表达式都相互依赖,所以 lmfit 无法弄清楚。我希望这有助于其他查看此消息的人。可以通过删除表达式中的一些相互依赖性来修复该错误。这似乎是一个可以通过更改源代码以接受这些类型的依赖项来解决的问题。

干杯

于 2015-05-19T18:34:31.407 回答