2017-05-29 94 views
0

當我嘗試運行:SciPy的優化Curve_fit誤差範圍

bet = (nu[minimum],10**4,3000,0,0,5000) # Array of initial bet parameters 
bound = ((nu[0],nu[len(nu)-1]),(10**3,10**6),(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf),(-np.inf,np.inf)) 
popt,pcov = curve_fit(S_21,x,y, p0=bet, bounds = bound) 

TypeError: leastsq() got an unexpected keyword argument 'bounds'

問題是什麼?我在Windows上使用Python 3.4.4。

+1

的'bounds'論點在SciPy的版本0.17加。你正在使用哪個版本?用'import scipy檢查;打印(SciPy的.__版本__)'。 –

回答

0

scipy.optimize.leastsq不支持邊界,並被curve_fit使用,直到scipy版本0.17。 OTOH,scipy.optimize.least_squares(在更新版本的scipy中使用curve_fit)可以支持邊界,但不能在使用lm(Levenberg-Marquardt)方法時支持邊界,因爲這是圍繞scipy.optimize.leastsq的簡單封裝。這有點令人困惑。

允許我推薦嘗試lmfithttp://lmfit.github.io/lmfit-py/),它確實支持所有參數的界限,並且可以很容易地修改/更改參數,而無需更改模型函數。 Lmfit有一個方便的曲線擬合方法來處理它的Model類,以及大量用於探索參數置信區間的工具。

0

另一個解決方案,在scipy的版本低於0.17(在0.14和0.15嘗試)爲我工作是告訴leastsq做更多的func調用(但這取決於你的func的收斂速度)。

例如,你可以嘗試:

popt,pcov = curve_fit(S_21,x,y, p0=bet, maxfev=10000)