8 }/ r5 |1 ~5 _/ v* v4 x# T7 \$ ? 如何使用Matlab对数据进行预处理
4 f6 x0 F* V& C1 Q5 @ f; S$ e; \ 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 0 x3 h0 ^) ~% G! U* k
1.1 smooth函数 . ~$ y! P" r+ g2 ]! G
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
1 i3 e& O3 V/ k" w; G. `' c 1)xx = smooth(x) . c$ e$ K# J( y7 k: y" v) u
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 6 H5 c+ g+ E8 m h
xx(1) = x(1) # f0 n9 `: l' j6 I' `
xx(2) = (x(1)+x(2)+x(3))/3
5 `* W6 H+ k4 C' p: Y, \9 O) z. G# u j9 Q xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 0 W! p2 x. L, H) y0 J
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
0 O/ J& b$ `9 x9 U xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ; D( m9 Z+ U1 p1 k
2)xx = smooth(x,span)
$ Y" O3 T/ n+ P, `$ {. t* d! d 用span参数指定移动平均滤波器的宽度,span为奇数。 0 u7 m! d' ~3 S2 E- K
3)xx = smooth(x,method) 4 i7 {9 b3 J ~ f$ g. y+ |( e5 h
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: * R6 k E7 Q4 V
表1 smooth参数支持的method参数值列表
5 z1 @) \5 {+ ~2 h4 i( w, g+ X6 f
0 O$ O* H4 O4 c$ r- x0 I# X 4)xx = smooth(x,span,method) / M0 n/ Z4 n* c/ O# o. D
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
4 m2 k# Q. c. Y3 i/ ` 5)xx = smooth(x,sgolay, degree)
6 u) N( f( U& A$ B( D+ k 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
0 m+ K4 E2 P9 g 6)xx = smooth(x, span, sgolay , degree)
0 `) B }. O7 J! s0 G: O3 Z 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 0 D: k$ b; R% z1 C' Z0 T
7) xx = smooth(x,y, ..)
% W# L# M6 v5 D( ]) I7 P 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
1 {4 M4 x) q8 s* R- i+ @- i3 d 【例题1】
0 x K: [# V u; U& w) F, R+ l: C 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
s7 i5 {) B0 d5 y4 b3 e5 s 思路:
4 H: E0 Z3 [6 @/ H7 X* Z* |1 s 1. 调用smooth函数进行加噪数据的平滑处理; 0 P5 r/ A+ t- i2 C& r
2. 产生加噪正弦波信号; ' P9 a+ u, T# M, l& P! ]8 Q3 V
3. 绘制加噪波形图。 . H1 Q/ ]7 k# m* r3 a
解题步骤: 2 L, C( Z+ g$ F- X4 ~
1)构建数据
# [& V0 C# P; N" y$ k8 \ t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
3 z( f+ E8 {; B$ Y y = 100*sin(t); % 产生正弦波信号 : b4 C) A5 P$ T8 a7 G" Z! t
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 : R9 J, k/ \, z7 y9 v5 A y
noise = normrnd(0,15,500,1); 8 h) \' L9 y/ e0 F3 u
y = y + noise; % 将正弦波信号加入噪声信号
% u3 `/ u3 Z+ w7 D' |/ o" R 2)制作基础图 & A! z; G: j, a- l t
figure; % 新建一个图形窗口
. p7 |! [& h. H* m2 \; J plot(t,y); % 绘制加噪波形图
5 g; ?" c2 K U/ M b+ s, \ xlabel(t); % 为X轴加标签 3 \3 ]% J$ e( f" v( H* ^- }
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 7 V( x" y9 p: W* W4 }* u
3 w, N$ i& ]& ~- N! i y 3)制作平滑波形图 8 m1 |/ R# t, N5 m/ P' u
【方法一】
9 M2 f+ M g5 b; N( i8 t; X 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
: D0 V3 R- R" X yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 9 Y6 ^" ]* a& e7 m' [3 ^' Y
figure; % 新建一个图形窗口 3 H$ E, J7 G1 f: o5 P
plot(t,y,k; % 绘制加噪波形图 ' F' C& l1 D: v! s- G. }( g
hold on;
5 o- I5 I' w+ [0 k plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 a0 ~- a/ T; s0 R
xlabel(t); % 为X轴加标签
0 b* u4 j8 z' i, a8 V- K ylabel(moving); % 为Y轴加标签
9 {' P! h+ I5 f! M legend(加噪波形,平滑后波形);
& I- b7 V" P. u, r
' M! f1 T j+ z9 H* R1 o 【方法二】 ' i- Z* {# u! s1 x" ~8 f1 |! C
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
& A# l) Q! O4 ^7 q, e/ { yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
& e; j' q4 q( ]( ? figure; % 新建一个图形窗口
8 Z9 E( }, D) V plot(t,y,k; % 绘制加噪波形图
) A6 f8 B/ W2 |5 l3 p hold on;
6 [0 Y& M5 z% R' I' {- M plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 , a8 R( b4 M# o. v4 M
xlabel(t); % 为X轴加标签 5 L# k& d5 w' Z
ylabel(lowess); % 为Y轴加标签
5 R* K, Q$ J! v legend(加噪波形,平滑后波形); . a' C% \2 I6 w
1 T5 p' M$ o9 G0 }+ S- ~# a; F9 d
【方法三】 + k$ I b) o7 m: v& G2 L( S1 R
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 4 A9 [) @0 K5 @: U0 {/ f( j
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
9 @0 {. v" X$ M( G$ u, s figure; % 新建一个图形窗口 & ]' R5 n& R. Y0 D8 f4 t
plot(t,y,k; % 绘制加噪波形图
3 R$ M# X" h1 b/ t hold on;
8 Q) ~5 g3 T6 z! Y2 w2 S, c+ d plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
, v1 Q! q( W/ N; n- r1 z4 W# Q, w xlabel(t); % 为X轴加标签
! \9 @+ k2 m% ?* w ylabel(rlowess); % 为Y轴加标签 ) a9 Y' C4 J6 q* Z: U5 x
legend(加噪波形,平滑后波形);
. I1 B* f1 @9 K) X3 Q4 O & `. b9 S. n) }
【方法4】 * f! L9 t9 e& Y( F$ C9 g3 o
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
: N' i% J9 ?. b6 S& } yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 / h( v/ C! b/ t9 f2 G; e1 W
figure; % 新建一个图形窗口
/ x& e+ _+ a0 s, t8 s$ u! M3 v0 i. T$ @ plot(t,y,k; % 绘制加噪波形图
. I) R( [8 |1 O, p0 ~% g hold on; / F6 N! y4 U4 F4 o
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 4 t5 F5 v4 O3 G3 g* N; X
xlabel(t); % 为X轴加标签
, m9 x$ \" u5 E4 m5 W; Z) {- E ylabel(loess); % 为Y轴加标签
* y5 i/ w# F2 {& R legend(加噪波形,平滑后波形);
+ k5 b( `" N+ R* Q4 u5 y
, |. R1 Y6 t0 S 【方法五】
& f: N$ L6 U) K+ N$ k, p3 h 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
" ?* K( ^9 w* m+ L- G$ V) Q' E yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 , O9 w* o4 S( J. K
figure; % 新建一个图形窗口
) c0 h0 q7 _/ r! V) k6 R# \) N: F plot(t,y,k; % 绘制加噪波形图
3 ] U! _5 q" O; R# V# C hold on;
1 z. I/ z5 d; n plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 + N, w) t }3 x' Q, ~
xlabel(t); % 为X轴加标签 9 T; _/ \& p1 x3 g) A# V
ylabel(sgolay); % 为Y轴加标签 / ^8 J, i6 c3 T5 A
legend(加噪波形,平滑后波形); + Z, d! C1 P* z" {6 A
) f; }3 K# V% ]- D4 H' _3 f
/ x( ^* V4 p2 S/ f1 T
, O6 ?; N& |8 f/ @& G4 [% w' y
; K0 O( G9 I+ T% E+ F! t
! u' S0 E( Y- `0 E |