python - 试图将高斯函数拟合到数据中
问题描述
我正在尝试使用 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')
拟合模型(红色)如下所示: 在此处输入图像描述
解决方案
你得到一个无意义的答案的原因是因为你试图拟合归一化曲线的高斯函数。看看这里的区别。
相反,如果您使用具有 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')
推荐阅读
- unit-testing - 角度测试在组件中模拟 store.pipe
- xslt - XSLT 转换文件中产生的额外换行符
- c# - nopcommerce 尝试在管理面板中添加自定义选项卡
- r - 时间序列的时间百分比
- php - 无法使用 cUrl 的 set_opt 调用函数
- javascript - 如何将所有值推入数组并使用 javascript 获取它们
- arrays - VBA - 多表阵列打印表
- node.js - Heroku 错误:架构无效,应为 `mongodb` 或 `mongodb+srv`
- auraphp - Aura 路由器 AJAX 路由失败 - 找不到路由
- minizinc - 如何在 minizinc 中使用 R 或 python 生成 .dzn 文件