|
& M! B0 O, e* t. d. Y/ [. d
如何使用Matlab对数据进行预处理
+ B2 J% E! b: A; U 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
" d) H& g: I$ { 1.1 smooth函数 7 H u9 X: ]' I1 V* P' Q
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
+ `) r, ~; k1 Z 1)xx = smooth(x) ) r/ y9 o# h7 c% r \, S
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
% h8 X: z9 m+ B3 q) v2 z xx(1) = x(1) : n$ D v# ~2 g( F6 U( H/ k8 M
xx(2) = (x(1)+x(2)+x(3))/3
$ Z! P0 i0 ?' | xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 ; ^9 T) U4 n* N) g z) `
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
; t+ O9 ?) q; @# X3 J; X' I) a; w xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
. Z: g1 w( p) K1 P2 k 2)xx = smooth(x,span)
, [/ I( D6 w! F2 R/ d 用span参数指定移动平均滤波器的宽度,span为奇数。
6 n& W8 R2 l- q9 K. [ 3)xx = smooth(x,method)
- t6 W; V( }9 K% G2 b 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
) j G# ?0 S; ?# _ 表1 smooth参数支持的method参数值列表
5 ]! t$ h, V' ]& f 
, d0 }! E/ @7 s- u 4)xx = smooth(x,span,method) 9 D3 ^" i/ R# w, V4 z
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
$ k8 B* q8 W5 K/ K0 I 5)xx = smooth(x,sgolay, degree) # A% l, r Q( b0 S
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
1 w- j. M, M/ o; d 6)xx = smooth(x, span, sgolay , degree)
% s4 G6 A8 i1 v& Z2 p2 s0 A 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 4 S" v8 J2 d3 l
7) xx = smooth(x,y, ..) 0 Q5 j' \0 J6 J6 m; u0 o5 a: r
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 ) o1 F+ _2 ]* c M
【例题1】 0 V( T6 P/ c+ ^7 ]
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 ( V% U4 `" G. g$ j8 |
思路: k' P0 d j5 n+ \" n
1. 调用smooth函数进行加噪数据的平滑处理;
6 p% q3 {, L/ l+ V 2. 产生加噪正弦波信号; 6 J+ _* z" \5 `; m- Q
3. 绘制加噪波形图。
% J4 @7 [+ S3 d. Q: g" q7 W! d 解题步骤: & `/ a$ _# B& D2 t5 o" e
1)构建数据 ) V! S9 G- V: X$ D% ^
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
' U) L) e1 Q0 Y: w4 ^" B# ^ y = 100*sin(t); % 产生正弦波信号 % k1 K5 x- l, \( H
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ! {8 ], t& ~+ D+ T' G! T
noise = normrnd(0,15,500,1); 6 o6 I3 s t& A# A- y7 c: ]' ^8 f" C
y = y + noise; % 将正弦波信号加入噪声信号 2 K7 q0 K/ T+ R1 G7 _
2)制作基础图
5 O% o3 f$ v5 Z# Z% b figure; % 新建一个图形窗口
) Y: v% k8 \! c4 y4 q' Y plot(t,y); % 绘制加噪波形图 % i1 O6 c, x6 k( w/ ~
xlabel(t); % 为X轴加标签
1 L, s' B- |) P, _ ylabel(y = sin(t) + 噪声); % 为Y轴加标签
, N6 Z4 n7 ?6 Z2 U2 S  ! y- O, q* a$ v" B7 S
3)制作平滑波形图
8 i, {# P$ {8 U8 v2 @ 【方法一】
H' p& O7 t4 c y 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 5 |/ z8 {' A3 e M u: l
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
8 X# p9 f6 O$ k figure; % 新建一个图形窗口 " ?) [2 c8 m% q/ g6 ~
plot(t,y,k ; % 绘制加噪波形图
( F6 e+ j6 Q' L% C6 F hold on;
- e( I" i. N5 }. ^* ~* F5 t2 ]- z$ [7 a plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
i1 B! n6 d& L! H xlabel(t); % 为X轴加标签
' E& C# J. ]+ b8 F6 `% Q, t ylabel(moving); % 为Y轴加标签
+ M- v2 K# a8 [9 f7 p) A+ @6 ^; H: n legend(加噪波形,平滑后波形);
, K& A5 t$ }! J 
- l9 c; V5 K, o8 ^) k/ v H$ a9 I 【方法二】 + K! J v0 A( K- W- @6 `
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 + Y! W+ k( n* c
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
8 m+ o3 X7 d$ h6 d) Z8 m figure; % 新建一个图形窗口
7 N7 I& n. D% ?, P$ d. b plot(t,y,k ; % 绘制加噪波形图 o! a" }5 I; ?+ F
hold on; 0 {" l8 S& `) n4 v% {# B% Y$ r; T
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
5 L/ ]: c- j c( U) | xlabel(t); % 为X轴加标签 e7 u9 B, R" K# l7 z
ylabel(lowess); % 为Y轴加标签 $ G# q. q0 i: B( Z2 O( m
legend(加噪波形,平滑后波形);
# k/ p7 M) Z# ?. j6 _* x 
) ]8 M) b8 a' z0 o 【方法三】 / e! V' T6 n1 P* N# e+ `
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
, ?" r/ v( ^! X# a' r( ]# g yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
& O2 p: Q) H1 Q. l figure; % 新建一个图形窗口
# F0 ?5 y, Z& R* W# g6 b plot(t,y,k ; % 绘制加噪波形图 3 M; c/ E M+ M1 U1 _' C$ e) E0 |
hold on;
# J- M! m* X$ @. C$ y) j5 e; ]& H plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
1 d( Q9 J( `+ U" b+ e" H! V) L xlabel(t); % 为X轴加标签
6 ?( _9 z) P1 l ylabel(rlowess); % 为Y轴加标签 - r% |7 K; H9 ]' m2 n1 i- w$ k B- O
legend(加噪波形,平滑后波形); 6 L3 `6 Q' n; I: {0 B V" {" i

; j2 r6 y! d9 ?7 `) b: U 【方法4】
/ d8 O/ g/ G( b 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 / a+ g4 H, e* s- p+ l. @
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 8 e& ^/ G2 e1 i( T3 A; X
figure; % 新建一个图形窗口 4 g8 _; j2 |% x L# v6 o
plot(t,y,k ; % 绘制加噪波形图 , K, g- [( C& I& H4 @, P5 x
hold on; # n) m# E; }( C. t( o
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
0 ~: B1 G4 _6 Q! k+ j xlabel(t); % 为X轴加标签 5 j5 Q3 ~3 @4 O- m7 v% f" L- m
ylabel(loess); % 为Y轴加标签 2 x4 m; j: j& z4 [0 K. D
legend(加噪波形,平滑后波形);
6 R) G; |8 |) z- y2 j2 { A8 M. t  & t! ~6 v( ?7 V W
【方法五】
; q" L2 s8 r0 o$ c- T, H 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
# t5 l% m0 V. r B yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
5 N5 l$ [& X7 Z* Y. _8 T figure; % 新建一个图形窗口 2 Z0 J7 Y x% a! s, y0 N
plot(t,y,k ; % 绘制加噪波形图 0 T8 F+ I( p5 T- k: b% V
hold on; 5 o' ?' V* ]& Y: d5 p% O- d
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
0 k1 x6 a! J1 O1 I9 B: h/ I xlabel(t); % 为X轴加标签
8 H, b! q1 Z3 c2 L& K6 a( c ylabel(sgolay); % 为Y轴加标签
) a( C5 a6 \3 G; j legend(加噪波形,平滑后波形);
$ B( M3 n9 {5 [+ ^8 J  # q( h4 \4 E* X2 z3 h! O3 e
$ \" {3 [% E. x1 i& x( \; S$ @' k* p( ^; F$ s! Y( W! O
( y/ o, ~7 k5 Y/ V& o
2 S* ?( N( q4 {% R0 U |