|
" Z8 c/ s' X, |5 N% f
如何使用Matlab对数据进行预处理 5 T: k( f' ~* f+ \
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 8 H' V+ p* w# X. V V5 D
1.1 smooth函数
& Y+ p6 V% a7 ~; f Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
1 L" i) b: ]! f9 ^ 1)xx = smooth(x)
1 z3 j& F! F( ?, ?! h 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
9 B5 U! S- H( H1 g7 z xx(1) = x(1)
1 o/ D& x/ f3 C. x3 q xx(2) = (x(1)+x(2)+x(3))/3
0 k1 S, ~1 x/ H5 A! R9 a* }8 } xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
: R. Y3 {# Y8 E U0 F% T+ [ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 ( b2 b. ]$ i$ x! i o6 A3 E
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ) M. k* V- H6 j# a9 ^ d7 o$ l( M
2)xx = smooth(x,span)
: G8 J* Q5 ]1 M% s5 I! V7 i# g 用span参数指定移动平均滤波器的宽度,span为奇数。
2 T- ~- @ h% w( d, z 3)xx = smooth(x,method) ) M; l% q/ y2 l& j8 s* g
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 0 C0 }& s& V) h
表1 smooth参数支持的method参数值列表
2 I% w# m( ^* K- C& g& e% X& d 
/ T& d6 `* b$ T 4)xx = smooth(x,span,method)
n- i3 X, i; ^; T2 B 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
_% ^& g. f4 z: A2 ` 5)xx = smooth(x,sgolay, degree) 5 `9 B# k6 P/ M1 U
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 7 J! x. X% D" F5 O, m' @
6)xx = smooth(x, span, sgolay , degree)
- M4 Q+ D! B% T1 }! ?+ p 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
w) i6 [; f3 y) v 7) xx = smooth(x,y, ..)
" d5 R, D! {' X' |2 e2 D4 C- P 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
' y; X/ [& ^, r0 B( M( M$ ` 【例题1】
+ l& Q3 s$ C2 {4 R0 U 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
5 A( `! U) b9 }6 e0 p, W 思路: ' |+ G0 J$ A( Z; Q
1. 调用smooth函数进行加噪数据的平滑处理; : F- t! q* R( ?/ e, ?: d. e8 A2 j
2. 产生加噪正弦波信号; + i% a9 A. K9 F+ n
3. 绘制加噪波形图。
' K1 S' a( e: J( H4 y: d% T 解题步骤: # u# O/ u; `6 C9 e- s( u0 K
1)构建数据 * w1 ^% A% P( _. `0 X3 [: E
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
7 P2 F6 b5 ?1 \; Q2 @6 D y = 100*sin(t); % 产生正弦波信号 - k [' k: j' q$ O7 V+ v1 M8 n
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
$ ], h1 E2 H7 ?& E }! |8 s noise = normrnd(0,15,500,1);
6 K' I% }* _% Y4 k6 d$ ^% V y = y + noise; % 将正弦波信号加入噪声信号
! ~* F4 ~) P3 d2 @" y8 o 2)制作基础图
' J7 J; o) F3 y) l6 @ figure; % 新建一个图形窗口 , R! d' K+ V* v+ ~' f0 Y' ?9 s
plot(t,y); % 绘制加噪波形图 3 q% M' g4 J4 N+ m3 P$ n6 Q! N
xlabel(t); % 为X轴加标签 ) k- Z8 p# M( E: t6 P0 T8 i5 o5 Z0 U
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
+ A! ]+ j* U" m% A$ g 
- m( W: h: N/ H4 Z c 3)制作平滑波形图 * f" b' N6 a5 p& j( X
【方法一】 * `7 l/ _* V& L4 V# K
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 * N2 V* C- V7 c) V% n
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
9 f+ `8 P6 s5 s7 K figure; % 新建一个图形窗口
6 ?% }7 m1 K/ o7 P* L5 q8 Z# ]5 U plot(t,y,k ; % 绘制加噪波形图
7 Q) o8 n- Y0 U' a% y' @ hold on; # ]: g0 m# F3 Q( M* a7 N4 b* y$ _
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 , J. q* h K" O1 Y5 C2 C8 F: {# Y7 q
xlabel(t); % 为X轴加标签 4 @, `, y j/ J+ Y
ylabel(moving); % 为Y轴加标签
0 v" M, g% J" B6 r6 O* P C' B legend(加噪波形,平滑后波形);
0 S5 M- x9 q/ q. n# `3 M" T 
' B! M; L& n& x/ m6 l 【方法二】 6 r% t9 {# [0 p7 G/ M- w1 e
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
7 ?) U1 r) G. v2 S' [3 B yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 3 A8 r0 [- J2 Q# Q
figure; % 新建一个图形窗口 . }: H0 I! A0 _2 k8 S* U J
plot(t,y,k ; % 绘制加噪波形图 8 k6 `- ~/ {0 `% E4 B
hold on;
! k) p6 B" O7 F) r! M plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
% F- M/ @4 F9 G# C6 c3 M xlabel(t); % 为X轴加标签 8 i' B2 C1 I! G) |3 \- u
ylabel(lowess); % 为Y轴加标签
& q' z' ]5 G% n9 [% Z. }& K legend(加噪波形,平滑后波形);
# Q1 c; v# e' r. R- Z 
5 z5 z7 {/ T6 k1 ~! S9 Z 【方法三】
3 o) m0 N' X/ f( G- f) X5 H 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 , E+ b7 E. C3 f! _3 s1 ]
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
3 V: O6 b, H! P3 D figure; % 新建一个图形窗口 $ I2 e$ }- A9 @
plot(t,y,k ; % 绘制加噪波形图 5 Y' u; [3 u' t. }2 ^
hold on;
4 N" I: J# {( o$ Z3 [3 Y plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
- A$ }' v6 k9 o* x. G& V xlabel(t); % 为X轴加标签
3 C. P: r8 ]% `5 { ylabel(rlowess); % 为Y轴加标签 & [: T9 K1 A/ A2 A
legend(加噪波形,平滑后波形);
' ^; [7 A! u3 k8 }" P 
: z. C2 w4 ?$ n# Q1 \1 D 【方法4】 3 J. \; ^' G0 x! C( ]
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
% s2 G4 m v: N: O3 g8 k" L! \ yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 0 B; G$ ^7 _: V. Z0 j+ |
figure; % 新建一个图形窗口
3 J& N: M2 ^6 a: S plot(t,y,k ; % 绘制加噪波形图 ! p- M, v* s9 k; m/ N/ C
hold on;
9 x2 ^/ `( @/ @# A9 [$ w' L; U plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 : c+ }! n/ H% E7 @( ~* v, E; h
xlabel(t); % 为X轴加标签
5 H3 }6 B% H/ a' i4 Z3 z1 | ylabel(loess); % 为Y轴加标签 . f7 K9 |0 n) ]6 l3 q" u1 p
legend(加噪波形,平滑后波形); + e- R# @/ P6 d; B) f" M2 e( ?. j

. z0 m& ]) |: b3 d7 q6 s 【方法五】 ( Y0 a, E* S0 J1 X9 s) y) w! K" c: e
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
4 s" J1 M2 S- M& P. C0 | yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
( M G+ Z( A) A+ H) E, o) y figure; % 新建一个图形窗口
: d# r: t5 t# n4 E+ j plot(t,y,k ; % 绘制加噪波形图
9 ~. U9 s; h+ Y: D9 H6 f hold on; 4 c% e* \- T+ w7 [& `
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 5 I& a9 E' q7 q* {* p/ b% G$ T
xlabel(t); % 为X轴加标签 & M5 D- T2 B Q+ T- F9 M
ylabel(sgolay); % 为Y轴加标签 . b2 ^1 I/ R+ S* ?8 M$ t) [
legend(加噪波形,平滑后波形);
) x! ~) p t7 V& x/ i  9 }) {+ L( o) t1 c L& K; p9 a
2 g4 Z/ K# p8 i9 [. I
( F; C; L0 @8 [1 a) p: p: n% {
/ z0 V9 y$ U/ K2 w9 `6 B& M7 a! G9 X; }' ]
|