|
( G' ^. b* M( V2 e; ~7 u 如何使用Matlab对数据进行预处理
/ G& A" I/ |8 U7 P. | 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 9 v4 [" v) G! b$ e7 _7 e
1.1 smooth函数
$ e J M* X# k; ~" X6 B Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 3 u. [: m- z: W* {5 T
1)xx = smooth(x) # \2 t/ u/ z: H) k
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: - Q: K s- x: G' m. `& g p
xx(1) = x(1) - g# p" u$ I+ z
xx(2) = (x(1)+x(2)+x(3))/3
' R, @$ b8 ^ ]" H+ c xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 " i# c8 `9 s3 L+ ?- `
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 : t6 R Q; v) W4 o
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 3 ]2 h/ c: [, c0 v+ Q
2)xx = smooth(x,span) . D# n& R9 s4 e7 b/ u1 T
用span参数指定移动平均滤波器的宽度,span为奇数。
$ p2 Y" W# F" {$ T! H. r+ U0 O c 3)xx = smooth(x,method) : h# D1 G/ \* x9 H; q& ^$ m
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 5 g4 i; i) s( e) N7 E+ e
表1 smooth参数支持的method参数值列表
n4 Q$ @. w9 l% a9 y( R$ T- O5 o  K4 h+ W0 [- g
4)xx = smooth(x,span,method) 2 Y0 z/ a: ^- Y D$ U
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
* h( t* v5 B2 D5 G 5)xx = smooth(x,sgolay, degree)
+ x1 e- u3 ? L 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
8 X' C! h: y, F! E 6)xx = smooth(x, span, sgolay , degree) 6 ~- N# z* h- S* `
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
$ K* M5 |/ a* S" ]9 q2 j$ h. B 7) xx = smooth(x,y, ..) ( ^$ E5 U# r7 l
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 5 d! V) N/ h- |4 W9 S
【例题1】
" R/ o5 F* p" ^/ [) `; e) y5 E 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 & N0 z5 }2 f. L5 F( p2 U
思路:
8 [" a; L5 V M8 ?0 i3 m 1. 调用smooth函数进行加噪数据的平滑处理;
9 ^8 T- H; ?; q& \! S0 W 2. 产生加噪正弦波信号; : G& k! H% S& A) w! D* p
3. 绘制加噪波形图。 * ]+ Q3 K, \. Q
解题步骤:
3 c0 R: h: {5 k" H7 A0 n 1)构建数据 5 Z3 |8 k& b* F: F: z
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
$ t0 z# V- Y5 Z0 h3 u* z" y+ @) Q) E+ B y = 100*sin(t); % 产生正弦波信号
% z1 X* p- H8 R % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
% x. O( ]" x. @' j8 R ~ noise = normrnd(0,15,500,1); ; Y) i$ O" h$ O
y = y + noise; % 将正弦波信号加入噪声信号 : U, ]0 ?' y! j0 v1 y" X
2)制作基础图 : [6 S e1 X8 e% E
figure; % 新建一个图形窗口 6 T8 j# a! V8 L" j, w- U
plot(t,y); % 绘制加噪波形图 ; e" A" ]* K, p" j5 s4 i" H
xlabel(t); % 为X轴加标签
% ]& o% `: T6 S3 h- I+ u ylabel(y = sin(t) + 噪声); % 为Y轴加标签
6 W( P* v) p4 a( W7 J' a* _, \6 _ 
% Y& V5 I+ h9 [$ e; e( F' p( B ~! D 3)制作平滑波形图
" F! K$ l ]: h1 m; f% k: b* E 【方法一】 5 s/ G& z* H. O' r& E% O( o8 T' L
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 . o& S% ~9 G1 x+ N$ D
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ; x G& O* l2 a( u! `9 N0 y" [0 @
figure; % 新建一个图形窗口
# D0 ~+ b# z6 M% l plot(t,y,k ; % 绘制加噪波形图 ) h; O/ z4 G( x# j9 ~& C
hold on;
9 C5 i7 t1 \" }9 p6 R+ u plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
/ y, ?" a; h% n* d- b! X xlabel(t); % 为X轴加标签
+ t2 L6 r. B2 n. z ylabel(moving); % 为Y轴加标签 3 Y y' z) u" v7 @
legend(加噪波形,平滑后波形); 0 K4 u9 }( o4 k; }8 _. J

5 w) @: s F# I& s+ ?0 c 【方法二】
! C' ^7 j7 T0 l% v9 O 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
) g9 k$ F3 m! d1 U; V) v3 K yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 ( K6 W; E% w/ q# w
figure; % 新建一个图形窗口
& E2 s8 Z; y. p( x; P W6 d+ m# g plot(t,y,k ; % 绘制加噪波形图 # |3 f$ s# Z: F+ ^
hold on;
- G/ R6 B4 S ~$ ]9 f! X7 ~ plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
7 m! d" }* J4 x% \8 ~4 W xlabel(t); % 为X轴加标签
& Z4 M8 h5 k+ r3 i: R0 G ylabel(lowess); % 为Y轴加标签 9 E/ z/ z5 r9 T2 F+ c
legend(加噪波形,平滑后波形);
5 y* ]0 F2 u( A 
) k8 a* O- }0 r 【方法三】
9 ?0 K3 f( J/ d/ ~; M" O6 t+ p 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
3 Y6 s; P3 w O- Q3 P* \. D yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
/ W4 P1 G/ K m; V$ a+ | figure; % 新建一个图形窗口 1 I" Z8 T; j- k. b. K
plot(t,y,k ; % 绘制加噪波形图 ; _' p2 z j9 e c# J6 @1 u
hold on; % |/ L! M/ A2 A& `! G
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
" p% ~& s5 D5 {4 _$ H6 D xlabel(t); % 为X轴加标签
6 v3 s s- y; y2 d ylabel(rlowess); % 为Y轴加标签
) L& X* f" K5 M6 E legend(加噪波形,平滑后波形);
* C- U- n$ L% @5 t, V' ? 
$ k6 { P3 d3 v: l 【方法4】
" k4 _$ Y% g: P/ L ^! C g 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
( h- I1 ?7 W# f yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
2 _- o1 F# C- ] figure; % 新建一个图形窗口 " ? i2 c6 \* A& S8 M$ n x, a
plot(t,y,k ; % 绘制加噪波形图 % j& D- |! X% m8 }
hold on;
2 b* N8 f6 G3 u, ?0 K+ N plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
+ h2 F+ T$ i" }7 T! ~$ X xlabel(t); % 为X轴加标签 5 K, v$ R3 R% r* x5 S/ g2 ]0 x
ylabel(loess); % 为Y轴加标签 5 \& k( c! h1 [+ l9 g$ B
legend(加噪波形,平滑后波形); : f2 h b, B8 O
 2 c ?; Y2 i$ ^
【方法五】 # o8 d8 H/ U5 k5 [2 e" m! u% ~
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
. ^, X) G6 e% S# R+ ^) k6 @ yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
2 X( q6 A0 _- {! d4 p figure; % 新建一个图形窗口
) z, j; U/ p3 a: t0 E( X X3 o plot(t,y,k ; % 绘制加噪波形图
: ^+ Q! ?; t3 m, I hold on; 0 F8 ^$ v3 L4 ^! V& X
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 4 a5 Q7 S0 y" _1 j# k6 \, D
xlabel(t); % 为X轴加标签
/ @/ r$ Z" I' O: y1 ^$ O7 k ylabel(sgolay); % 为Y轴加标签 5 K- s( K" E. j6 r4 x& |7 {
legend(加噪波形,平滑后波形);
$ M" E8 g6 S( p. ~# {# T4 w T  1 D" L; C& g2 X
# H5 ^4 I1 J7 W
1 Z$ i) ~/ Q4 b: ]! o4 t: D" Z
) {( E9 F6 N6 L [/ n. T7 B$ e4 T! t. j3 i9 k- G# _
|