[英]Problems with curve_fit from scipy.optimze
我知道有一些類似的問題,但由於他們都沒有帶我進一步,我決定問一個我自己的問題。 對不起,如果我的問題的答案已經在某處,但我真的找不到它。
我嘗試使用curve_fit將f(x)= a * x ** b擬合為相當線性的數據。 它編譯正確,但結果如下所示:
問題是,我真的不知道我在做什么,但另一方面,擬合總是更像是一門藝術,而不是科學,至少有一個與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]
這是我的代碼(在該問題的最后一個答案中使用了一個非常好的例子):
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
我想這是一個很難的問題,所以非常感謝!
當擬合curve_fit
優化(數據 - 模型)^ 2 /(誤差)^ 2的總和時
如果您沒有傳遞錯誤(正如您在此處所做的那樣), curve_fit
假定所有點的錯誤均為1。
在這種情況下,當您的數據跨越多個數量級時,具有最大y值的點主導目標函數,並導致curve_fit
嘗試以犧牲其他值為代價來擬合它們。
修復此問題的最佳方法是在擬合中包含yvalues
的誤差(看起來就像你在你繪制的圖中有誤差條一樣!)。 您可以通過將它們作為curve_fit
的sigma
參數傳遞來完成此curve_fit
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.