|
- \6 ]$ ^1 O, [5 S
如何使用Matlab对数据进行预处理
& Y1 Z& k5 D9 A! y# M" Q 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ) ?7 }, F2 W V* `7 q* b
1.1 smooth函数 $ K# I, h+ R0 X9 [' \' d/ m/ i& U+ i7 w4 i
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 3 S. d. u+ n h$ p1 H
1)xx = smooth(x)
( m- j0 K% t; O: `# i( |5 i 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
& t# [3 H: w+ H ?! R" N xx(1) = x(1)
* T% u1 T) W h5 o0 a$ x5 { xx(2) = (x(1)+x(2)+x(3))/3
# Y6 N- C) h! q& I7 ^' G+ s5 } xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 , Q' Y3 c& ~& s
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
# a* |; m- R5 u0 j3 ^2 t xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ) c$ L' b6 v+ ^. H8 P6 L% _
2)xx = smooth(x,span) 8 z0 L( F. [" { m! t
用span参数指定移动平均滤波器的宽度,span为奇数。 8 |" S, o! b8 _' ], D# X2 |- n5 U+ P7 S
3)xx = smooth(x,method) ' C7 \. c% ]0 \# f! c
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: * Z; p. k% I5 J" E$ |0 a
表1 smooth参数支持的method参数值列表 % \" _- Y8 F) Y# A

$ d% O" e+ |8 @; q# E- t* N 4)xx = smooth(x,span,method)
8 {$ m6 Q7 H2 m 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 & s- `2 C; J4 N( }
5)xx = smooth(x,sgolay, degree) 4 ]. U0 B3 |7 x2 ?, Z
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
- ]8 f- g* N% M# P9 l) |/ m$ O7 L 6)xx = smooth(x, span, sgolay , degree)
& J) ]. Y6 s) W2 A/ i R' i+ w$ O 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
. y3 S3 H5 n( W- q+ a; r4 _/ u 7) xx = smooth(x,y, ..) * b7 N, l( G0 a9 U2 y( [* T- P
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 ! s' T* X6 J ` ]# e, i+ E; A
【例题1】
8 a& B7 ?% j% M" n$ d 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 7 y) X, _+ I$ n
思路:
' |; U& X6 i2 S8 y0 Q7 P% [0 H. b 1. 调用smooth函数进行加噪数据的平滑处理;
- u. S7 ?8 F- w) c) w 2. 产生加噪正弦波信号; : L7 k9 \- X9 J. {$ T& N
3. 绘制加噪波形图。 6 t7 n2 i5 {1 ?& D+ [5 f w
解题步骤: ' ^& |+ \1 t T9 D
1)构建数据 ( p( ?0 A$ }5 e
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
" Y' p/ A4 q# F( [) a y = 100*sin(t); % 产生正弦波信号
% _$ w2 a3 c" F2 G6 I; t2 ^ % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
+ A4 ^8 S# I' x, Z* L% @ noise = normrnd(0,15,500,1); 9 E6 m. }; Z6 G
y = y + noise; % 将正弦波信号加入噪声信号
( `3 x" B7 ^& c: y; r5 N5 ? j 2)制作基础图
7 e' p- j$ M, A- ~ figure; % 新建一个图形窗口 0 E9 c8 p& p6 W& y0 M% D! S
plot(t,y); % 绘制加噪波形图 3 n: z6 d" j, e
xlabel(t); % 为X轴加标签 ( B9 O' x. T" t. y8 v
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
9 A: R/ |% d$ I9 E! b- E  2 \; d7 U: u) D* A# N+ M- q" G* a# v
3)制作平滑波形图 ( P; }9 d; Y) M$ Z! S ?
【方法一】
2 P8 V5 h0 s E/ K 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
/ N. t) Y$ c4 ^0 \7 }1 ? yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
A% ^, `$ f4 e figure; % 新建一个图形窗口 - H K: D' Y/ H. x5 N& k
plot(t,y,k ; % 绘制加噪波形图
- O3 K9 k1 I, ?9 ~/ C hold on;
, m# ~ P* [8 Y plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
& R0 \6 C! J' D xlabel(t); % 为X轴加标签 $ G. b9 y% e7 u) ]2 ~( U
ylabel(moving); % 为Y轴加标签 9 r* H8 V) U. P
legend(加噪波形,平滑后波形); # i9 v0 }) z$ z4 H2 w% ?. l" q

' [" c( G0 Q8 S+ K/ Q 【方法二】 / r6 E: l. I5 s4 D- N. i4 \5 W
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 + X2 v8 c4 y4 B2 E# c
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
/ {0 w" g, s' r1 l figure; % 新建一个图形窗口
7 D) u& w% J& f! H5 [8 P$ F0 |9 ^8 ] plot(t,y,k ; % 绘制加噪波形图 ( s# E4 f. i4 H: ^" K3 L5 p
hold on; ! D" q& [1 r0 `3 K- {% L6 {& N
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 , w- M% R* L1 Z& u; w* c$ ^1 \# F
xlabel(t); % 为X轴加标签
5 {+ u& Q; z! ]; J5 b6 W3 O( z ylabel(lowess); % 为Y轴加标签
$ O$ p9 p) d7 t$ M legend(加噪波形,平滑后波形);
S |' m% Y, v) w3 H4 d  4 o9 J/ h& d$ C
【方法三】
3 x: ^: S# ~: Z 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 " N6 R5 }( J L u/ F6 A
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
7 X2 M& U3 @2 @7 g U7 l figure; % 新建一个图形窗口
- t$ H: E5 ]( o# S: X+ _4 C plot(t,y,k ; % 绘制加噪波形图 , ]2 B8 |0 U; }' h9 H" L w7 x
hold on;
: ^3 _( c6 G! T8 {1 W( Z! { plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
% |/ G% {/ _3 p' U( P xlabel(t); % 为X轴加标签
& ?0 `$ s9 G0 P: d ylabel(rlowess); % 为Y轴加标签
o/ ]1 _4 s9 W( J legend(加噪波形,平滑后波形);
1 j0 b: p, x; z' I9 P7 }4 T6 i% O 
0 U7 \5 p, Z1 q5 C. U 【方法4】 ) @% |* h* ^: o" c4 @
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 0 t' G" ~8 i: C9 w, T3 V
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
' O- b4 K6 r* T$ G$ s5 X4 R+ C figure; % 新建一个图形窗口
& i2 \ B5 L& c. R; B plot(t,y,k ; % 绘制加噪波形图
5 m0 }. f+ M8 m @! v hold on; * x4 I: B6 E# u! R& Z6 T& \$ A
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
! G N1 e' @ k xlabel(t); % 为X轴加标签 a& a9 [* ?/ ], R R$ }9 \
ylabel(loess); % 为Y轴加标签 ; |* q( p( s8 N Q. H$ d9 H
legend(加噪波形,平滑后波形);
, r; f9 \+ C) p+ h, B( t 
5 t6 V1 i9 j3 ?: ~ 【方法五】
, W0 O1 ?1 N' K, S7 [! v. q9 i) u 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 1 u' ^- C, m3 s+ Y
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 # F+ L: F' R$ l, L' x" R
figure; % 新建一个图形窗口 }, m+ f# \* R8 m- V6 f
plot(t,y,k ; % 绘制加噪波形图 / V1 q( x' C: H
hold on; ! j* {3 s x; ?; v' p
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 0 m: S" ]; [6 C; v V" M7 z9 |
xlabel(t); % 为X轴加标签
9 f! h; G1 H+ i! e6 a% ~ ylabel(sgolay); % 为Y轴加标签 1 f Q1 M0 G* j c% |& ^
legend(加噪波形,平滑后波形);
% R+ j2 x$ T* x 
* j6 w& m X/ F( G" I. M9 W& ~' ?5 \% A6 t7 @0 D
" z& b" |# b. w' c; B, l4 {0 _+ x8 d& b" z% I0 B ~
' ^) a: [% ?! E5 W7 }
|