MATLAB光滑数据的方法总结
MATLAB #Dataprocessing
MATLAB光滑数据的方法总结
对于数据的光滑,我开始理解的不透彻,直接用了一些MATLAB、Python的内置函数,没有理解其内在本质,仔细看了一些技术文章,了解了其基本原理,总结出来,希望以后可以用到
含普通噪声的数据的光滑
普通噪声即随机的噪声,是一些比较随机的波动。我们可以做的只是让这些波动变得平均。要去除背景还得用测量的结果减去背景才行。MATLAB内置了很多的函数,我们取其中的smoothdata
,filter
,movmean
函数,另外还可以手动来做卷积,来比较结果的异同。smoothdata
的处理含movmean
的选项,所以我们直接用smoothdata
函数即可。代码如下
1 | x=linspace(0,10,100); |
我们是在原函数的基础上加了背景,所以数据即使被光滑以后,也还是与源数据对不上。降噪此时只是减去了波动,而不是真的可以减去噪声。如果我们减去同样比例波动的噪声呢?
发现结果就可以在源数据附近波动了。
从上面的结果还可以看见,movmean
相当于对于一个均匀的窗口函数
做卷积,不过边界点movmean
会又专门做特殊处理。
处理离群值(粗大误差)的方法
离群值是指在测量值中,出现了一些反常的值,这个反常值与附近的其它正常值差别非常大。实验中经常有一些异常值,比如我们的荧光实验中会有一些突然的亮点,这些值可能来自宇宙射线等,怎么处理掉这些值呢?
我这里主要想介绍标准差法和MAD法。
标准差法又叫做 3
法。目的是规定一个数据波动阈值,当数据超过这个阈值的时候,便认为该数据离群。这个方法阈值的选取方法,采用窗口数据的3倍标准差。 MAD法也是定义了一个阈值,这个阈值叫做中位数绝对偏差MAD。如果超过了3倍的MAD,则认为该数据离群。
两者在Matlab里,可以用filloutliers()
函数进行实现。下面代码对比了标准差法和MAD法在消除离群值的效果:
1 | t = 0:0.06:10; |
可以看见离群值通过MAD
方法可以被非常有效的去除掉。
兼顾去噪和去除离群噪声?
MATLAB自带的函数smoothdata
还有几种基于回归的方法,
'lowess'
— Linear regression over each window ofA
. This method can be computationally expensive, but results in fewer discontinuities.'loess'
— Quadratic regression over each window ofA
. This method is slightly more computationally expensive than'lowess'
.'rlowess'
— Robust linear regression over each window ofA
. This method is a more computationally expensive version of the method'lowess'
, but it is more robust to outliers.'rloess'
— Robust quadratic regression over each window ofA
. This method is a more computationally expensive version of the method'loess'
, but it is more robust to outlier
从上面图可以看见,loess
,rlowess
可以兼顾噪声和光滑数据。