|
+ T; E8 C0 Q2 w( Z# q7 z 如何使用Matlab对数据进行预处理
; g( J! X1 j5 I+ V- v 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
v# c; i6 f( v) z% @' U 1.1 smooth函数
6 ?0 }# k' V# C9 Z Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: & H0 Q' H, k! Y/ W4 t2 W
1)xx = smooth(x)
- ^' O- d! r9 Z- S8 i 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
$ O( O& R4 B8 ]1 s( r xx(1) = x(1) 0 ~4 E2 j- r2 L; K2 m
xx(2) = (x(1)+x(2)+x(3))/3 / I; \* d8 F& N7 D U
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 " E8 N3 Z1 l/ d3 T, Z+ p) F
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 $ z$ q$ N0 i' s
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 9 ]. Z2 |/ S0 [1 S1 | V8 U
2)xx = smooth(x,span) ( T9 [1 F8 s- ?2 Q% ?3 x8 M9 s
用span参数指定移动平均滤波器的宽度,span为奇数。
7 r9 J. R6 W# i& U 3)xx = smooth(x,method) 6 c5 z o1 ~# B+ z. T0 I
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: + Y) {5 N- N& v# ?0 s
表1 smooth参数支持的method参数值列表
7 t% W% x. T2 i( C* w- P; z  ' s% X# K5 [3 ]0 X
4)xx = smooth(x,span,method) % j( [! ~& {7 H( h( C: [
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
1 O5 H5 c7 X! o+ x( d9 _2 X 5)xx = smooth(x,sgolay, degree) 8 k' \3 |7 c8 v& k
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 $ p% H! X0 y& @
6)xx = smooth(x, span, sgolay , degree) $ F$ z! h. q: u+ M
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 " w: b" @8 H# @4 F3 q' d
7) xx = smooth(x,y, ..) - n4 K) K7 z L8 ]6 l# m- ^6 y
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 7 }4 H0 Z9 w* y! z C
【例题1】
9 m& c- }* z% _4 t! z, U3 L* ]* H h9 p 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 3 g0 u' s- D: H1 f' i
思路:
! o ~# F6 V( I+ v 1. 调用smooth函数进行加噪数据的平滑处理; # x: _; h) L6 B! }" J
2. 产生加噪正弦波信号;
/ y) c* o3 ^) Z2 Q( ~" d { 3. 绘制加噪波形图。
) P% J5 U. y) U, i `+ m2 | 解题步骤:
8 U3 j3 G! f: c( S6 J$ u 1)构建数据 # J* S; v1 k6 ]
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 C! j1 T+ k+ D- M; a
y = 100*sin(t); % 产生正弦波信号
u6 `6 \( u. L$ y$ n % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
" K7 v X) W% A+ \7 f; s noise = normrnd(0,15,500,1); 8 W) X/ Z) G h5 s2 x0 a, f
y = y + noise; % 将正弦波信号加入噪声信号
8 K- A- Y% l) e3 d 2)制作基础图
0 w1 E [* h3 P& U+ L2 ^# d figure; % 新建一个图形窗口
- w$ w: F; o4 K; r# }+ _7 S% x plot(t,y); % 绘制加噪波形图 8 Z3 c U" _) }7 u H
xlabel(t); % 为X轴加标签 & ]" H% }: g. |0 ]. y, F. u
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 & L! z5 V0 \' E# u5 s& `, W

) n# h6 w6 @7 f1 j9 S1 f% j* }0 @ 3)制作平滑波形图
7 [% P. Z' G9 R% s. n- Z 【方法一】 ( f# x6 F+ K8 Y- l( _
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
0 f2 W/ z6 s& e1 A$ P1 F yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 0 O" ?3 v0 w0 m/ q
figure; % 新建一个图形窗口
* o# |4 W+ `9 h+ a# J plot(t,y,k ; % 绘制加噪波形图
4 _1 }/ P( ^2 M3 \ k$ V% k hold on; 7 s! F4 w9 R5 i) F" t' {! ]% X
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
) S. W9 A, O& W8 C" A, A xlabel(t); % 为X轴加标签
9 f8 S3 A4 r& G# j* ^# T. {1 W ylabel(moving); % 为Y轴加标签 # O! N! {" o% y; v0 u k8 L
legend(加噪波形,平滑后波形); + l N$ p, _6 M

1 G3 X3 g: Z5 R& R) n 【方法二】 , X. k+ F+ q$ d6 @6 c9 {
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 3 `- r( o* B/ O" [: I3 M
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
" ^) U3 k: O+ R: h1 K9 X figure; % 新建一个图形窗口 ; r! W3 g0 B2 v, G& X" B$ k
plot(t,y,k ; % 绘制加噪波形图
& P% @8 }' `- o) y7 |2 {. M5 U hold on;
2 |! Z9 F3 U. { ~ b0 p" j* O' j F plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
. c5 w$ E' T- ]* B+ U xlabel(t); % 为X轴加标签
2 m( \1 u; w' a ylabel(lowess); % 为Y轴加标签
+ H6 n+ w7 z* g; e3 ? k: u legend(加噪波形,平滑后波形);
" t- h" t$ U) H# `( q8 r  ' H, Q! Z5 l$ h
【方法三】 3 A! c4 [8 Q! F# p
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 9 d4 o/ y5 @! w' n
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
1 C$ Q: u5 S& v& h. W6 {# G) n0 l figure; % 新建一个图形窗口 4 N) l H: H1 Y) M9 L
plot(t,y,k ; % 绘制加噪波形图
H1 ^+ [9 M1 K hold on; . s: ?; M' L P9 ] N
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 5 g; v3 i1 f6 l% o+ x, y( d$ A, ?
xlabel(t); % 为X轴加标签
, m* @/ C0 o9 @3 g+ x! l% r0 c9 ~ ylabel(rlowess); % 为Y轴加标签
6 S2 z: \: k- ] legend(加噪波形,平滑后波形); " X8 r2 [( P8 x8 u8 }

+ S+ G& ]+ K# M% s 【方法4】 8 f; h' O. g: K. V6 A
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 # c, D4 P' Z4 V4 j1 ^
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 S) b# \" p+ Z$ q' M: `& Q
figure; % 新建一个图形窗口
# c7 Y) r& n( g) I0 _& t plot(t,y,k ; % 绘制加噪波形图 , t+ d& T+ L |7 f4 M0 i! E
hold on;
/ T/ L7 X* l% C" k4 { plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
% g7 N% ^+ V+ N6 N; n xlabel(t); % 为X轴加标签 ; `# E2 }5 `7 s& _) f& {) c
ylabel(loess); % 为Y轴加标签
8 h/ F/ Y. o' X legend(加噪波形,平滑后波形); # C0 K$ H& V( O g$ P ]" ~
 $ X) c7 ^1 I5 `9 N
【方法五】
. g, l- V+ H' x& s/ ^' ~- @ 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 & u# N- x) c+ [
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
/ ~ ~7 @. ?6 E) {# P! ?0 T figure; % 新建一个图形窗口
4 H ~( @; g2 |# @ plot(t,y,k ; % 绘制加噪波形图 ! u; |4 `8 f7 J; R4 M! _* L7 n6 V
hold on;
6 ]6 w; Z# E/ G3 _. Y3 p0 o plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
+ a! Z7 ]9 W; p' a3 Q$ d xlabel(t); % 为X轴加标签
) v- K$ h6 a d! N5 x/ R0 t3 \4 p ylabel(sgolay); % 为Y轴加标签 $ W/ ]+ g* ]: f& q2 I+ C8 H: V
legend(加噪波形,平滑后波形); 8 k. Y% Y5 @" `5 w8 z2 |

% L2 s+ Q+ p' K
$ b: c5 E3 Y+ S' u4 V B1 z
T- x. h7 r. k' T9 Z
2 B( z7 J: |/ d- _6 k5 M1 k1 d! W- W# a0 D; m- `" k, \5 E
|