【发布时间】:2015-12-09 22:27:57
【问题描述】:
我需要使用高斯拟合对来自仪器的数据进行插值。为此,我考虑使用scipy 中的curve_fit 函数。
由于我想先在假数据上测试此功能,然后再在仪器上进行测试,因此我编写了以下代码来生成嘈杂的高斯数据并对其进行拟合:
from scipy.optimize import curve_fit
import numpy
import pylab
# Create a gaussian function
def gaussian(x, a, b, c):
val = a * numpy.exp(-(x - b)**2 / (2*c**2))
return val
# Generate fake data.
zMinEntry = 80.0*1E-06
zMaxEntry = 180.0*1E-06
zStepEntry = 0.2*1E-06
x = numpy.arange(zMinEntry,
zMaxEntry,
zStepEntry,
dtype = numpy.float64)
n = len(x)
meanY = zMinEntry + (zMaxEntry - zMinEntry)/2
sigmaY = 10.0E-06
a = 1.0/(sigmaY*numpy.sqrt(2*numpy.pi))
y = gaussian(x, a, meanY, sigmaY) + a*0.1*numpy.random.normal(0, 1, size=len(x))
# Fit
popt, pcov = curve_fit(gaussian, x, y)
# Print results
print("Scale = %.3f +/- %.3f" % (popt[0], numpy.sqrt(pcov[0, 0])))
print("Offset = %.3f +/- %.3f" % (popt[1], numpy.sqrt(pcov[1, 1])))
print("Sigma = %.3f +/- %.3f" % (popt[2], numpy.sqrt(pcov[2, 2])))
pylab.plot(x, y, 'ro')
pylab.plot(x, gaussian(x, popt[0], popt[1], popt[2]))
pylab.grid(True)
pylab.show()
不幸的是这不能正常工作,代码的输出如下:
Scale = 6174.816 +/- 7114424813.672
Offset = 429.319 +/- 3919751917.830
Sigma = 1602.869 +/- 17923909301.176
绘制的结果是(蓝色是拟合函数,红点是有噪声的输入数据):
我也尝试查看this 的答案,但无法弄清楚我的问题出在哪里。
我在这里错过了什么吗?还是我以错误的方式使用 curve_fit 函数?提前致谢!
【问题讨论】:
-
您需要提供参数的初始猜测(curve_fit 的第 4 个参数)。
-
您可能想要使用一些更高级别的适合包,例如peak-o-mat,它可以用作library,但也有一个GUI。
-
谢谢,但我不想安装其他库,这会进入一个 SW 包,应该在可能没有该特定包的不同计算机上运行。
-
你可以看看
scipy.stats.gaussian_kde
标签: python curve-fitting gaussian