我試圖在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在這個適合中拋出錯誤。有人有想法嗎?它「運作」沒有約束,但給不可用的結果。
最有可能的b/c的起始參數是不好的。嘗試選擇合理的初始值,並看看會發生什麼,如果可以的話。另外,mpfit和kmpfit包可能更加健壯。 – reptilicus
就是這樣,看看它的運行是否正常,我會把它傳給好的值。我會看到mpfit和kmpfit如何處理這個問題。 :) – user1353285