Catalog
  1. 1. MATLAB光滑数据的方法总结
    1. 1.1. 含普通噪声的数据的光滑
    2. 1.2. 处理离群值(粗大误差)的方法
    3. 1.3. 兼顾去噪和去除离群噪声?
MATLAB光滑数据的方法总结

MATLAB光滑数据的方法总结

对于数据的光滑,我开始理解的不透彻,直接用了一些MATLAB、Python的内置函数以后,没有理解其内在本质,仔细看了一些技术文章之后,了解了其基本原理,希望总结出来,可以以后用到

几种常用信号平滑去噪的方法

含普通噪声的数据的光滑

普通噪声即随机的噪声,是一些比较随机的波动。我们可以做的只是让这些波动变得平均。要去除背景还得用测量的结果减去背景才行。MATLAB内置了很多的函数,我们取其中的smoothdata,filter,movmean函数,另外还可以手动来做卷积,来比较结果的异同。smoothdata的处理含movmean的选项,所以我们直接用smoothdata函数即可。代码如下

1
x=linspace(0,10,100);
2
y=exp(-(x-5).^2)+ 0.25*rand(size(x));
3
y_0=exp(-(x-5).^2);
4
window=5;
5
b = (1/window)*ones(1,window);
6
a = 1;
7
y_smooth_gaussian=smoothdata(y,'gaussian',window);
8
y_smooth_flitter=filter(b,a,y);
9
y_smooth_cov=conv(y,b,'same');
10
y_smooth_movemean=smoothdata(y,'movmean',window);
11
figure(1)
12
plot(x,y,'DisplayName','noised data','linewidth',1.5)
13
hold on
14
plot(x,y_smooth_gaussian,'DisplayName','smoothdata','linewidth',1.5)
15
grid on
16
plot(x,y_smooth_flitter,'DisplayName','filter','linewidth',1.5)
17
grid on
18
plot(x,y_smooth_cov,'DisplayName','conver','linewidth',1.5)
19
grid on
20
plot(x,y_smooth_movemean,'DisplayName','movemean','linewidth',1.5)
21
grid on
22
plot(x,y_0,'DisplayName','without noise','linewidth',1.5)
23
grid on
24
legend()
25
xlabel('x');ylabel('y')

我们是在原函数的基础上加了背景,所以数据即使被光滑以后,也还是与源数据对不上。降噪此时只是减去了波动,而不是真的可以减去噪声。如果我们减去同样比例波动的噪声呢?

发现结果就可以在源数据附近波动了。

从上面的结果还可以看见,movmean相当于对于一个均匀的窗口函数做卷积,不过边界点movmean会又专门做特殊处理。

处理离群值(粗大误差)的方法

离群值是指在测量值中,出现了一些反常的值,这个反常值与附近的其它正常值差别非常大。实验中经常有一些异常值,比如我们的荧光实验中会有一些突然的亮点,这些值可能来自宇宙射线等,怎么处理掉这些值呢?

我这里主要想介绍标准差法和MAD法。

  • 标准差法又叫做 3 $\sigma$法。目的是规定一个数据波动阈值,当数据超过这个阈值的时候,便认为该数据离群。这个方法阈值的选取方法,采用窗口数据的3倍标准差。

  • MAD法也是定义了一个阈值,这个阈值叫做中位数绝对偏差MAD。如果超过了3倍的MAD,则认为该数据离群。

两者在Matlab里,可以用filloutliers()函数进行实现。下面代码对比了标准差法和MAD法在消除离群值的效果:

1
t = 0:0.06:10;
2
A = sin(t)+0.1*rand(size(t));
3
4
Ri = randi(length(t),4,1);
5
A2 = A;
6
A2(Ri) = A(Ri)*3;
7
8
figure(3)
9
B2 = filloutliers(A2,'linear','movmean',11);%标准差法
10
B3 = filloutliers(A2,'linear','movmedian',11);%MAD法
11
12
subplot(3,1,1)
13
plot(t,A2)
14
YL = ylim;
15
subplot(3,1,2)
16
plot(t,B2)
17
ylim(YL)
18
subplot(3,1,3)
19
plot(t,B3)
20
ylim(YL)

可以看见离群值通过MAD方法可以被非常有效的去除掉。

兼顾去噪和去除离群噪声?

MATLAB自带的函数smoothdata还有几种基于回归的方法,

  • 'lowess' — Linear regression over each window of A. This method can be computationally expensive, but results in fewer discontinuities.
  • 'loess' — Quadratic regression over each window of A. This method is slightly more computationally expensive than 'lowess'.
  • 'rlowess' — Robust linear regression over each window of A. 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 of A. This method is a more computationally expensive version of the method 'loess', but it is more robust to outlier

从上面图可以看见,loess,rlowess可以兼顾噪声和光滑数据。

Author: Knifelee
Link: https://knifelees3.github.io/2020/12/24/C_%E6%95%99%E7%A8%8B_MATLAB_%E5%85%89%E6%BB%91%E6%95%B0%E6%8D%AE%E7%9A%84%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶

Comment