MATLAB #Dataprocessing

MATLAB光滑数据的方法总结

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

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

含普通噪声的数据的光滑

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

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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
t = 0:0.06:10;
A = sin(t)+0.1*rand(size(t));

Ri = randi(length(t),4,1);
A2 = A;
A2(Ri) = A(Ri)*3;

figure(3)
B2 = filloutliers(A2,'linear','movmean',11);%标准差法
B3 = filloutliers(A2,'linear','movmedian',11);%MAD法

subplot(3,1,1)
plot(t,A2)
YL = ylim;
subplot(3,1,2)
plot(t,B2)
ylim(YL)
subplot(3,1,3)
plot(t,B3)
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可以兼顾噪声和光滑数据。