/ T( v( }' m3 U+ ]6 J
如何使用Matlab对数据进行预处理
, @9 t( Z$ d) K1 ~, M: ] 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 5 D! F+ a7 Z& e
1.1 smooth函数 ' }+ A$ D/ q/ K& E0 q. i
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: " t; H" h# [, c5 H- {
1)xx = smooth(x) * H( Z* f- E) u" J9 G1 |2 k& j: `
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: . z) J' F, y* o+ J- }, b
xx(1) = x(1)
% q9 a- F7 n F! [9 L7 e8 Q xx(2) = (x(1)+x(2)+x(3))/3 $ {- B& r7 Z0 M( v& h
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
" d4 z& r4 S8 ^& e( U/ S4 X- M xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 : Q, F/ t) y$ R1 c m& i
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
}; y3 j* B# @: j 2)xx = smooth(x,span) + e4 G9 z% p* B- n5 h
用span参数指定移动平均滤波器的宽度,span为奇数。
+ m' G& ?) S+ o; B3 |9 m6 B; Z$ P* k$ Y 3)xx = smooth(x,method)
+ L- M) F/ u/ D4 [( k8 X0 l: t 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
! G1 W2 a) Y) A; |4 o6 Y9 Z: b- ?& E2 K 表1 smooth参数支持的method参数值列表 x7 b& D; b1 e0 r2 I0 V
- I v! s1 I* P" H: s; O+ j
4)xx = smooth(x,span,method) 8 N( a: h, Z4 D* ~ g: ^
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 & {0 B4 B# h! [ ^/ A
5)xx = smooth(x,sgolay, degree)
3 d. v" K1 m( v7 @3 K, C ?8 N 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
0 H, I$ B! Z$ X+ t& j 6)xx = smooth(x, span, sgolay , degree) ( d8 n$ Z1 B9 k% f
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 1 ^# }* P- _( H9 ~
7) xx = smooth(x,y, ..)
0 P% A% b$ Q; \4 @' K6 v! \$ D 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 9 e4 p; w, N B& f$ _1 a D
【例题1】
& I; d$ v) C2 J5 a- } 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
: g) g/ M! |; H- Y 思路: . Y/ Z1 O9 B4 h. Q
1. 调用smooth函数进行加噪数据的平滑处理;
( y8 G: }0 V* P" n, o 2. 产生加噪正弦波信号;
, Q# Y& l8 H0 d4 m; h. r 3. 绘制加噪波形图。 5 J4 l& @9 }3 L# c0 w
解题步骤: % T2 |0 |( a* K8 |3 f+ u, e; ^
1)构建数据 7 S- Q/ |" a" Q7 ~. B7 a9 \2 L
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
; @* W0 T: Y4 Z4 ]2 W Y/ s- P; O y = 100*sin(t); % 产生正弦波信号 : W( u0 M/ C8 g( z6 m
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
7 L9 x( f) ^( r; y5 f! B' o noise = normrnd(0,15,500,1); : C" o! ^8 r0 f
y = y + noise; % 将正弦波信号加入噪声信号
W0 F8 E" t5 s 2)制作基础图 * @( I w# G1 ^9 r) b" k7 w
figure; % 新建一个图形窗口 & \+ S5 K. v7 j* O
plot(t,y); % 绘制加噪波形图
5 {7 x9 Q! K. _6 p/ S xlabel(t); % 为X轴加标签
$ i9 U# }8 q8 r3 } ylabel(y = sin(t) + 噪声); % 为Y轴加标签 ! B7 O' L' t* o3 K* {! } l3 x9 z
' G0 G" _6 W/ M- k& L& k6 i& { 3)制作平滑波形图 + T8 L& t! j4 Z, h6 L1 L8 S! N
【方法一】 5 P- s# I5 Z' g6 l- |
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 , R' o* i9 l: {& z9 S
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 % V: w5 _' R. Z2 X) F% Y8 O
figure; % 新建一个图形窗口 $ p% o8 _; C% G/ m
plot(t,y,k; % 绘制加噪波形图 , v0 H4 C7 E1 q: J
hold on;
' R" n) v$ ~# |! t- ~2 | E9 r1 _! b plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
+ @' k% \ f A3 p5 M v0 X F xlabel(t); % 为X轴加标签
6 |9 y( e+ w; Z; B! c5 G3 f ylabel(moving); % 为Y轴加标签
. o, ~4 P. ?: J1 C* C& c( _9 h legend(加噪波形,平滑后波形); 3 ~. N( Y/ b& j$ E
% H2 q- r1 d [; ]
【方法二】 / k- t) h; |) Z& e
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 C9 x& g! d& B
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
9 y# x3 }7 S3 n, s! O9 Y4 ?' C figure; % 新建一个图形窗口
: t7 M7 X* E# x8 T8 ? plot(t,y,k; % 绘制加噪波形图
) O' C8 A: T! Y8 H, E( n* z2 Y% z) n hold on; ( K7 \& U3 d2 L) z+ n& l1 F
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 ! A# D2 R( ?" y0 D) |, g1 I
xlabel(t); % 为X轴加标签
" l' X: K1 ?$ ]/ x ylabel(lowess); % 为Y轴加标签
' |" @& Z; L+ I) S1 M1 E, E legend(加噪波形,平滑后波形); 9 f- s! f$ a' s5 J" m
3 h% }' Y: w- L' }1 l: P 【方法三】 # c h' d2 V" E8 N* @/ [/ U2 V) Q) x
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
! k3 D4 d. R! L8 _! Z A5 `3 W7 q yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 6 e \( G) h% ]8 C& d! I
figure; % 新建一个图形窗口 3 t+ d6 u% y& x; U W& t. N
plot(t,y,k; % 绘制加噪波形图 ) r$ o& O: Q$ J/ R2 _' m2 ]
hold on; " @0 v2 Q' |8 s" y- q
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 & i+ I5 v* R6 P& t7 H3 ~" X1 o
xlabel(t); % 为X轴加标签 % B" _2 Q8 @7 a- a
ylabel(rlowess); % 为Y轴加标签 - g6 l) i: z) v g* @9 S6 v
legend(加噪波形,平滑后波形); ) o5 a7 T# [7 x4 \5 y: O. b
" L7 u' b! q" S6 f- t7 f4 P# L n 【方法4】
" }5 v! {8 I7 [8 p! k7 V9 p 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 0 Z1 c" R7 d2 x& \$ ]5 m
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 4 o/ G8 O: t* q" I0 a* e/ Q
figure; % 新建一个图形窗口 # N4 M/ i- G7 P, Q
plot(t,y,k; % 绘制加噪波形图
& M8 Z8 \; V* E$ Z5 V/ a$ z% c0 C hold on; % K4 B$ M8 ]. O/ H) e4 v2 w
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 3 q6 ^' C2 K; ^% X
xlabel(t); % 为X轴加标签 % K K! I! N" y! a
ylabel(loess); % 为Y轴加标签 1 l" y' G7 m. k
legend(加噪波形,平滑后波形);
$ R" @' i8 W- K; r
# B# o7 _# Z& H- b 【方法五】 $ j' j- M& y1 Y& b" ?& S
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
; R2 ?- Y3 J1 k( [7 `" L8 o8 O. m yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 # Q% K5 _8 q& [; z$ M
figure; % 新建一个图形窗口
4 _6 c$ P; p; k plot(t,y,k; % 绘制加噪波形图 ' ? ~# L0 O' G& d
hold on;
5 v5 A" U$ a. H! o" } plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
# I. \% s8 o# V) P xlabel(t); % 为X轴加标签
: B, ~8 r9 o; g+ s1 j' R! F ylabel(sgolay); % 为Y轴加标签 6 N1 ?% r c+ R6 M$ d
legend(加噪波形,平滑后波形);
. W, e. l, u6 @: S; p5 A 8 S3 o6 _9 w' P+ `+ l! k
3 q. I/ K5 ] k! i& x
2 R0 R. [ H* a) E
( P ^- q a: a$ }
1 j# D3 y0 Y2 Q4 S |