这里展示如何使用curve_fit进行高斯双峰拟合。

其实双峰或者多峰拟合的思路非常简单,就是把单个 gaussian 函数加起来,形成一个新的函数,再使用 curve_fit 进行拟合。比较繁琐的是,参数数量倍增。

# 定义高斯函数
def gaussian(x, a, x0, sigma, b):
    '''
    x: 输入变量
    a: 参数,缩放量
    x0:高斯峰所在位置,相当于高斯分布平均值
    sigma:高斯分布一个标准差
    b: 参数,平移量
    '''
    return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))+b

def double_gaussian(x, a1, mean1, sigma1, b1, a2, mean2, sigma2, b2):
    return gaussian(x, a1, mean1, sigma1, b1) + gaussian(x, a2, mean2, sigma2, b2)

然后一个很容易理解的情况是,参数越多,拟合难度越大。因此可以在 curve_fit 中设置 最大迭代次数 maxfev 这个参数为更大值(默认为1800,可以设置到20000)。

此外还可以设置拟合参数的上下限(bounds)。但如果设置了 bounds,就不能使用默认的 lm 方法进行拟合,只能用 rtf 或者 dogbox,这些在 curve_fit 的文档中都有详细说明。

然后还有一些奏效的方法,包括对数据进行预处理,减小噪声干扰;或者对高斯函数进行变形;或者更换其它更适合的算法。

适用于简单情况下的高斯双峰拟合函数代码如下:

该部分仅登录用户可见

最后修改:2024 年 09 月 05 日
请大力赞赏以支持本站持续运行!