7 w) O1 b" [/ v 如何使用Matlab对数据进行预处理
1 @$ @ p, P( ~3 _ 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
% ~7 p; D1 N: S' x' y9 V9 J 1.1 smooth函数
1 {5 n" b9 Y/ E6 Z* K Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 7 R- n$ [& l, W! e. ?" b
1)xx = smooth(x) 2 v1 Q% \2 ]' L! }6 U
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
) X0 Z) O, K# k/ {) G+ q2 m xx(1) = x(1)
( l4 ]- r2 m4 F. u5 _# F& R xx(2) = (x(1)+x(2)+x(3))/3 1 S, X3 J( ^; _9 s$ ^
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 3 @* D9 y3 ]8 \! b! k
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
- e* V/ @# `2 B0 j xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 u" Z7 P) T- I0 j( p5 o+ Z
2)xx = smooth(x,span) 7 l* t {) @1 A0 x/ A; Q/ r
用span参数指定移动平均滤波器的宽度,span为奇数。
; H- x8 L9 M3 | 3)xx = smooth(x,method)
" F# ~+ g, j( J% X- A4 K3 W 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
$ P: g$ K) v9 _; s" o i* @3 _ 表1 smooth参数支持的method参数值列表
2 N( g: B. B" R- Y( c6 R
9 k+ V& W) l; a 4)xx = smooth(x,span,method) / z0 [# u; F! j) P
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 % t" `" ~/ u& |/ ~" w
5)xx = smooth(x,sgolay, degree)
9 l, y, g3 z! {' q& k8 v$ q 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ! j9 L' O7 R% ? y, A1 N
6)xx = smooth(x, span, sgolay , degree) ! v9 M$ z2 W2 M" V/ X
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 & M6 q# Z& |. ~2 a# H: j
7) xx = smooth(x,y, ..) + v& r# Q" m8 y$ G( l& K
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 ! [+ o8 J$ `: ]
【例题1】
% l" `2 J0 j/ I7 a L) ]0 i$ ?7 I 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 1 a/ t0 x3 P6 V1 K1 G: K6 B
思路:
$ r% l x2 M4 ] 1. 调用smooth函数进行加噪数据的平滑处理;
w0 a2 M+ x5 A" M 2. 产生加噪正弦波信号; ' X1 M* B" M6 a M. S0 O
3. 绘制加噪波形图。
" [2 V) q& {0 m+ Z$ H7 U 解题步骤: / y$ D0 q" C& q, V7 X2 U; w
1)构建数据
/ G. E4 }& ] W t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
7 {2 U L8 D/ j+ G3 [- `2 i y = 100*sin(t); % 产生正弦波信号 ( ]" T$ b- v/ q1 u
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
. \- h% V4 v* F! X L) U7 j' _ noise = normrnd(0,15,500,1);
9 U# E+ H& Q9 N! [- F y = y + noise; % 将正弦波信号加入噪声信号
4 ^7 g' b' P/ C) a1 ]* | 2)制作基础图
U) v$ J" W2 _7 K0 u: G6 s: ?8 x figure; % 新建一个图形窗口 8 F0 t" K; _& x: m% @# Y A- M
plot(t,y); % 绘制加噪波形图 3 f# ?& Z- j5 C. g! f2 J+ Y
xlabel(t); % 为X轴加标签 3 p& N1 M3 A6 R7 q; Z. Y
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
% B9 m$ D4 d; G 3 i8 \/ ]) V3 Y9 z8 E, i" f
3)制作平滑波形图
; N* H0 x$ i4 l, c, t- \ 【方法一】
9 m# y, N/ ?3 z# Q 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
}8 }- f! D- p5 C. W yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 8 G' _3 {) A* h2 m2 H6 G
figure; % 新建一个图形窗口 : T8 }) o, Z2 ^$ ^, j5 c8 y
plot(t,y,k; % 绘制加噪波形图 1 G" o: C% i0 `/ ^# I% P
hold on;
9 O5 M) k* K% _" u; a! u4 X7 k plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 7 T. v2 K6 ?% @( @9 h8 Z
xlabel(t); % 为X轴加标签
c/ s; ~2 }' Z9 W+ Q' C6 Y ylabel(moving); % 为Y轴加标签 4 u5 \: o) n6 f8 H- f M1 H2 h
legend(加噪波形,平滑后波形);
8 V, w( {5 U8 X; H- n: F
% W, U$ E9 y' u% o 【方法二】
6 d+ _9 L: l6 R K* J6 f1 q* A 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 3 Q. F9 B5 y, R! S
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 6 H# _( m$ H6 q- I9 `
figure; % 新建一个图形窗口
; E/ G+ n1 }9 Y) {% Y: J$ {/ K plot(t,y,k; % 绘制加噪波形图
/ C7 g! o, G9 L hold on; 5 E- {6 ~* h* o/ G( h
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 , [' e4 }: |; |5 m1 c: v
xlabel(t); % 为X轴加标签 . m# K( S3 l0 v7 ~( F& ^
ylabel(lowess); % 为Y轴加标签 , ^7 {; h" I# s1 W# I3 G
legend(加噪波形,平滑后波形); 7 L4 W1 h' i3 J3 H) K5 t: M! ]
. [' }6 S* Q3 e$ B3 T# o
【方法三】 ~5 f/ }) n- M' R0 j
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
; T' J& I5 `+ v3 o yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
& d" x2 [# E5 x/ |+ k2 f figure; % 新建一个图形窗口
) R; O4 G! t" L) r: s7 A; L% G plot(t,y,k; % 绘制加噪波形图 s! ?" v3 i1 p- @9 E8 v* z. q) ^
hold on;
& ]$ H& S5 W$ M( s) _1 X plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
& \( h1 Y* B- R: J xlabel(t); % 为X轴加标签
C7 [0 e/ u E% K8 J" n- _ ylabel(rlowess); % 为Y轴加标签 " T6 W) q$ t, b- L4 I4 k1 J
legend(加噪波形,平滑后波形);
5 [7 Z$ s* M9 n, n
# H2 ` D0 ]4 a7 v1 `7 Z' w; ]7 D6 Y 【方法4】 * q, Q9 I9 q& i0 x J1 K% g5 X. N
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
?5 V) M- w+ C8 }5 C yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 8 |$ G0 Z& @1 D4 Z9 x4 ~# A
figure; % 新建一个图形窗口
7 H" k0 B0 {, e$ s9 A; W/ v; K plot(t,y,k; % 绘制加噪波形图
/ ^+ d* T, ?3 x hold on; - f, u% ^1 r8 _+ b
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 7 t3 s0 e* y' I8 ]
xlabel(t); % 为X轴加标签 ) {" B. o7 W( m6 R9 F1 X% }6 v) y
ylabel(loess); % 为Y轴加标签 3 N; b" E( T2 U7 W
legend(加噪波形,平滑后波形);
`2 \ l. s2 _. Q. F
2 ^7 f6 Z2 \* V# a2 U7 m J- f 【方法五】 . @0 A8 t! p% w- D. P7 p( |
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 ; y. I6 ^7 u- V
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
5 a; U, D; f0 g! T figure; % 新建一个图形窗口
% D7 C' r5 ]0 `! W( d plot(t,y,k; % 绘制加噪波形图 " g& S* @; ]. s2 j! M
hold on; $ H& l$ N$ [- `$ }
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
+ N& v% S) _; h% [# k) J xlabel(t); % 为X轴加标签
1 l; O3 e8 e/ e* t; n ylabel(sgolay); % 为Y轴加标签
; H; p( h8 y" T# K1 W legend(加噪波形,平滑后波形);
3 } a5 N% H) C! o / ]& [1 V8 [8 B& j5 g
& F2 I3 }* i' O" C( q8 u) i; w; z3 ]$ C$ p3 r* E5 o; M g" Q
' V3 F) _7 E3 J+ H0 H( R! }: X( L: H; P' @1 o) w7 ~ P
|