【问题标题】:Fitting data with multiple Gaussian profiles in Python在 Python 中用多个高斯轮廓拟合数据
【发布时间】:2019-07-17 23:02:49
【问题描述】:

我有一些数据(data.txt),我正在尝试用 Python 编写代码,以不同方式将它们与高斯轮廓拟合,以获得和比较每种情况下的峰分离和曲线下面积:

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

我尝试了几个脚本,但都失败了。

这些图中的个人资料是假的,我只是添加它们以更好地说明我的意思。

【问题讨论】:

  • 我注意到的第一件事——也是下面答案的一部分——你需要一个偏移量。

标签: python gaussian data-fitting


【解决方案1】:

一种方法如下:

  1. 定义要拟合数据的函数,即应包含在其中的所有组件的总和。在您的情况下,这是多个高斯。
  2. 找出参数的初始猜测值。
  3. 使用您喜欢的策略,根据数据拟合拟合函数。

我查看了您的数据,下面是一个非常简单的示例,使用 SciPy 的 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()

结果

【讨论】:

  • tikker,据我所知,你是天文学家,所以你能帮我让这个脚本能够计算这种光谱的等效宽度吗?
  • 我不使用光谱线,但它只是强度分布的积分。 fit 为您提供了函数形式,因此使用 Numpy 或 Scipy 的集成模块集成它应该是相当简单的。
【解决方案2】:

scikit-learn 有一个 GaussianMixtureModel 的实现,它可以做到这一点。有关示例,请参见 user guide

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2014-01-03
    • 2020-07-15
    • 2015-01-12
    • 2021-05-18
    相关资源
    最近更新 更多