算法:
一、移动窗口最小二乘多项式平滑(Savitzky-Golay Smoothing)
假设数据(光谱或者是色谱等)为x,选定的平滑窗口大小为m (其必须为奇数,这里以7为例),多项式次数为n,这里以3为例,当前平滑的点为x0,前3个点分别记为:x-3,x-2,x-1,以及后三个点记为:x1,x2,x3。
移动窗口最小二乘多项式平滑就是利用中心点以及其前3个点和后3个点进行最小二乘拟和。每一个点可以表示为不同的多项式的结果,从而7个点可以表示成为含有n+1(下面的例子是4个)个未知数,m(例子中为7)个方程的方程组:
?x?3?b0?b1*(?3)?b2*(?3)2?b3*(?3)3?b0?3b1?9b2?27b3?23x?b?b*(?2)?b*(?2)?b*(?2)?b0?2b1?4b2?8b3??20123?x?b?b*(?1)?b*(?1)2?b*(?1)3?b?b?b?b230123??101?23x?b?b*(?0)?b*(?0)?b*(?0)?b0?00123?23(1) x?b?b*(1)?b*(1)?b*(1)?b?b?b?b230123?101?x?b?b*(2)?b*(2)2?b*(2)3?b?2b?4b?8b01230123?223x?b?b*(3)?b*(3)?b*(3)?b0?3b1?9b2?27b3?0123?3
对于上述方程的求解,采用最小二乘法。利用线性代数中的矩阵知识,线性方程可以表示成为下面矩阵形式:
?x?3??1?39?27?????x?2?1?24?8????b0??1?11?1????x?1????b1????1000?*?b???x0??1111??2??x1? (2)
??????b3???x2??1248??x??13927????3?即:
A*b=x (3)
因而采用最小二乘法运算,得到一个b的解析解 b*:
*t-1t从而得到这个方程组的最小二乘解为:
b=(A*A)*A*x (4)
?x?3???x?2??91821189-6??b0??-6?x?1??????b1??1?5.5-16.75-14.5014.516.75-5.5?*?x??0??b2?63?3.750-2.25-3-2.2503.75??? (5)
???x1?b???-1.751.751.750-1.75-1.751.75????3??x2??x??3?将求出来的b*代入方程(1)或者(2)就可以求出平滑之后的数据点。实际上,如果将方程(5)求得的b*代入方程(1)或者(2)之后得到如下7个方程:
1?x???342*(39x-3+8x-2-4x-1-4x0+x1+4x2-2x3)??x?1*(8x+19x+16x+6x-4x-7x+4x)-3-2-10123??242??x?1?1*(-4x-3+16x-2+19x-1+12x0+2x1-4x2+x3)42??1?x?*(-4x-3+6x-2+12x-1+14x0+12x1+6x2-4x3)?042? (6) 1?x??142*(x-3-4x-2+2x-1+12x0+19x1+16x2-4x3)??x?1*(4x-7x-4x+6x+16x+19x+8x)-3-2-10123?242??x3?1*(-2x-3+4x-2+x-1-4x0-4x1+8x2+39x3)?42?
从这个里面我们可以发现,它们其实都是这个窗口内部各个点的线性组合,即7个点由不同的权值进行加权而得,对于我们需要的点x0也是由7个点加权而得。因此从本质上说,移动窗口多项式平滑其实就是利用窗口内部各个点之间的加权来计算平滑后的新值。
计算过程中,中间部分我们只需要x0这个点的值即可,即从第四个点开始仅需要计算x0这个点的值。而对于开始的三个点和最后的三个点,没有很好的处理办法,因此我们还是利用式子(6)来计算:开始的三个点用(6)式中的x-3,x-2,x-1计算式计算,最后的三个点用(6)式中的x1,x2,x3计算式计算。
详细解释也可见分析化学手册第十分册。
二、粗糙惩罚 (Roughness Penalty Smoothing)
粗糙惩罚其实为了克服最小二乘法不稳健而引入的一个方法。设平滑后的各个点为y*(i),最小二乘法的目标函数是想让最后的结果与原始数据之间的差别最小:
2n* (7)
i?1然而在实际情况中,如果有很多异常点的话,这个标准并不能代表我们模型的准确性,有时候反而会产生非常大的误差,比如说色谱中如果噪声水平很高的话,平滑效果并不好。因此,Silverman在1994出版的一本书中提出了粗糙惩罚算法,其就是在最小二乘目标函数后面加上一个惩罚项:
min?(y(i)?y(i))min?(y(i)?y*(i))???(?2f(x))2d(x) (8)
i?1n2式中,?是惩罚系数,其越大,则说明对这个数据点的惩罚越严重。后面的积分项是对函数在x处的求二次导(这里的x并不是我们的数据点x(i)),这个也就是高等数学里面的曲线的曲率。现在的问题是如何优化这个目标函数?
目标函数中前一个式子就是最小二乘拟和,可以通过回归得到(同SG平滑),而后面的积分式,由于?2f(x)很难得到。实际上,这个目标函数是一个优化问题,可将其转化为线性代数进行求解。已经证明了,如果函数f(x)可以通过立方样条表示,则可以通过一系列的变换得到如下的算式:
?(?2f(x))d(x)?yKy2*t* (9)
其中K通过下面的表达式求得:
K?QR?1Qt (10)
对于色谱或者光谱来讲,由于是等间距采样的,故可以得到Q和R的表达式如下:
?1000???2100?1?210??01?21Q??001?2???????0000??0000?0000??0?0?0?0?0?0001000??0?00??00?00? (11)
?????21??1?2?01??0000?00??2/31/6??1/62/31/60?00???01/62/31/6?00???R??001/62/3?00? ???????????000?2/31/6??0?0000?1/62/3???其中Q是一个n*(n-2)的一个矩阵,R是一个(n-2)*(n-2)的一个方形矩阵。
(12)
利用上面两个式子(11)和(12)代入方程(10)可以求出K,再代入方程(8)经过变换之后,目
标函数变为:
n2S??(y(i)?y*(i))???(?2f(x))2d(x)i?1t?y*y?2y*y?y*(I??K)*y 求S的最小值。经过变换可以发现,当:
*t*t* (13)
y*?(I??K)?1*y (14)
的时候,S可以取最小,这样就求得了平滑函数的表达式。
但是其中?应该如何判断呢?在分析化学手册第十分册中提到了采用去一法交互检验来选择参数?,即:
y(i)?y*(i)?1CV?n?()1?Ai(?)i?1n2 (15)
其中Ai(?)是矩阵A=(I+?K)的第i个对角元素。通过代入不同的?值可以得到不同的CV值,在?变化范围之内选择CV值最小时对应的值作为参数代入(14)式,就得到了平
滑后的函数。

