我知道有一些類似的問題,但是因爲他們沒有給我帶來任何進一步的信息,所以我決定去問一個我自己的問題。 對不起,如果我的問題的答案已經存在,但我真的找不到它。來自scipy.optimze的curve_fit的問題
我嘗試使用curve_fit擬合f(x)= a * x ** b到相當線性的數據。編譯正確,但結果是關閉的方式如下圖所示:
的事情是,我真的不知道我在做什麼,但另一方面總是配件是更多的藝術比科學還有至少一個普通的bug with scipy.optimize。
我的數據是這樣的:
的x值:
[16.8, 2.97, 0.157, 0.0394, 14.000000000000002, 8.03, 0.378, 0.192, 0.0428, 0.029799999999999997, 0.000781, 0.0007890000000000001]
y值:
[14561.766666666666, 7154.7950000000001, 661.53750000000002, 104.51446666666668, 40307.949999999997, 15993.933333333332, 1798.1166666666666, 1015.0476666666667, 194.93800000000002, 136.82833333333332, 9.9531566666666684, 12.073133333333333]
這是我的代碼(使用在最後回答一個非常好的例子that question):
def func(x,p0,p1): # HERE WE DEFINE A FUNCTION THAT WE THINK WILL FOLLOW THE DATA DISTRIBUTION
return p0*(x**p1)
# Here you give the initial parameters for p0 which Python then iterates over to find the best fit
popt, pcov = curve_fit(func,xvalues,yvalues, p0=(1.0,1.0))#p0=(3107,0.944)) #THESE PARAMETERS ARE USER DEFINED
print(popt) # This contains your two best fit parameters
# Performing sum of squares
p0 = popt[0]
p1 = popt[1]
residuals = yvalues - func(xvalues,p0,p1)
fres = sum(residuals**2)
print 'chi-square'
print(fres) #THIS IS YOUR CHI-SQUARE VALUE!
xaxis = np.linspace(5e-4,20) # we can plot with xdata, but fit will not look good
curve_y = func(xaxis,p0,p1)
起始值來自gnuplot,這是合理的,但我需要交叉檢查。
這是打印輸出(第一裝P0,P1,則卡方):
[ 4.67885857e+03 6.24149549e-01]
chi-square
424707043.407
我想這是一個很難回答的問題,提前因此,不勝感謝!
非常感謝你,使用'sigma'使我看起來很合身。之前我沒有使用它,因爲我認爲它是a)不重要,b)「xvalues」中的錯誤。 (我沒有得到的是爲什麼'xvalues'中沒有錯誤的參數。) 另外我認爲1的估計誤差是一個設計缺陷,並且會更喜歡'0.1 *值'之類的東西。你會同意嗎?你認爲值得提交錯誤報告嗎?問候。 – Fabi
不是真的 - 代碼中我最不感到驚訝的是如果沒有給出錯誤,那麼它應該假設錯誤是不變的。這通常是你想要的。 [文檔也很清楚](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.curve_fit.html) –
我不確定。我一直認爲,它必須以某種方式不會影響到某一點的重要性,因爲先驗是兩者之間沒有區別。你知道,0可能嗎? – Fabi