1

Python でモジュールを使用してマルチパラメーター フィットを実行しようとしていlmfitますが、一部のパラメーター グループの合計が 1 になるという制約があります。

たとえば、カイ二乗にパラメーター 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') 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.addlmfit モジュールのメソッドによっていくつかの制約付きで設定されます。一部のパラメーターが定義される前に、プログラムが制約を適用しようとしているため、エラーが発生しています。

最初にすべてのパラメータを定義してから、 で制約を実装することで、これを回避できます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 に答える