|
7 y6 |( i& g) x% Q, V- Q 如何使用Matlab对数据进行预处理 8 R# c3 u" o% ?+ G4 @2 ?
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 % j0 ]5 P3 V" t; I$ O4 Q
1.1 smooth函数
; M+ ]* M4 b3 N k* | Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
# c7 c! M3 h0 `3 x5 R4 H$ Z* K 1)xx = smooth(x) i) z# W* I X, R1 e
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
- j! ^% `+ ]# ~. f$ \; I9 M xx(1) = x(1) 3 L; V8 c5 W. W W4 A; H6 w3 d
xx(2) = (x(1)+x(2)+x(3))/3 ' |0 E9 `" K* {) ?
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 4 X) H0 B+ L# ~
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
; q' ]& V# T1 k$ N0 g, r xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
& s7 U9 k- b9 i A$ h6 \ 2)xx = smooth(x,span) * a, B4 \: j) @" p/ h" b* b( i1 S( Q
用span参数指定移动平均滤波器的宽度,span为奇数。
: c/ q6 \3 ^ {) C0 {$ l& x7 w% }1 } 3)xx = smooth(x,method) 3 x: e) @) C) K% Q! v
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
( ^' e+ i9 c' g/ f* v$ j 表1 smooth参数支持的method参数值列表 & g) W6 a0 |8 [! Y9 H3 z
 ' }' ^2 ^- f/ N# I, {% Z# o& M8 O
4)xx = smooth(x,span,method)
! X% L* m; `: k& \: c; z 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 7 A8 `& I$ l8 D% `- q; r% s
5)xx = smooth(x,sgolay, degree)
y0 [5 m! ?, u" s1 l0 K$ D: p" N! v 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 1 {1 O2 S5 x6 S0 L p2 T- d) G) L
6)xx = smooth(x, span, sgolay , degree)
; R1 ?% U# v- d* @( \ @ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 6 J2 G- O9 I( v8 @1 x% V
7) xx = smooth(x,y, ..)
$ m" m) d8 Y& r( M: u+ M 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
$ g. _# l" T) H3 r9 w! G 【例题1】 , D2 ^5 z: F% T! \% s
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
3 e4 A! ?! |3 c" f7 I2 S 思路: + g" }" X8 n1 i5 {
1. 调用smooth函数进行加噪数据的平滑处理;
& r5 r# Z4 E3 D: v$ e( c 2. 产生加噪正弦波信号;
1 ^3 |# K; l* r8 e) G' D# y 3. 绘制加噪波形图。 , s; f6 z/ y/ g1 ~: Y& L/ F
解题步骤:
- ? U* ~" k+ }5 y! q 1)构建数据 6 U: b& m) ?0 v1 {, i! ?
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 7 B4 U1 u" S1 N t6 }/ v0 C. B
y = 100*sin(t); % 产生正弦波信号 ' X) j9 ]) d3 x, v4 M' J9 f
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 / ]$ J O; x- l- f+ u Z6 d0 ^
noise = normrnd(0,15,500,1);
$ L0 x) X6 s- _: ]/ d4 X y = y + noise; % 将正弦波信号加入噪声信号
# ?3 e' B( B: X0 a) E 2)制作基础图
" r, s( J Z$ j6 u figure; % 新建一个图形窗口
% e9 \- e2 @7 V$ O plot(t,y); % 绘制加噪波形图 4 l/ c& c8 M+ _; p' ~; c. D7 s
xlabel(t); % 为X轴加标签 1 f4 q* W6 f* U
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 3 R% x7 {! V# T$ h5 M
 , i5 B1 k/ f w/ K9 `6 q$ W
3)制作平滑波形图 3 x# |; H- t1 |, M) b
【方法一】
8 f/ L) w' O) c! n4 q3 Z 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
% I- y9 Q9 F( ` yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 6 w/ B7 k7 `# C0 n
figure; % 新建一个图形窗口
- q; \5 Q' Q0 a5 X& J plot(t,y,k ; % 绘制加噪波形图 & o7 c$ o' |4 X7 S8 D1 R
hold on;
) ], l! P9 L- |+ n9 [8 a8 S plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 $ \( g$ \# B9 O" I2 Z7 ~
xlabel(t); % 为X轴加标签
% N! E' I" X3 [) \4 ~! ^ ylabel(moving); % 为Y轴加标签 5 h0 y( ?2 Z% v( k8 K T' j
legend(加噪波形,平滑后波形); 1 a* t' l P6 ~$ c

; C& s# O( C: i) X& l 【方法二】 3 |1 q+ P! ]1 y5 X' X
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 0 r+ ^7 D K1 Y3 V, D* Q/ m
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 @! k, N1 a7 x7 C( y
figure; % 新建一个图形窗口
( m a' q* O/ R6 _ plot(t,y,k ; % 绘制加噪波形图
8 |" }2 f4 x9 t9 j: C hold on;
- Q) ], K) }( |) k9 w8 l% y f8 o/ P plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 9 z4 j" f. T& }+ @9 y1 `
xlabel(t); % 为X轴加标签
' ^- _9 c# G4 {# A- a ylabel(lowess); % 为Y轴加标签
5 e# l) P! E; ]5 Y5 V legend(加噪波形,平滑后波形);
" i2 y( V; T* ~ C& } V 
& y" v$ w( W# u+ r. Y 【方法三】
# I% ^% T0 S8 X* `) S; D( Z 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
9 W* y3 y; {% m) [7 M) V$ P yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
7 @, i! z5 z9 p( r1 `0 E( U figure; % 新建一个图形窗口
0 _2 a9 P9 B* s6 [- _6 Q plot(t,y,k ; % 绘制加噪波形图
' A6 x: z. O3 ?" F hold on;
8 O$ ?" B: {' B+ S* W( ?; q plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 4 n( y4 \ X1 m# P
xlabel(t); % 为X轴加标签 " r( W3 A J! }- L. ^
ylabel(rlowess); % 为Y轴加标签
- H' u! J' M+ F8 g" y0 p4 ^. ]) y legend(加噪波形,平滑后波形);
. d; P2 |6 ^8 O  4 v" n/ [; q; s% Y6 r5 M; X
【方法4】
% h$ `8 A* P9 B* c/ q) p; o. F 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
% z( E1 R# S) M, Y L yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
7 S; I4 R% s% @0 y$ {( @' m figure; % 新建一个图形窗口 1 P. }0 |1 ~' r1 |% |
plot(t,y,k ; % 绘制加噪波形图
5 b v4 t+ D$ H3 D hold on; 0 w1 v+ o6 U' X% B" l! o
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 2 ] J4 H$ {# v3 n
xlabel(t); % 为X轴加标签 6 P# C/ h6 g+ s9 u: t' U U
ylabel(loess); % 为Y轴加标签 : U" E9 O) d. r7 b/ H
legend(加噪波形,平滑后波形);
9 J8 Z6 B$ w7 e" K* s 
+ p, ^* G0 v* J! H: Z+ g& { 【方法五】 2 _, R2 ]" {; Q5 j2 {
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
9 s( q9 ?; Y) h$ o1 |) A yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
. o/ \! o9 D; F! X- ?5 x figure; % 新建一个图形窗口 5 ^/ S) K; E: u* I
plot(t,y,k ; % 绘制加噪波形图 5 E* R& l$ P# o" h8 m
hold on;
+ O( P4 \9 V7 q; f' i plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
( V. R* I& Z/ q3 ?6 ]2 U$ v xlabel(t); % 为X轴加标签 ( e1 i# s1 p3 P/ x* F, d4 G
ylabel(sgolay); % 为Y轴加标签
. t" _5 R: Q A, [/ l legend(加噪波形,平滑后波形);
) x" C4 N+ v9 h3 @0 V  ( j5 H$ B& ~7 w3 ] I0 N
- J, b/ ^+ i: E. l
# H+ Y' x2 c9 p$ p$ s* J2 x" {% O
& [# Y* {# Z- I& ?
7 r7 c. A" j/ P0 q/ \6 o
|