2016-04-26 48 views
2

我知道有一些類似的問題,但是因爲他們沒有給我帶來任何進一步的信息,所以我決定去問一個我自己的問題。 對不起,如果我的問題的答案已經存在,但我真的找不到它。來自scipy.optimze的curve_fit的問題

我嘗試使用curve_fit擬合f(x)= a * x ** b到相當線性的數據。編譯正確,但結果是關閉的方式如下圖所示:

enter image description here

的事情是,我真的不知道我在做什麼,但另一方面總是配件是更多的藝術比科學還有至少一個普通的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 

我想這是一個很難回答的問題,提前因此,不勝感謝!

回答

1

當配件curve_fit優化的總和(數據 - 模型)^ 2 /(誤差)^ 2

如果不出現錯誤傳遞(如你在這裏做)curve_fit假設所有的點有錯誤1.

在這種情況下,由於您的數據跨越很多數量級,具有最大y值的點主導目標函數,並且導致curve_fit嘗試以犧牲其他值爲代價來適應它們。

解決這個問題的最好方法是將yvalues中的錯誤包含在fit中(它看起來就像你在做的圖中有誤差線一樣)。您可以通過將參數curve_fit作爲參數傳入來完成此操作。

+0

非常感謝你,使用'sigma'使我看起來很合身。之前我沒有使用它,因爲我認爲它是a)不重要,b)「xvalues」中的錯誤。 (我沒有得到的是爲什麼'xvalues'中沒有錯誤的參數。) 另外我認爲1的估計誤差是一個設計缺陷,並且會更喜歡'0.1 *值'之類的東西。你會同意嗎?你認爲值得提交錯誤報告嗎?問候。 – Fabi

+0

不是真的 - 代碼中我最不感到驚訝的是如果沒有給出錯誤,那麼它應該假設錯誤是不變的。這通常是你想要的。 [文檔也很清楚](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.curve_fit.html) –

+0

我不確定。我一直認爲,它必須以某種方式不會影響到某一點的重要性,因爲先驗是兩者之間沒有區別。你知道,0可能嗎? – Fabi

1

我會重新考慮實驗部分。兩個數據點是有疑問的: enter image description here

你向我們展示的圖像看起來很不錯,因爲你把日誌:

enter image description here

你可以做日誌(x)的線性擬合和log(Y) 。這樣可以限制最大殘差的影響。另一種方法是強大的迴歸(sklearn的RANSAC或scipy的least_squares)。

不過,您應該收集更多數據點或重複測量。

+0

好吧,其他數據並不是真正的選擇,但我可以忽略點,如果不是合理的話,因爲我所有的點都是單一的。 但你對計算的想法是非常有用的,我會牢記它們。謝謝。 – Fabi