2013-01-17 17 views
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')。然後,我可以使用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在這個適合中拋出錯誤。有人有想法嗎?它「運作」沒有約束,但給不可用的結果。

+0

最有可能的b/c的起始參數是不好的。嘗試選擇合理的初始值,並看看會發生什麼,如果可以的話。另外,mpfit和kmpfit包可能更加健壯。 – reptilicus

+0

就是這樣,看看它的運行是否正常,我會把它傳給好的值。我會看到mpfit和kmpfit如何處理這個問題。 :) – user1353285

回答

1

在這個特定的問題中,通過來自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' 

希望這會使用這個模塊可以幫助別人!

0

除上述內容外,還可以在表達式中存在參數相關性時發生錯誤。我最近正在研究這需要以下約束和收到了同樣的消息的問題:

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

如這裏表達都依賴於彼此,所以lmfit不能弄明白。我希望這可以幫助其他人查看此消息。通過消除表達式中的一些相互依賴性可以修正錯誤。這似乎是一個可以通過更改源代碼來接受這些類型的依賴關係來解決的問題。

乾杯