在Python中使用多个高斯分布拟合数据

问题描述 投票:0回答:2

[我有一些数据(data.txt),正在尝试以Python编写代码以不同方式使其适合高斯分布,以获取并比较每种情况下的峰分离度和曲线下面积:

  1. 具有两个高斯轮廓(考虑顶部的小峰而忽略了肩膀;红色轮廓)
  2. 具有两个高斯轮廓(忽略顶部的小峰,并考虑顶部和肩膀的整个单个峰;黑色轮廓)
  3. 具有三个高斯轮廓(考虑到两个较短的高峰在肩膀上;绿色轮廓)

我尝试了几种脚本,但全部失败了。

这些图中的配置文件是伪造的,我只是添加了它们以更好地说明我的意思。

plots

python gaussian data-fitting
2个回答
1
投票

一种解决方法如下:

  1. 定义您要适合数据的函数,即应包含在其中的所有组件的总和。您的情况是多个高斯人。
  2. 查找参数的初步猜测。
  3. 根据您的喜好,将拟合函数适合数据。

我了解了您的数据,以下是使用SciPy的curve_fit方法拟合三个高斯分量和一个连续谱偏移的非常简单的示例。剩下的我留给你。这也应该让您找出其他情况。请注意,最初的猜测通常很重要,因此最好以某种方式进行受过教育猜测,以尽可能接近最佳值。

代码

curve_fit

结果

from scipy.optimize import curve_fit import matplotlib.pyplot as plt import numpy as np def gaussian(x, A, x0, sig): return A*np.exp(-(x-x0)**2/(2*sig**2)) def multi_gaussian(x, *pars): offset = pars[-1] g1 = gaussian(x, pars[0], pars[1], pars[2]) g2 = gaussian(x, pars[3], pars[4], pars[5]) g3 = gaussian(x, pars[6], pars[7], pars[8]) return g1 + g2 + g3 + offset vel, flux = np.loadtxt('data.txt', unpack=True) # Initial guesses for the parameters to fit: # 3 amplitudes, means and standard deviations plus a continuum offset. guess = [4, -50, 10, 4, 50, 10, 7, 0, 50, 1] popt, pcov = curve_fit(multi_gaussian, vel, flux, guess) plt.figure() plt.plot(vel, flux, '-', linewidth=4, label='Data') plt.plot(vel, multi_gaussian(vel, *popt), 'r--', linewidth=2, label='Fit') plt.legend() plt.show()


0
投票

scikit-learn具有GaussianMixtureModel的实现,可以做到这一点。有关示例,请参见Three-Gaussian fit

© www.soinside.com 2019 - 2024. All rights reserved.