我想用高斯函数拟合一组数据(在程序中称为"数据",大小" n")我想得到参数的估计曲线,即平均值和西格玛。我在网上找到的以下代码是一种快速的方法吗?如果是这样,我怎样才能真正得到参数的估计值?
import pylab as plb
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
x = ar(range(n))
y = data
n = len(x) #the number of data
mean = sum(x*y)/n #note this correction
sigma = sum(y*(x-mean)**2)/n #note this correction
def gaus(x,a,x0,sigma,c):
return a*exp(-(x-x0)**2/(sigma**2))+c
popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma,0.0])
print popt
print pcov
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit')
plt.xlabel('q')
plt.ylabel('data')
plt.show()
答案 0 :(得分:1)
要回答您的第一个问题,"我在网上找到的以下代码是否可以快速完成此操作?"
当您认为是高斯并知道拟合函数时(除了将return
函数更改为
a*exp(-(x-x0)**2/(sigma**2))
。
我相信对于高斯函数,您不需要常量c
参数。
最小二乘最小化的常见用法是曲线拟合,其中一个具有参数化模型函数,用于解释某些现象并希望调整模型的数值以最接近地匹配某些数据。有了scipy,scipy.optimize.curve_fit通常可以解决这些问题。
要回答第二个问题,"如果是这样,我怎样才能真正得到参数的估算值?"
您可以转到为scipy.optimize.curve_fit
提供的链接,并发现最适合的参数位于popt
变量中。在您的示例中,popt
将包含您的数据的mean
和sigma
。除了最佳拟合参数外,pcov
还将包含协方差矩阵,该矩阵将包含mean
和sigma
的错误。要获得1sigma标准偏差,您只需使用np.sqrt(pcov)
并获得相同的标准差。