messenger 发表于 2010-3-26 23:11:50

【转贴】数据平滑方法简介

本帖最后由 messenger 于 2010-3-26 23:12 编辑

化学计量学里面最基础的两门学科是线性代数以及统计学,前者为我们的体系建立了一个模型,并提供了非常丰富而又灵活的解决方法,后者为我们提供了评价我们这个体系的方法以及如何最好地解决这个体系的思路。在化学中,数学方法解决了化学家非常多的问题,然而仍然有非常多的体系用目前的化学计量学方法无法解决,因而必须发展新的方法以解决化学中所存在的黑箱子已经非常迫切了。
       数据平滑方法是色谱,波谱解析中必不可少的一个预处理步骤。因为对于我们仪器中所产生的数据,噪声存在是不可避免的,而如何有效的去除我们数据中存在的噪声以提高色谱或者波谱的信噪比,一直以来都是化学家研究的重大难题之一,并到现在已经提出了非常多的方法,从最简单的移动窗口平均法到移动窗口拟和多项式平滑,再到小波变换,傅利叶变换,以及各种各样的回归平滑方法,如分量回归平滑等。虽然平滑必不可少,然而选择一个好的平滑方法却非常重要,因为一个参数选择不好的话就可能使你的数据处理结果因为失真太严重而没有说服力,或者会达不到平滑的效果(尤其是在有异常点或者异常峰存在的时候)。
       由于方法太多,因而无法穷尽所有的平滑方法,而且有很多方法我也是不知道的,所以在这里发表了一下我所知道的一些平滑方法,以为大家讨论之资,也请大家能够提出一些看法或者新的方法来互相讨论。这个帖子中我想讨论的是移动窗口多项式最小二乘拟和平滑方法,粗糙惩罚方法,以及kernel平滑方法。
       移动窗口拟和多项式平滑方法(也称为Savitzky-Golay平滑)最初是由Savitzky & Golay在1964年提出来,后来经过Steinier (1973)纠正,并由Gorry给出了更一般的计算公式。我试了一下,由Gorry给出的计算公式中,用正交多项式对SG平滑的边界点进行计算,我觉得不是很好,因此只用了Steinier给出的纠正算法来平滑,在matlab里面也有一个命令 y = sgolayfilt(x,k,f),x是平滑数据,k是平滑多项式窗口宽度,f是多项式次数。
      然而,移动窗口多项式是采用的最小二乘拟和,而最小二乘拟和有一个缺陷就是在求逆的时候如果矩阵奇异的话,求逆就会得到非常大的误差。同时,如果你的数据存在异常点(outlier)的话,用最小二乘所得到的模型就会有崩溃的危险,因而在这种情况下需要用一个比较稳健的方法来进行平滑,最简单的就是移动窗口中位数平滑方法,在程序附件程序中已经给出,在图outlier中curve3就是经过中位数平滑后的结果,虽然有点失真,但蓝框框中的奇异点却被平滑。而且,上面的移动窗口平滑,对于最初的几个点和最后的几个点都无法估计,就像我在前面说的,Gorry给出了一般的SG平滑公式,边界点由正交多项式拟和,这个有时候得到的误差却很大。因此,粗糙惩罚就由统计中引入了化学计量学中,其最初由Silverman提出,他是在最小二乘判别后面加上一项惩罚项,这样既兼顾到了拟和的作用(这个是最小二乘的优势,不能丢),同时又对数据进行了惩罚,越粗糙的数据惩罚越大,即使其对整个平滑过程的作用就越小,从而相对加大了好点的作用。
         kernel方法在各个领域应用得非常广泛,其平滑方法更是在信息领域作用非凡。其也是一种移动窗口平滑方法,利用加权方法提取周围点的信息,而中心点的权重最大,这样就对窗口内的各个点进行拟和(本质上和移动窗口多项式平滑方法相同)。因此,kernel平滑方法就是利用不同的权重函数对数据进行平滑,当初最流行的是Nadaraya-Waston估计器,即权函数,后来由Gasser & Muller进行了改进,我的程序就是用改进的平滑方法。
      matlab程序和算法文件都在附件的压缩文件(smooth.rar)中,程序都是我自己编的,请大家指正一下。特别是经过这么段时间的观察,论坛里面高手多多,请多多指教。
**** Hidden Message *****
         上传图片:两个图分别为有奇异点(蓝框框中,人为设置)(outlier.jpg)和无奇异点(normal.jpg)的色谱图,图中
curve 1:模拟的色谱图加高斯噪声;
curve 2: 经过SG平滑,平滑窗口大小为7,多项式次数为3;
curve 3: 经过中位数平滑,窗口大小为9(请注意蓝框框中的奇异峰位置);
curve 4: 用粗糙惩罚进行平滑(注意边界点);
curve 5: 经过平方kernel平滑。

http://emuch.net/bbs/viewthread.php?tid=675844&view=old

tiantian0 发表于 2010-3-27 09:38:19

很好,感谢分享!

csmo007 发表于 2010-4-9 14:59:46

学习中 很好

wmwxto 发表于 2010-6-17 09:36:47

学习了 谢谢

shunfly 发表于 2010-6-17 18:22:04

本帖最后由 shunfly 于 2010-6-17 18:25 编辑

MATLAB中线性滤波,小波滤波。小波一维去噪,函数好像是wden,还不错。在地球物理领域,老前辈们对数据的圆滑,去噪,很深入。
而且,圆滑的一个前提工作必须是:分析噪声的根源。随机干扰?频率干扰?等等。
不同的干扰源的处理方法不同。
实际生产中得到的曲线,必须结合实际知识分析干扰源。比如遇到50Hz的工频干扰,那么某些情况下,处理办法就比较简单了,不需要这么负责的算法

wangwei2019 发表于 2010-6-30 16:38:30

看不了!!!!!!!!!!!!!!!

woaijoyce 发表于 2010-7-1 10:22:27

厉害,非常感谢。

fuyulucky13 发表于 2010-7-2 13:19:52

非常实用,非常有经验

fuyulucky13 发表于 2010-7-2 13:20:05

感谢分享,多谢楼主

fuyulucky13 发表于 2010-7-2 13:20:21

强烈地顶 啊

wangwei2019 发表于 2010-8-16 12:38:26

很需要!!!!!!!!!!!
谢谢!!!!!!!

novelbean 发表于 2010-10-8 12:45:50

谢谢,好好学习!!!

dnonly 发表于 2011-4-3 17:07:57

滤波的知识,对于实验力学方面也是很有价值的,正在接触,希望有所斩获

fnems 发表于 2011-4-5 12:02:16

从频域信号分析的角度讲,LZ提到的“数据平滑”是一种低通滤波吧,自己感觉是一种定性的滤波,而不是定量的,对不?因为加权平均、拟合等等手段,都是时域上的处理,旨在使时域曲线平滑。

那么对于频率敏感的数据,能否用这样的平滑方法?既然说到平滑是降低噪声带来的影响,那么如何判断噪声与实际信号的频带?换句话说,如何保证平滑操作不对真实信号的高频部分造成消减?

sxgywjj2009 发表于 2011-4-7 12:52:18

很好,感谢分享!

wangwei2019 发表于 2011-10-5 20:01:13

很感兴趣
页: [1]
查看完整版本: 【转贴】数据平滑方法简介