我正在尝试了解Curve_Fit中的错误,希望有人可以查看我的代码并建议我是否正确理解了错误处理。 我的目标是获取可观测值,拟合多项式,然后使用拟合参数将其用于预测值。我需要的关键是不仅要有一个预测值,还要有一个误差值(y)的度量。 我认为我已经理解了来自curve_fit参数的标准误差的输出,并且据我所知,我使用它们来计算预测值(y)的标准偏差。 在我的理解中,我再次计算出的误差是标准误差,即“ 1 * sigma”,假设正态分布,一个sigma将包含68%的分散读数。 我是否正确理解了这一点,并正确利用了Curve_Fit的输出来实现这一点。 以下是一些概念验证代码。
from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
import random
#####function
def dfunc(x, a, b, c):
return a*x*x + b*x + c
#Set up trial data
knt=20
ANAL = np.zeros((3,knt))
rand = 20 #% randomization in trial data
for i in range(0,knt):
ANAL[0,i] = i
ANAL[1,i] = dfunc(i,1,2,3)*random.randint(100-rand/2,100+rand/2)/100
#fit, determine parameters values and errors
dprm, dpcv = curve_fit(dfunc, ANAL[0,],ANAL[1,])
dgcv = np.sqrt(np.diag(dpcv))
print ("Parameter values a,b,c: %5.2f %5.2f %5.2f"
% (dprm[0],dprm[1],dprm[2]))
print ("Parameter standard err: %5.2f %5.2f %5.2f"
% (dgcv[0],dgcv[1],dgcv[2]))
#Utilize to predict "y std err" for x in range 0-20
for x in range(0,20):
ANAL[2,x]=dfunc(x,*dgcv)
print ("For x=%5.2f y=%6.2f with y std err(%6.2f)"
% (x,ANAL[1,x],ANAL[2,x]))
plt.plot(ANAL[0,], ANAL[1,], 'r+', label='trial data')
plt.plot(ANAL[0,], dfunc(ANAL[0,], *dprm), 'b-', label='best fit')
plt.errorbar(ANAL[0,], dfunc(ANAL[0,], *dprm), yerr=ANAL[2,],linestyle="none")
plt.xlabel('value x')
plt.ylabel('y observations')
plt.legend()
plt.show()