首页 > 解决方案 > 试图将高斯函数拟合到数据中

问题描述

我正在尝试使用 curve_fit 方法将一些近似高斯的数据拟合到 python 中的函数。对于参数的初始猜测,我计算了数据的平均值和标准差。但是,我的身体状况非常糟糕,我不知道为什么。这是我的代码:

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

def func(x, mu, sig):
    return (1./(sig*math.sqrt(2*math.pi)))*np.exp(-np.power(x-mu,2.)/(2*np.power(sig, 2.)));

xdata = np.linspace(4, 14, 21)
ydata = np.array([0.2,0.8,1.8,1.9,5.9,7,11,12.6,14,13.3,11.8,9.3,5.2,3.1,1.5,0.7,0.4,0.1,0.3,0.1,0.1])
plt.plot(xdata, ydata, 'b-', label='data')

popt, pcov = curve_fit(func, xdata, ydata,[4.8,5.1])
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')

拟合模型(红色)如下所示: 在此处输入图像描述

标签: pythonscipygaussian

解决方案


你得到一个无意义的答案的原因是因为你试图拟合归一化​​曲线的高斯函数。看看这里的区别。

相反,如果您使用具有 3 个参数的广义形式,您会得到更好的拟合。

def generalised_gaussian(x, a, b, c):
    return a*np.exp(-np.power((x-b)/(2*c**2), 2))

xdata = np.linspace(4, 14, 21)
ydata = np.array([0.2,0.8,1.8,1.9,5.9,7,11,12.6,14,13.3,11.8,9.3,5.2,3.1,1.5,0.7,0.4,0.1,0.3,0.1,0.1])
plt.plot(xdata, ydata, 'b-', label='data')

popt, pcov = curve_fit(generalised_gaussian, xdata, ydata)
plt.plot(xdata, generalised_gaussian(xdata, *popt), 'r-', label='fit')

合身


推荐阅读