【问题标题】:Double gaussian fit with common centroid Python具有公共质心 Python 的双高斯拟合
【发布时间】:2020-04-21 21:10:47
【问题描述】:

我正在尝试使用scipy.optimization.curve_fit 用双高斯函数拟合一些数据:

Double gaussian fit with two centroids

def _2gaussian(x, amp1, cen1, sigma1, amp2, cen2, sigma2):
    g1 = amp1 * (1 / (sigma1 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen1) / sigma1) ** 2)))
    g2 = amp2 * (1 / (sigma2 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen2) / sigma2) ** 2)))
    return g1 + g2  # + cen2

所以我的问题是:我的数据非常对称,我试图对两个高斯函数使用具有公共/共享质心的双高斯拟合。我试图在前面的公式中写cen1 而不是cen2(并在参数中保留cen2),或者也只是完全消除cen2 作为参数。这些都不起作用,因此获得的拟合只是一条中间有一个大尖峰的平坦曲线。您对如何共享质心有任何建议吗?

Double gaussian with cen1 only

【问题讨论】:

  • 您好,欢迎您。如果可能,尝试给出一个完整的最小工作示例,并带有一些(通用)数据。除此之外,您是否尝试过提供一些合理的起始值?

标签: python data-fitting


【解决方案1】:

您的数据中的最低点从 y = 4000 左右开始。但是您的高斯函数没有偏移项,因此它将始终从 y = 0 开始。您需要对数据进行归一化,或者添加如下偏移:

def _2gaussian(x, amp1, cen1, sigma1, amp2, cen2, sigma2, offset):
    g1 = amp1 * (1 / (sigma1 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen1) / sigma1) ** 2)))
    g2 = amp2 * (1 / (sigma2 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen2) / sigma2) ** 2)))
    return g1 + g2  + offset # + cen2

然后我强烈建议在curve_fit 中使用p0 参数,它可以让您为拟合函数中的每个参数指定初始猜测。在您的情况下,您对 offset 的猜测将是 4000。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2013-10-12
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2020-07-11
    • 2017-08-30
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多