( Y( d! m0 F# c; e8 i 如何使用Matlab对数据进行预处理 r5 L% [- `8 M0 F% I! S* o3 k
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 6 o/ Q, ?5 F' ?8 j
1.1 smooth函数
( T: W4 R' s9 g! W8 t l: Z Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
* D* J; s1 J" [0 H+ { 1)xx = smooth(x)
5 F+ U; D9 u" N$ g+ e 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: W/ _2 C5 E, V% {4 t! s
xx(1) = x(1)
. R5 w) {- @% c' S( k) i xx(2) = (x(1)+x(2)+x(3))/3
" x* H2 Z8 |$ h/ Y7 ` xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
8 I, n2 d# H- p$ L5 R) L6 \ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
0 K; h# k! p% O6 v9 V* C xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
0 X: B: E: F( ]) A6 D2 o2 ]. b 2)xx = smooth(x,span)
- U/ j9 I" f& V, W! ]4 e! Q7 _4 w 用span参数指定移动平均滤波器的宽度,span为奇数。 . V$ D1 _) y/ p" a& S3 u8 c
3)xx = smooth(x,method)
- Y, L: F5 S' X$ G* l9 a0 v+ G- z 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
1 z& F% u1 [) X: G- w( e6 @ 表1 smooth参数支持的method参数值列表 0 i3 \' M O! S: d0 B" J( {$ J

' [: a, a& D ]% [# z/ X 4)xx = smooth(x,span,method) * q- z4 @ o1 L) A4 T' Y
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 ! o b2 Z6 v0 ?. }" L
5)xx = smooth(x,sgolay, degree) 1 j1 D$ e: X6 A- J! o' t$ Q6 |
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 9 g$ L. B: H- h/ M) d- }/ H
6)xx = smooth(x, span, sgolay , degree) ' o& t, d. U) a6 \+ C* n3 y$ K& i M
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
$ _' A! f9 s( p1 D% u+ N" J 7) xx = smooth(x,y, ..)
1 ^' [( d% M2 g% K+ H 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 * ^* g" w" h }0 j. h
【例题1】
/ i7 i+ B7 q6 }7 S 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 4 O- G' g9 ], Z- E3 Y# O! I" Z1 S
思路: . x5 e1 L, A. A; F
1. 调用smooth函数进行加噪数据的平滑处理;
: I# ?- I" ^$ U9 P* y 2. 产生加噪正弦波信号; # r: u: \6 v1 A/ d: U, I, J
3. 绘制加噪波形图。
; I4 Q9 j4 G: m% _ 解题步骤:
9 I/ d: ` C { 1)构建数据
* V5 R$ ~# u* S W0 ]( l$ Y t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
; k; M8 f8 F; r+ ? D6 @ y = 100*sin(t); % 产生正弦波信号
: X+ [- r& R( I1 }0 E1 t1 R % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
- k' ]. Q4 d. ]4 F* j noise = normrnd(0,15,500,1); ! P* B7 u% d+ j- A1 V
y = y + noise; % 将正弦波信号加入噪声信号
$ E6 P: e# i# y5 @# ` 2)制作基础图
/ X5 [6 }. _# P% p5 @* t9 j figure; % 新建一个图形窗口
; A/ G' c; V: Q4 |+ l& B- X plot(t,y); % 绘制加噪波形图
3 w2 k- A! j1 X& m xlabel(t); % 为X轴加标签
" J7 J* A6 v$ ^& m ylabel(y = sin(t) + 噪声); % 为Y轴加标签 3 [7 K; e, @3 G5 i( `

9 Y5 s* w9 N, o. D 3)制作平滑波形图
; D0 Y/ W( V: t; [ E& `7 `/ J 【方法一】
+ e. l" o/ H) R 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
" o0 I+ x, d. G5 x yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ! K! d5 l2 L4 G1 p- P6 O
figure; % 新建一个图形窗口
: W4 {! P5 T; V. x plot(t,y,k ; % 绘制加噪波形图
6 x0 v- U* {+ v. t$ G hold on;
2 R( V0 g, o( f6 W( \ plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 2 }! I) K7 u2 V( w! U
xlabel(t); % 为X轴加标签
* e" P, C$ }9 |& G ylabel(moving); % 为Y轴加标签
- v' E+ @4 ?) p! \6 ` legend(加噪波形,平滑后波形); ; x8 B- h4 O% b! {
 ( Z( ^( H! A: g8 Q2 F
【方法二】 , @, }: u# {* }7 u
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 r+ J, W: E& y- E5 w7 i5 l3 y r
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
" f) e. g) }& P3 g9 s figure; % 新建一个图形窗口 * \7 h5 \7 q& y" x* {9 k
plot(t,y,k ; % 绘制加噪波形图
1 v, \1 M* h: E! u8 C: |: K- [" C0 W hold on; ' a# Q4 @' R3 W& |7 E P* Y! @
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
{( d! c8 U1 C9 y. G6 s* W. l7 ] xlabel(t); % 为X轴加标签 ; Z8 W0 Q" E: V4 m
ylabel(lowess); % 为Y轴加标签 0 }* p- G1 j, Y6 w* V: s( y
legend(加噪波形,平滑后波形); 9 e' ]$ J) l6 N4 I$ u/ O

6 A( T0 o% |7 H3 n j 【方法三】 ) y# u) [- W! d! H, V
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
: F6 a0 Y$ F( t yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ! o. m, F. Z: d9 ]
figure; % 新建一个图形窗口 / U& Z! D" Z* a
plot(t,y,k ; % 绘制加噪波形图 & G: [+ s. Z1 ^' n
hold on;
: `& d) e% S4 Y, L) ?3 R6 t4 E plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 6 l9 c, \, d: Y* j b
xlabel(t); % 为X轴加标签
5 L& P' a# m" e: u' v ylabel(rlowess); % 为Y轴加标签
, j/ {6 H& R4 q4 C* }7 \ x/ f legend(加噪波形,平滑后波形);
' H4 b2 n/ ~; J- z$ M# X: u  1 G! U1 Z3 j u8 b7 ]
【方法4】 $ A. k$ d! y' K, C' A1 V# r
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 , D% [- G2 x# N0 S; H3 D" H
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
/ A, L. s# F- c' C/ M figure; % 新建一个图形窗口
6 J; O& F+ }- a7 C( N6 q) v- ?; O& S plot(t,y,k ; % 绘制加噪波形图 0 f/ j4 A! f0 M {( g- ^& k6 @1 M$ Z0 f
hold on; ! ^ n# {9 n5 A7 m5 k$ d q
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
5 E6 v b% X3 J b5 _3 p& t xlabel(t); % 为X轴加标签
! Q& X2 W7 s9 l, v+ I ylabel(loess); % 为Y轴加标签 ( v- o% o# v4 u. z% h( {* f
legend(加噪波形,平滑后波形);
2 |! c# B) }. L; @; q  1 x9 Z0 w! X) M) `
【方法五】 / j+ J; p7 F: h# M" b
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 , D. d$ [" Y) ?2 M
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
! h! A. R8 X" y; J" p! Z t1 g figure; % 新建一个图形窗口
0 h4 ]; I5 |) e) ^. n( X0 q { plot(t,y,k ; % 绘制加噪波形图 ; k3 c0 q& G! ]- s5 K3 ]
hold on;
1 S4 s8 C C4 J6 n% ]- x plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
0 S. H# z) `1 Z* a( a xlabel(t); % 为X轴加标签
# \! }: j$ @. G1 q ylabel(sgolay); % 为Y轴加标签 ' ?4 H; k" P- ?$ o5 E% f
legend(加噪波形,平滑后波形); 1 G& S5 g: Y; W

! l1 P m" S# N) \, V- g
9 ? j! ^4 R* d4 J2 E- m7 J' |
( a) m3 S' w* [' f# S4 a$ L
9 v: {% k% o9 F p0 R$ @3 [. K% W. X3 T& R* f
|