【问题标题】:Trying to use curve_fit to fit histogram (binned data) with a gaussian to get optimized mean, std尝试使用curve_fit拟合直方图(合并数据)和高斯以获得优化的平均值,标准
【发布时间】:2014-02-28 07:24:12
【问题描述】:

另一个高斯拟合问题,虽然有很多有用的教程/答案,但似乎没有一个能完全解决我的问题。我正在尝试找到适合分箱数据的高斯拟合(从 70-150 运行,总共 100 个数据点)。我是新手,如有错误请见谅。

现在,代码对x_fity_fit 抛出错误,我不知道为什么。

错误是“无效语法”错误,poptpcov 上的括号似乎没有区别。

在我弄清楚之前似乎无法对其余代码进行故障排除,但如果有人对如何优化高斯拟合以适应分级数据有建议,那将非常有帮助。

谢谢!

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

#grabs data from csv - just a list of numbers
#gadata=np.genfromtxt('gaussian-lab1.csv', autostrip=True)

#grabs initial mean/std values from data
m1 = gadata.mean()
s1 = gadata.std()

def gaus(x, a, x0, sigma):
    return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))

data = py.hist(gadata, bins=10)
histx = [0.5 * data[1][i] + data[1][i + 1] for i in xrange(10)]
histy = data[0]

popt, pcov = curve_fit(gaus, histx, histy, p0=(1, m1, s1,))
x_fit = py.linspace(histx[0], histx[-1], 10)
y_fit = gaus(x_fit, *popt)
plt.plot(x_fit, y_fit, color='r')

#plots histogram
plt.hist(gadata, 10, normed=True)

#plots a gaussian with mean/std that matches data.. but want optimized
#fit1 = ss.norm(loc=m1, scale=s1)
#plt.plot(x1, histo.pdf(x1), 'r-', lw=2)

【问题讨论】:

  • 你得到的错误是什么?在上面的代码中,popt, pcov = ... 行缺少括号
  • @deinonychusaur xfit/yfit 在 popt 上给出“无效语法”错误和括号,pcov 似乎没有区别
  • 另外,在您的 gaus 方法中,curve_fit 可能会发送一个负 sigma,这(如果我的大脑不缺咖啡)应该是无效的。这可以通过在方法中添加sigma = np.log(sigma) 和在选择解决方案后添加popt[2] = np.power(np.e, popt[2]) 来解决。
  • 您能否添加足以重现您的问题的示例数据?
  • 你有两个数据gadatapodata...不是你碰巧改了他们的名字吗?

标签: python histogram gaussian


【解决方案1】:

根据定义,数据与高斯函数的最小二乘拟合与计算数据的均值和标准差相同。在任何维度上都是如此。因此,您可以省去曲线拟合或任何其他拟合方法。

【讨论】:

  • 在我的数据集中,由于数据采集错误,有时我有一两个极端异常值的数据点。它们会严重扭曲均值和标准差。但是,我相当肯定,如果我制作直方图并对其进行拟合,则异常值对我拟合的高斯的均值和标准差的影响要小得多。你说这是假的吗?
  • 在计算平均值和标准差时,您也可以使用异常值排除。
猜你喜欢
  • 2016-07-05
  • 2018-02-17
  • 2018-03-29
  • 2020-06-08
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
相关资源
最近更新 更多