主要是解读这篇文章:Paul H. C. Eilers Hans F.M. Buelens, Baseline Correction with Asymmetric Least Squares Smoothing
看到很多地方基线校正都用的是这个方法,这里对他的原理做个解读
1、首先需要介绍一下一种平滑算法:Whittaker 平滑法( Whittaker smoother)
介绍可以看这篇:https://eigenvector.com/wp-content/uploads/2020/01/WhittakerSmoother.pdf)
这不是这个平滑算法的原文,只是介绍,我没有找到免费的原文,所以只能放这篇
这个平滑算法的优化目标函数是minimize下面这个式子:
这里,y是指信号值,z是我们要求解的值,w和λ是我们手动指定的系数,Δ²是二阶差分的意思,也就是:
那个目标函数的式子的含义,前面y-z的那部分表示y和z的差要尽量的小,后面那个z的二阶差分的含义,就是要让z是一个平滑序列
要找到z使得S最小,我们就对z求导,也就得到下面这个式子:
其中W是一个对角矩阵,D表示二阶差分的意思:
D' 表示D的转置矩阵
要求解z,我们就计算下面这个式子就可以了:
以上就是Whittaker平滑算法
2、现在开始介绍非对称最小二乘法(Asymmetric Least Square)
所谓非对称,就是修改权重w,让y-z<0的项的权重大于y-z>0的项的权重
之所以这么处理,是因为作者注意到,有效的信号往往是大于基线很多的峰值,因此便让y-z>0的部分的影响降低
文章用了迭代的方式实现这个计算,github上也有python版和c++版的实现,具体实现方式我就没再细看了
github上c++的实现:https://github.com/kellman/ALS-Baseline-Subtraction