这里展示如何使用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 的文档中都有详细说明。
然后还有一些奏效的方法,包括对数据进行预处理,减小噪声干扰;或者对高斯函数进行变形;或者更换其它更适合的算法。
适用于简单情况下的高斯双峰拟合函数代码如下:
该部分仅登录用户可见
此处评论已关闭