我正在尝试使用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
作为参数。这些都不起作用,因此获得的拟合度只是一条平坦的曲线,中间有一个很大的尖峰。关于如何仅使用共享质心,您有任何建议吗?
数据中的最低点开始于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。