高斯不适合数据

时间:2017-06-07 18:01:06

标签: python python-2.7 python-3.x scipy curve-fitting

我正在尝试将高斯曲线拟合到我的数据中,这是一个密度随高度变化的列表,但是生成的拟合曲线的曲线始终是关闭的(峰值不对齐,宽度被高估)。这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

#Gaussian function
def gauss_function(x, a, x0, sigma):
    return a*np.exp(-(x-x0)**2/float((2*sigma**2)))

x = heights5
y = demeans5 #density values at each height

amp = max(y)
center = x[np.argmax(y)]
width = 20 #eye-balled estimate


#p0 = amp, width, center
popt, pcov = curve_fit(gauss_function, x, y, p0 = [amp, width, center])

#plot
dataplot = plt.scatter(x, y, marker = '.', label = 'Observations')
gausplot = plt.plot(x,gauss_function(x, *popt), color='red', label ='Gaussian fit')

string = 'fwhm = ' + str(2.355*popt[2]) + '\npeak = ' + str(popt[0]) + '\nmean = ' + str(popt[1]) + '\nsigma = ' + str(popt[2])

#plot labels etc.
plt.xlabel("Height[km]")
plt.ylabel("Density")
plt.legend([dataplot, gausplot], labels = ['fit', 'Observations'])
plt.text(130, 2000, string)
plt.show()

这是它产生的情节:

poor fit

如何更准确地拟合曲线?而且,有没有办法用数据估算宽度?

2 个答案:

答案 0 :(得分:0)

为了更准确地拟合,您可以查看scipy.interpolate模块。那里的函数可以很好地进行插值和拟合。

其他可以做得很好的装配技术是: a)CST b)BSplines c)多项式插值

Scipy还有一个针对BSplines的实现。另外两个,你可能要自己实现。

答案 1 :(得分:0)

关于使用Python来拟合双峰的一个非常类似的问题在这里得到解答:

How to guess the actual lorentzian function without relaxation behavior with Least square curve fitting