主要是解读这篇文章: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,我们就计算下面这个式子就可以了:

z = (W+\lambda D'D)^{-1}Wy

以上就是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

python的实现:https://github.com/wangyendt/BaselineRemoval

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐