|
! _- ~- s/ @) v5 D1 H4 x
如何使用Matlab对数据进行预处理 ) n0 [; z5 f5 Q. Q' C+ b1 d
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 / M/ o2 Q/ e" n$ S
1.1 smooth函数
7 l8 U$ p( `& w( y& q( a( G2 S- [" w Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: . ]0 N' U; d) i! ~8 u% B
1)xx = smooth(x)
5 A1 d8 m$ Z$ v 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: + u5 W# y, [) i0 d8 h" y
xx(1) = x(1)
3 v4 j W7 W7 t5 S xx(2) = (x(1)+x(2)+x(3))/3
+ I/ Y/ Q* u8 A$ ~2 d5 X xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 / \# f; B' A3 ^3 P7 L( N W& Z, h
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
& R* d1 \; F: u xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 / F. o @" C& P4 Z9 u0 @. _4 ^, {& s
2)xx = smooth(x,span)
$ I6 w/ k8 N0 e2 k1 [7 |4 K9 B 用span参数指定移动平均滤波器的宽度,span为奇数。 ; K0 ]. M& ?+ _( g% w
3)xx = smooth(x,method) . r. @0 p, U7 n1 m
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
" J C, M' A6 }" {8 Q 表1 smooth参数支持的method参数值列表
, ~) ]0 M% g- X2 @( S 
+ {7 e$ h5 r3 B% } e 4)xx = smooth(x,span,method)
7 q) B- \7 G1 L# U6 x 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 $ O2 U p9 D' U8 w( w3 r# i
5)xx = smooth(x,sgolay, degree) 4 m l/ }! G9 w3 u5 I3 H- W9 J
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ; A8 i% k) G8 n: `1 I9 d' f) @" O8 t4 l
6)xx = smooth(x, span, sgolay , degree) ) X/ l& _. y: ]+ i, i- M8 O
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
4 l' H( N4 ^! O- s 7) xx = smooth(x,y, ..) 7 g( v5 D& s; W' @
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
+ y: [9 E5 v5 F 【例题1】
) L1 o3 }/ B: k" J4 O$ f+ { 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 / `, l, ?) ~" _- K
思路: 4 Y" v% P. M5 v* x5 t
1. 调用smooth函数进行加噪数据的平滑处理;
5 u4 U7 W3 M2 n5 j+ i 2. 产生加噪正弦波信号;
# S* Y5 Z4 L/ d. x 3. 绘制加噪波形图。 5 q$ [* G' _* |7 S, R
解题步骤: ) L, ^& x# |- H+ h
1)构建数据
3 j( L, S5 v) m: J t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 4 O1 \# e4 [# M" K0 J
y = 100*sin(t); % 产生正弦波信号 9 |( t; f2 M# r
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
* g* C3 M' Y+ p/ e noise = normrnd(0,15,500,1);
! M# u6 p. ` E! | y = y + noise; % 将正弦波信号加入噪声信号
6 u V3 Z0 L0 |2 H* h 2)制作基础图 : w- n7 L, E3 r l& L
figure; % 新建一个图形窗口
- ?7 W9 |9 U4 q6 b/ B- ]& L g& k4 b plot(t,y); % 绘制加噪波形图 + L) e- n4 G% P5 D
xlabel(t); % 为X轴加标签 # B) E/ Q6 A7 E
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 8 r: m+ x4 k3 ?" p2 M6 C

* _+ Y. g8 x( ] 3)制作平滑波形图 . F6 R- g0 w! X2 B6 U# U3 G# k* ^
【方法一】
6 [) d: {! {$ d1 B' N 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
, q3 z4 Q7 A5 J! V! c! B yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
5 e1 w) x% o6 R5 k; s% V4 R figure; % 新建一个图形窗口
6 c" b: I6 ]+ o' z6 B/ L1 @" U plot(t,y,k ; % 绘制加噪波形图
" m( O/ P7 I# x* [' {0 u hold on; % e( w5 X, z1 J
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
! C: \0 a2 Z: B, s xlabel(t); % 为X轴加标签
Y& o' r/ U4 Q1 q4 M4 l1 P ylabel(moving); % 为Y轴加标签
! Z6 Q" C. r r5 `- w; B$ J legend(加噪波形,平滑后波形);
4 z& d" j$ c! q1 Q1 x) i* } 
4 b$ P8 c4 q; u 【方法二】
9 `; b0 q: t2 e, _& w 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 4 K l- O2 L1 d3 C/ X k
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 $ U5 O$ T. g! f( C) X
figure; % 新建一个图形窗口 ) ]. I1 T( e! W: X
plot(t,y,k ; % 绘制加噪波形图
) R+ d% H3 o; B$ j- k hold on;
/ ?% k8 R. Z B9 x! p$ g1 @ plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 1 M4 e; w, e% R' ]
xlabel(t); % 为X轴加标签
2 n: E. l$ k( t$ ?, b+ q ylabel(lowess); % 为Y轴加标签 0 S+ Y6 ?8 D7 }8 A9 H/ `9 x
legend(加噪波形,平滑后波形);
- }6 l% e# o, E. N5 o  # X8 g& F7 N% ]2 S! ]4 Q# L1 s; Y
【方法三】 * X' M8 z1 D+ h3 p
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
; J! `# r& I# Q& y. V" b yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ' F/ p) p8 x0 U3 n u
figure; % 新建一个图形窗口
" P ]& J9 L) n; f plot(t,y,k ; % 绘制加噪波形图
" Z' Q u) V* N- ]: G9 O" Z# ?7 H' B hold on;
0 I$ f" q$ h2 ] }) L plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 7 h3 a! @) {2 w8 h0 d
xlabel(t); % 为X轴加标签
- A9 ~ J: X/ x' L3 ?% W, K! D ylabel(rlowess); % 为Y轴加标签
2 x o* T5 d) E6 H" N8 D X legend(加噪波形,平滑后波形);
9 S& I3 d" g3 v/ T! T/ x4 f  4 F V0 Q9 W- {& Q! D
【方法4】
& @9 M# {( s4 j# F+ q 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 1 A! @' @. @" D: |/ ~1 q, ?
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ' Z, H8 \' F( N2 A1 d2 w6 R& P x% c
figure; % 新建一个图形窗口 / l- t: R7 n, I/ E
plot(t,y,k ; % 绘制加噪波形图 * }* | n6 Q o, ^# L6 |
hold on;
5 \" ^6 k$ x3 W$ A plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
% k E( r& `3 L xlabel(t); % 为X轴加标签
- h5 `) E4 ]6 i4 A! l$ N ylabel(loess); % 为Y轴加标签
+ I% A( l( h" q" L6 w4 ~ legend(加噪波形,平滑后波形); 5 z0 I) v N+ L b# x- I1 r0 E
 3 O3 R0 Z7 H5 b! z2 r) p" G
【方法五】 q" _: {% J, g0 {
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 6 O8 R: p+ n" F1 @2 c3 q
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 0 p$ g$ s: R v. }
figure; % 新建一个图形窗口
, A9 U/ U' y B7 [- v6 Z5 e9 X/ m plot(t,y,k ; % 绘制加噪波形图
8 {3 x9 b: j( y, P( h% G: t hold on;
4 }% O. L( k! ]$ h7 c) i plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
" V' O1 Q+ x) W! s- G: j3 k xlabel(t); % 为X轴加标签
: w% a+ K. C L! t3 {( k ylabel(sgolay); % 为Y轴加标签
+ P2 F8 f' M2 }. f) p) u legend(加噪波形,平滑后波形); 2 N9 ]% U9 a% ]! D& \% Y! m

" g d+ h- P+ K/ b# {) D
4 z6 q3 r7 ]+ y% U: K2 N/ A! q& r8 O& a
7 b* q8 }( l+ R: d- N1 G# ]5 Y* a' f& i' g$ u
|