|
T2 \5 M2 U/ ]& ~( M 如何使用Matlab对数据进行预处理 / f3 S; d: Z2 {4 u( w* O7 [7 n5 R
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ) C6 |' { T! d, o3 E2 T+ A) a: g
1.1 smooth函数
9 S; e! _5 h% o0 ^" d" z8 ^+ F Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 3 G/ |8 ~! \, i3 ~ n/ G
1)xx = smooth(x) " v0 V& X% M& A( t( L7 N
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: : i# Y! J0 p8 n6 B1 R. d
xx(1) = x(1)
l# y. h w( J6 O. ? xx(2) = (x(1)+x(2)+x(3))/3
0 ^0 F# }4 p* Z, |) r0 B5 v1 ^ xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 ( W& P. Z. ?6 r: _( J" B" D0 ~
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 . U! s3 `, r# b6 b
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 1 T7 @6 N0 z; ~/ m% s
2)xx = smooth(x,span) 8 }8 U# c' P. G& B" Q/ H
用span参数指定移动平均滤波器的宽度,span为奇数。
1 w$ h) P& w7 x' F2 B8 q _ 3)xx = smooth(x,method) $ X: F. d6 r1 z& o
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
$ R& }+ @" l I( z5 w( _- J 表1 smooth参数支持的method参数值列表
) J. [( q7 Q; O, d. C: y5 G* ~/ O  w9 L+ q. I. [3 w, f
4)xx = smooth(x,span,method) 7 _8 D0 `' g4 i; ^
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
+ E% s# A$ T# a3 a$ Y* V 5)xx = smooth(x,sgolay, degree) ) f+ V; y% d! j5 M! M0 o8 ]
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 * ^2 s1 o7 i% ^3 H) l4 u: E/ a
6)xx = smooth(x, span, sgolay , degree)
1 [3 Z: |3 ]# J( l2 D2 M- @ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
* r4 f9 A4 b; t 7) xx = smooth(x,y, ..)
$ P) w, `0 g {% _+ T+ h 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
0 H; Q3 N1 [* F. V 【例题1】 + i# X8 @9 Y' p% P+ |8 r: R
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
! n2 `: o6 p8 m8 H3 F1 s; n4 k1 e 思路: 4 B' Z' ]$ C& N7 @, G, \6 S
1. 调用smooth函数进行加噪数据的平滑处理;
: ^) n: j; _2 @0 o6 R9 c 2. 产生加噪正弦波信号;
$ o' b- x {5 E, M# H 3. 绘制加噪波形图。
5 H, m0 S l- ^2 o0 m 解题步骤:
: ]8 B5 }. ]1 r8 G$ z 1)构建数据 1 B; ^5 L7 N# h( v
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
6 R# E& v. \0 P) x5 x9 P& p y = 100*sin(t); % 产生正弦波信号
! k9 N* W' w( X4 `: _' _ % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
* G' y, t+ b( I& H- V5 Q+ `. U noise = normrnd(0,15,500,1); * G& n. l3 b/ e& U R
y = y + noise; % 将正弦波信号加入噪声信号
8 t' E4 V. e: a$ u: N5 d" X1 t 2)制作基础图
6 E8 l' V4 ?% B/ b3 K4 L figure; % 新建一个图形窗口 2 \; Q9 j/ U7 x1 I/ l% ~* d3 o% d
plot(t,y); % 绘制加噪波形图
+ t& Z$ E$ W. z( R8 q xlabel(t); % 为X轴加标签
2 h5 C1 K; H& Z; b7 Y ylabel(y = sin(t) + 噪声); % 为Y轴加标签
" E* J! r$ c0 E8 _ b; F& t& h  ' b: E6 v% U) k- O- {" S2 A
3)制作平滑波形图 " L+ K; A9 t! J) A- ?
【方法一】
$ L& p7 w9 C% M; X0 U9 t+ K 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 8 k% b/ Q; T* z
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
6 }- t% }8 e- Y, R1 z% M figure; % 新建一个图形窗口
/ q1 `7 P7 H5 t `. | plot(t,y,k ; % 绘制加噪波形图 ' i- \* l' ~6 |, d9 N
hold on; . u( e5 j" A1 I+ u
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 - i2 E# y7 Q* ^- m8 X5 @
xlabel(t); % 为X轴加标签 * z8 s0 J5 m$ X0 C6 @: ^: r
ylabel(moving); % 为Y轴加标签 & ^0 c4 u0 G4 _ \# l6 \
legend(加噪波形,平滑后波形); 4 c6 M7 {0 ]8 J

" l* k i8 a) Z& i 【方法二】
3 E3 ~8 h# a4 Q2 @& S3 A% N( r 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
. |1 H/ K- | Q7 M4 T yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
$ g0 U; H5 D y' n& a figure; % 新建一个图形窗口
! I7 F9 b: c6 X plot(t,y,k ; % 绘制加噪波形图 , ~5 E# @& a- C( ~. A) H
hold on; / |: L: N( _& t+ P
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 / \# s2 Q% c- I
xlabel(t); % 为X轴加标签 8 d+ h& f( c, f& q3 f2 I/ O
ylabel(lowess); % 为Y轴加标签
l9 R" q/ D+ L+ m$ l! H legend(加噪波形,平滑后波形); 3 Z9 v2 q- \. n$ l0 b& m% n! ^1 v

5 q e% A9 _, R; Q+ K! w 【方法三】 / } S2 l( k/ [$ J9 O
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 $ { S1 b. {2 x, ?" j5 K1 |
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 . _' y% v# K6 n% ` s
figure; % 新建一个图形窗口
" j8 R1 h. X7 n# R" r- S plot(t,y,k ; % 绘制加噪波形图 3 Z4 t' n+ Z$ V+ a: E) c
hold on;
( g. ~9 v Q6 a5 { plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 " l- i8 v0 z9 _7 F* u$ E
xlabel(t); % 为X轴加标签 % X. G3 X% ?0 n! X9 g' ?
ylabel(rlowess); % 为Y轴加标签
y' S- c, V z3 ]* y) C5 c legend(加噪波形,平滑后波形);
! x: u" O0 v V6 @7 v3 y# R( p9 s  0 }' z! q7 T6 U9 g) o9 C
【方法4】
W8 K0 J; J+ y* R7 d3 P# l j |) c 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
) Z) |# R, H3 v9 B yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 6 \* ?7 M: |* |9 S4 L. u1 a2 Z. A' }
figure; % 新建一个图形窗口 _; j2 c2 S1 r4 j
plot(t,y,k ; % 绘制加噪波形图 / ^5 E2 L: Y. g4 N1 i
hold on;
2 ]) W* }! Q# ]6 N1 O' m plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 # e" l5 ]# C: _
xlabel(t); % 为X轴加标签
: W0 O3 _1 |6 k ylabel(loess); % 为Y轴加标签
) \) W8 k: y+ J& J; N, u" n- i legend(加噪波形,平滑后波形); ; `: ?& J' z/ y
 $ N; O4 c5 Q! K: t0 f
【方法五】 9 [- x9 S: J5 \$ v) u' }
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 ( V1 n' n u6 c: H0 E' Y
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
+ @* \5 \1 y$ `1 y figure; % 新建一个图形窗口
- |9 e" z9 U/ P: r6 f plot(t,y,k ; % 绘制加噪波形图
9 a& a, v0 r; r hold on; & c2 V/ N5 x ?- F, S
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 4 ^# L+ {4 i0 F' d* Y# ~
xlabel(t); % 为X轴加标签 # { ~( b% x; r7 w: h }* k" P: o
ylabel(sgolay); % 为Y轴加标签
) A4 r0 Z2 ^; d* ? legend(加噪波形,平滑后波形); - u* Y* w! e: F9 m( |

]- k& c) `% U @4 L) N
- h' a& V, k3 g( Q
' E* N( P# r1 T3 R
4 {; E2 z* D2 x: t3 N2 W
/ \6 x8 B, V# s& J$ A7 f) `" R |