|
. l0 `+ k# k6 d; k; ~0 q
如何使用Matlab对数据进行预处理
6 ~, ^0 B' u/ i. Z* q 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
8 O4 J9 c- c+ L- F# b) e 1.1 smooth函数
( Z; m7 \2 e; I Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
% r) j9 `3 d- Y# b 1)xx = smooth(x) 5 Z* G. w( B4 b6 W x. {& b
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 7 j( |+ G6 z& R; s1 A$ |; s- |& r$ y
xx(1) = x(1)
) E; I" D2 D# @' E3 ~3 M1 O* l xx(2) = (x(1)+x(2)+x(3))/3
& }( [6 X- U1 {( N8 P xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 " o% H0 {' {# ~
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 6 X, |' ~/ u2 T" _/ Z
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 - \* I1 c* e- K* e6 ~
2)xx = smooth(x,span) / V! Y7 e2 m0 R: P. b4 p2 S4 `- b
用span参数指定移动平均滤波器的宽度,span为奇数。 $ O K' X* I- ?, k; W& r9 ~
3)xx = smooth(x,method) 3 w; }+ \; r( a' J0 K/ f; B
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
7 Q; ?' j; Y6 f/ h. V0 t! ~5 B 表1 smooth参数支持的method参数值列表
! k7 C# \# i' ~+ y' w; E4 E7 _  3 g0 \% x, \8 d) f% F. C
4)xx = smooth(x,span,method)
% @* v+ S/ f$ q, d2 v8 E' y 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 4 m* t$ z6 |- W
5)xx = smooth(x,sgolay, degree) & Z. b- E! z; ^, s. ~
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 6 [) L% |5 ?* m, G9 A3 z( f
6)xx = smooth(x, span, sgolay , degree)
1 f \' t" |0 k9 z# u 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 # \7 [$ N# U3 P& L' E1 B
7) xx = smooth(x,y, ..)
2 y1 s) I6 b: w4 ]2 H. Q: g 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 9 G: ]; x- t9 l/ i3 p0 M8 e
【例题1】
- d) h' J1 T1 s: p4 E6 B& o 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 4 T2 R$ s5 o6 `, U
思路: ! o6 O3 i, h$ v: W; _: n
1. 调用smooth函数进行加噪数据的平滑处理;
( n( ~ F `6 @9 }+ U 2. 产生加噪正弦波信号;
$ r* K9 j) A8 ~, k" e 3. 绘制加噪波形图。 3 O. @' v. y4 M
解题步骤:
+ q3 W0 C8 \5 w. u9 i 1)构建数据 ! h* y3 j C) t, M3 E* k3 W
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
: D4 a6 L I2 z" W& ]) P y = 100*sin(t); % 产生正弦波信号
% \! K1 |" _( H# E; X* m % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
0 w% T( m) ? E2 S0 Y% U noise = normrnd(0,15,500,1);
+ G' o# {/ F0 }4 d) K3 r y = y + noise; % 将正弦波信号加入噪声信号 - m; M. Q1 T3 s$ u" E
2)制作基础图 ) Q q# Q8 p; }7 N0 y
figure; % 新建一个图形窗口
8 d& v) t; W! |. _3 E plot(t,y); % 绘制加噪波形图 # r; S+ l1 O6 G) M0 L' C+ `: y
xlabel(t); % 为X轴加标签
, d8 s& F& X* Y0 O n% p ylabel(y = sin(t) + 噪声); % 为Y轴加标签
- p/ |# N* h0 b* p3 `8 i B 
8 _6 D8 i5 K8 G% X 3)制作平滑波形图 % ]+ @1 U ~( H- A3 T8 w
【方法一】
$ I% `/ r6 V( ~- }' ?$ U6 I 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 - w- ~# L$ u, D9 @
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
+ R$ [4 x4 V/ X0 M, N0 _2 q8 `$ Y figure; % 新建一个图形窗口 ( \+ c" A, h4 f1 F# Z0 j
plot(t,y,k ; % 绘制加噪波形图
' P/ p9 A' W- Q. T/ S" q$ A8 n9 } hold on;
, b/ k! @) _; C" D3 r plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 ' s c" r1 [6 |' e1 k( ^2 {
xlabel(t); % 为X轴加标签 $ i U, x) m0 F* X# J
ylabel(moving); % 为Y轴加标签
) b- A* Q) P Z7 r9 A# O legend(加噪波形,平滑后波形);
5 ?% n% p4 q+ Z; I4 }: m2 t  # o: D* o/ {* U- k* _6 o6 z) ^2 L/ Y
【方法二】
& ~ f+ w5 w. Z% j1 H 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
- K( y" G4 q% w5 ~% s; g( `2 G2 z yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
+ u; o& {" j0 {; B figure; % 新建一个图形窗口 0 ~: B% E% n( t7 _5 v
plot(t,y,k ; % 绘制加噪波形图 / r1 K. K) o6 z5 r2 Q
hold on; ( u. f: y' j$ Q. U( G
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
9 A: i! i0 d7 c- g8 a xlabel(t); % 为X轴加标签 0 t9 T7 d9 B1 i" G8 O
ylabel(lowess); % 为Y轴加标签
. E! ?7 r9 z& l. w! P* @: c8 z legend(加噪波形,平滑后波形); * z1 l: k" l& O9 l- ^; X6 @
 . K# Z4 i f& S7 j# `
【方法三】 % B, W* v3 N8 B. Q1 Z4 h) c
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 : ?) e2 b9 f h$ A
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
' j: k; ~ a1 O* n figure; % 新建一个图形窗口 1 @# \4 x K; ~0 d, q
plot(t,y,k ; % 绘制加噪波形图 ! x1 B+ `0 a+ Z% P! D5 `2 Q+ ^
hold on;
% W4 w6 X* k. U/ q0 h t- D plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 1 s! l- o1 Z$ z' F$ _8 P
xlabel(t); % 为X轴加标签 / e4 u+ m; M/ {3 g
ylabel(rlowess); % 为Y轴加标签 ( P1 [, N6 ~+ I1 Z9 U/ K
legend(加噪波形,平滑后波形);
/ i( a y; h8 w1 E( L' _. b* y  6 }9 o* _3 |5 ^0 w* t
【方法4】 2 e5 n0 x2 k* T5 M% I% y3 S
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
% U! M6 h; }0 W& { yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
, n5 ]4 j# }- q0 W, r; I4 R figure; % 新建一个图形窗口 * e0 D6 o+ T; \, a
plot(t,y,k ; % 绘制加噪波形图 # H9 \( L0 Z& Q
hold on;
" o- i5 V/ o9 G& `+ d9 b# v, { plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
) |3 }$ b6 [! z& d xlabel(t); % 为X轴加标签 # ^5 i* X/ T/ H7 l- D
ylabel(loess); % 为Y轴加标签
2 |7 P! O+ J9 e legend(加噪波形,平滑后波形);
1 l8 Z5 M& k7 ? ]( e$ d  , j2 h, q3 p# H% C$ R- @
【方法五】
0 Y" l. [ Z) P6 [ 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 0 u* f' T0 G I7 Z8 y& t
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
) u4 t/ P4 a/ {0 j) C figure; % 新建一个图形窗口
" E3 s0 |; w) ~+ Y# ^ plot(t,y,k ; % 绘制加噪波形图 0 [( C- v4 {( b2 e- ~
hold on;
& K1 S9 n9 \3 x* F! G4 [' E plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 8 }% q5 [8 m$ l( c1 K0 a# Z5 i
xlabel(t); % 为X轴加标签 , C+ s P# L* i' K7 Q
ylabel(sgolay); % 为Y轴加标签 4 c2 o) ]$ E: k* {
legend(加噪波形,平滑后波形); 7 I! ^" X$ y! X+ j5 D

9 i6 X% r/ d# w$ `& T3 N: g) @- }
. W( L! F( H+ y' C
: O3 s7 Z1 U/ j8 W9 R+ O1 b! J. ^, L3 |) I: X5 k
# Y6 B i6 i5 u' D- { |