为什么我的多参数chisquare卡在错误循环中?

2024-10-02 04:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用python中的lmfit模块来实现多参数拟合,但有一个约束条件,即某些参数组必须和为一。在

例如,假设我在卡方中有参数B1\u0和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)返回另一个拟合方法的值,该方法已知可以最小化卡方。当我尝试运行我的代码时,我会收到如下错误消息:

^{pr2}$

。。。 ... 等,终止于:

  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

我不知道我为什么在这次比赛中投错球。有人有主意吗?它在没有约束的情况下“工作”,但会产生不可用的结果。在


Tags: 方法代码inadd参数valueupdateparams
2条回答

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

可以通过首先定义所有参数,然后用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'

希望这能帮助其他人使用这个模块!在

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

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

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

干杯

相关问题 更多 >

    热门问题