与普通质心Python的双高斯拟合

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

我正在尝试使用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个回答
0
投票

数据中的最低点开始于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

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

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