【问题标题】:Fitting a histogram with skewed gaussian用偏斜高斯拟合直方图
【发布时间】:2014-11-12 06:03:12
【问题描述】:

我想用偏斜的高斯拟合直方图。 我从文本文件中获取数据:

rate, err = loadtxt('hist.dat', unpack = True)

然后将它们绘制为直方图:

plt.hist(rate, bins= 128)

这个直方图有一个倾斜的高斯形状,我想拟合它。 我可以用一个简单的高斯来做到这一点,因为scipy 包含了该功能,但没有倾斜。我该如何继续?

返回的拟合优度测试可能是最好的。

【问题讨论】:

  • 偏高斯是什么意思?高斯分布,根据定义,没有偏态。
  • @WilliamZhang,en.wikipedia.org/wiki/Skew_normal_distribution。这是更普遍的情况。
  • 正如您在Wiki页面上指出的那样,最大似然估计没有封闭形式的解决方案。您可以尝试匹配前三个矩,或等效的均值、方差和偏度,因为此分布中有三个未知参数。
  • @WilliamZhang,我明白了。因此,在高斯情况下,这种分布没有任何现成的配方吗?

标签: python scipy histogram curve-fitting


【解决方案1】:

您可能会发现 lmfit (http://lmfit.github.io/lmfit-py/) 很有用。这有一个内置的倾斜高斯模型。你的问题可能很简单

from lmfit.models import SkewedGaussianModel

xvals, yvals = read_your_histogram()

model = SkewedGaussianModel()

# set initial parameter values
params = model.make_params(amplitude=10, center=0, sigma=1, gamma=0)

# adjust parameters  to best fit data.
result = model.fit(yvals, params, x=xvals)

print(result.fit_report())
pylab.plot(xvals, yvals)
pylab.plot(xvals, result.best_fit) 

这将报告参数幅值、中心、sigma(对于正态高斯)和 gamma(偏度因子)的值和不确定性。

【讨论】:

    【解决方案2】:

    使用 scipy.stats.skewnorm 的 .fit() 方法有几个答案,但该方法不允许使用初始参数并且不可靠。这个 lmfit 包更好,但我要补充一点,非零基线可能仍会将其丢弃。为了让它在我的特定数据集上工作,我首先使用 scipy.optimize.curve_fit 和普通高斯函数,这是获得基线的最快方法,然后减去它并用 lmfit 重新拟合以获得偏斜。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2018-02-17
      • 2022-01-06
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多