我想用高斯函数拟合一组数据(在名为"data"的程序中,大小为"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()
要回答您的第一个问题,"我在网上找到的以下代码是一种快速的方法吗?"
事实上,当你相信是高斯的并且知道拟合函数(除了将return
函数更改为
CCD_ 2。
我相信对于高斯函数,你不需要常数c
参数。
最小二乘最小化的一个常见用途是曲线拟合,其中有一个参数化的模型函数,旨在解释一些现象,并希望调整模型的数值,以最接近地匹配一些数据。对于scipy,此类问题通常可以通过scipy.optimize.curve_filt.解决
要回答您的第二个问题,"如果是,我如何实际获得参数的估计值?"
您可以转到为scipy.optimize.curve_fit
提供的链接,发现最适合的参数位于popt
变量中。在您的示例中,popt
将包含数据的mean
和sigma
。除了最佳拟合参数外,pcov
还将包含协方差矩阵,该矩阵将具有mean
和sigma
的误差。要获得1西格玛标准偏差,您可以简单地使用np.sqrt(pcov)
并获得相同的值。