|
: j4 P: f) V! D4 U' t6 }: o 如何使用Matlab对数据进行预处理
/ }' O) H/ p7 y Q& V 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
$ o' B% v3 y& A- ? 1.1 smooth函数 # h" a( @; ?4 F& E5 @8 s( y6 v
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 3 y- i; U2 M# g7 e+ h$ M# P
1)xx = smooth(x)
+ L0 T+ ` D' U" o 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: . `/ f; G3 k2 W* W# I' P
xx(1) = x(1)
* t: w) \( U2 Z xx(2) = (x(1)+x(2)+x(3))/3 ( s$ C$ [9 P* o* P
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
8 t- g1 [+ d+ k2 p- r* V xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
+ K7 @. \( ^# d+ R- g% F$ [ xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 - f" t' b; S0 Y( n+ _7 T
2)xx = smooth(x,span) . @; c, [ A( ?3 X' W6 O
用span参数指定移动平均滤波器的宽度,span为奇数。 : H3 }+ O5 i0 F9 A4 F0 R, s
3)xx = smooth(x,method) + G3 U6 L. V2 L
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: + [, A+ F: z& ?3 V
表1 smooth参数支持的method参数值列表 % r$ I; k- J1 |+ |* ~; E
 1 d. e* A6 o3 N; p2 y
4)xx = smooth(x,span,method)
- F/ r/ }7 I2 s* j: W* V+ }$ y8 t1 W 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
' y0 o) O" p! x( u( ? 5)xx = smooth(x,sgolay, degree)
; Q2 S7 }6 J+ Y6 S. f6 z) E+ i 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
, ? y; |2 }4 `- C" z; ?% { 6)xx = smooth(x, span, sgolay , degree) ; H. f b V$ G% T7 C" M. \$ V5 `5 i
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 " u2 F. m- J) ^; ]7 m5 H
7) xx = smooth(x,y, ..)
1 m$ H; h) V1 u# p# w- @ 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 2 a: y/ t1 n ?+ w7 D* t
【例题1】
2 f( d* S% C0 z0 x) w b 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 9 ^' J6 N# K1 g- P# r
思路:
; X! h% _0 y2 A) x 1. 调用smooth函数进行加噪数据的平滑处理;
. P |& v+ j/ R8 t6 A- e* R 2. 产生加噪正弦波信号;
3 Y3 B( g2 U9 e 3. 绘制加噪波形图。 * Y4 e/ _6 i; F
解题步骤: % h. ^) R: m# {7 e" c' ?2 S: J9 Y
1)构建数据 u: b- h$ F5 f5 `# ~/ B
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 , e. T( `: d" T# {% y' ~$ H
y = 100*sin(t); % 产生正弦波信号
# J& X5 t$ ?3 Q. Q& ` % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
/ w% a* D" f& P o noise = normrnd(0,15,500,1); , i+ Y o( [/ `$ F+ a8 q
y = y + noise; % 将正弦波信号加入噪声信号
( g& b7 ]2 e; }5 O 2)制作基础图 1 Q# ^0 i4 H/ k
figure; % 新建一个图形窗口 , o7 h1 Q8 N! j1 _2 `. _/ T
plot(t,y); % 绘制加噪波形图 & l% O9 e7 b e
xlabel(t); % 为X轴加标签 " v I( ]) q: |
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 3 N3 V5 {) P3 ?% [7 y( {

7 L7 f7 C' Z9 t5 I" S! g 3)制作平滑波形图
7 t5 {& c- M0 Z 【方法一】 / E" _4 [' }6 ~. @! L
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 2 \! I6 c$ T5 s( z5 Q* r0 |4 M
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 " n* [4 K, ]6 t
figure; % 新建一个图形窗口
! Z, G1 z; B$ c8 x& r plot(t,y,k ; % 绘制加噪波形图
F, A' J5 @) i- y hold on;
- [# a! J0 d* J plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 - D) _9 O1 G" A1 E9 j
xlabel(t); % 为X轴加标签
; @' k1 H: Q$ [+ L4 Q ylabel(moving); % 为Y轴加标签
9 Q8 W3 A! m- G8 Y0 L) I legend(加噪波形,平滑后波形);
# \4 ?3 w4 q8 Q. W( k7 k/ u  + Q7 q' V7 R# |& p+ h
【方法二】
4 j5 `* n2 Q( f K8 L% \9 g) M 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
% w* i# \4 f/ i% Q+ U4 ?8 L Z8 T yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
3 c8 R' w$ z0 A. b e6 D figure; % 新建一个图形窗口
$ T9 R5 o) ?( F: ] plot(t,y,k ; % 绘制加噪波形图 : D4 L- R& z5 Q7 r* C2 x
hold on; 2 D! r8 t7 K; v. M
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
j* K/ R* K8 L0 x xlabel(t); % 为X轴加标签 $ d' _: m5 T2 b: G" t% T
ylabel(lowess); % 为Y轴加标签 - d- W7 J2 ?: B5 n
legend(加噪波形,平滑后波形);
8 S1 k q' I8 W% h+ k! E6 A$ M  * \2 d" e7 ]( L% H) w
【方法三】
0 v, u" [* t" m' P. k1 q2 J t" @ 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 0 L2 R8 h4 p7 F; n
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ) q3 s& _$ F9 o6 [) L
figure; % 新建一个图形窗口
( \( K/ P! h, B8 B2 {& m plot(t,y,k ; % 绘制加噪波形图
A4 u. ?1 |% q5 ]9 w( U hold on; / A1 W2 F, ~* M, K. {
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
, n# ^3 N) k( [ N! P( w$ E xlabel(t); % 为X轴加标签
+ `3 p8 P1 ^: Z1 e( W ylabel(rlowess); % 为Y轴加标签 H0 W% H$ r% Y$ J: Y
legend(加噪波形,平滑后波形); ; K1 f( {; o9 e
 1 |" S( z1 J+ ^, C/ p1 o$ S+ T
【方法4】 . Q: `% d( G* ]
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 / [+ r0 k% H: N9 x5 U1 ^
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 # ~' o& w' Y+ l/ p5 V% X! w2 h
figure; % 新建一个图形窗口
& `/ s0 k& R& ~7 { plot(t,y,k ; % 绘制加噪波形图
( \- k2 H# i6 m- n' \ hold on; , w6 }% T7 w/ V
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
7 a3 O6 u- a7 l xlabel(t); % 为X轴加标签
6 r: p8 F6 d2 D" i* y# L! F% m0 | ylabel(loess); % 为Y轴加标签 : |, T( y2 ^; g
legend(加噪波形,平滑后波形); * w, W# W; l4 B& J& G
 ! @' B, i2 K, P2 K' r3 r% H& Z
【方法五】 . m2 H+ C( s7 W) o
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 3 d+ [4 I# A, ^) }
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 % v2 O2 v) _5 Y1 D
figure; % 新建一个图形窗口 - v; @) V9 t' F. \& f5 V
plot(t,y,k ; % 绘制加噪波形图 ; E! a" P/ v& k9 W& C/ a, R5 [
hold on; 6 S6 `4 C) `9 ]
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
# Y0 Q3 i7 Z$ }. _ xlabel(t); % 为X轴加标签
& G( ?2 r- R m) ?" V6 g. u; y7 A ylabel(sgolay); % 为Y轴加标签
- x% c+ Z1 O& j legend(加噪波形,平滑后波形);
0 T% {' ]7 m4 ~4 n* O 
7 s% W7 Y: }/ }" P$ p; v0 k0 _( ~9 a8 w7 H+ n% o: w+ b
6 Y$ h, B/ M5 k( E: T. y; S2 e
- n( w; H+ y. P1 j- C0 l
. F# m& ^) U! B; \8 f8 | |