2 K! A h s/ x+ F
如何使用Matlab对数据进行预处理 3 `4 p5 l4 c/ q/ C& n; K& W
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ) l& ?! L* c4 T/ W" m* C# t0 Y D
1.1 smooth函数
1 I, F' d4 |8 z7 a Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
, R+ G1 c( n; b% F 1)xx = smooth(x) & w- {5 C/ S# G. w! t4 q8 E2 L
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: & w) X- |0 J" F
xx(1) = x(1)
" ?3 }2 N" T% U9 T" ]8 k; ` xx(2) = (x(1)+x(2)+x(3))/3
; E6 [ d7 L% @/ i; N" b xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
, [( s4 D! ~" F4 q x* P$ ~ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 / x+ n& {+ c) K7 W2 B' C
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 7 J+ H6 |9 E- F; `+ X9 @6 z6 T
2)xx = smooth(x,span) # d0 f! a8 i; P0 G2 e. y5 c' Z
用span参数指定移动平均滤波器的宽度,span为奇数。 / ?3 w! X3 S0 f
3)xx = smooth(x,method)
& R& A+ D5 m. }0 x5 `& D: F$ w 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: % F' f8 D# a$ ~2 a8 b, b& ?2 L
表1 smooth参数支持的method参数值列表 / h6 z7 ?, D L( O8 ^+ I
: K) Q8 I6 z" M) {5 |; C% T
4)xx = smooth(x,span,method)
; Z7 Z E& K! O+ b& s: y$ ]( T 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 ) j$ Z# l, ?* s+ n+ E& l! L- K
5)xx = smooth(x,sgolay, degree)
% \' a% |2 M8 d5 e8 }, E 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ) L" ~% b s* f: j7 n; K) {
6)xx = smooth(x, span, sgolay , degree) 1 D7 U2 L3 [* C
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
# Y. F6 h! i# N& S. U1 c8 ^) | 7) xx = smooth(x,y, ..)
; Q6 z; |+ d% T5 N! } 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
; G o! O: `+ r4 G6 T" t, c) h 【例题1】 * p/ P6 _- x, ~8 i/ A3 @# Y
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
/ x: o; r7 D0 B8 ^; L/ Y+ Y 思路: , c8 J( Y( x- j! x+ \* j& J
1. 调用smooth函数进行加噪数据的平滑处理;
0 P' [/ Z! V9 ] 2. 产生加噪正弦波信号;
; _5 q1 a/ S% |7 }7 x 3. 绘制加噪波形图。 6 B' [6 c' M. V% v# M% d6 I( b
解题步骤:
5 n) q8 [0 g, K8 [! q8 K 1)构建数据
, P7 `, E8 t1 g4 M, h, c/ E2 P t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
5 J, W E' _( P g, |5 a1 M y = 100*sin(t); % 产生正弦波信号
9 A* L* e7 M# M z+ H* y! W' N: ^! [ % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
% m3 p& D+ }! {4 C" K noise = normrnd(0,15,500,1); & ?6 g1 v% ~# S2 Q0 h1 E9 {
y = y + noise; % 将正弦波信号加入噪声信号
' v4 A* `- |$ ?' S9 Z2 b 2)制作基础图 . z+ |' C" J j1 h7 S% R
figure; % 新建一个图形窗口
5 b/ c8 K0 U& O+ g plot(t,y); % 绘制加噪波形图 $ q+ x* Z2 _9 O* v2 w
xlabel(t); % 为X轴加标签 1 G. |! d- l1 n
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 - x& e5 f" Q$ m# B
4 J$ O( M. s$ h6 d* { M9 z- j
3)制作平滑波形图 ! U7 r) e# R/ o8 y% v! f _" ^
【方法一】
9 i: ?. v$ C$ p9 l& G 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
* k8 g; Y8 k, l5 F$ l- c yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ! p3 U8 p! c; h( n$ O G0 c, u
figure; % 新建一个图形窗口 . |# s' P7 ~3 i/ _' H
plot(t,y,k; % 绘制加噪波形图 5 Q* k/ Q0 |7 V# X
hold on; " O* d+ b. w1 }$ K4 ^
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
6 Y% n! ]2 [0 g( |+ `/ r xlabel(t); % 为X轴加标签 : z! v0 h, g0 R" h
ylabel(moving); % 为Y轴加标签 8 A) w3 f2 p$ M) \
legend(加噪波形,平滑后波形); ( F4 J5 B* G! c
: O* Z; e/ Q. ?. P% k& J 【方法二】
; _9 D9 W& h& p% l0 A, S 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
G; N) w; n! R( ^2 M |+ i' M/ O yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 0 c8 w' N0 {( A! u
figure; % 新建一个图形窗口 & |* M. R* q+ {: M& v' u# L
plot(t,y,k; % 绘制加噪波形图 7 Z/ ] l3 K: O- v2 } V9 A- a3 F8 _
hold on;
2 y5 z0 i# m1 m, I' R' i# ^9 s plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
* s. T% F( \9 V' t; ?# f1 c4 Z xlabel(t); % 为X轴加标签 8 G, o$ r7 e: m _
ylabel(lowess); % 为Y轴加标签
`0 D, l. k$ f) t legend(加噪波形,平滑后波形); ' C1 j0 x2 k/ r/ B
$ N" N& A' o7 B- z( Q3 O: d" U 【方法三】
! p- S; m1 Y: I8 P 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 : q# w8 t, @" t0 M. w; g2 k
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
3 @/ p% o: o6 ]$ q9 V1 o figure; % 新建一个图形窗口
: \2 Q' S. E! t/ f4 q plot(t,y,k; % 绘制加噪波形图
4 `: b5 R- B9 H* \% B hold on; / W6 r& e4 [% k% z- D
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
: z$ ~9 u5 u8 e' l& |2 R$ O$ E) k3 V xlabel(t); % 为X轴加标签 : P8 _) E! q; i) a9 E6 @- A
ylabel(rlowess); % 为Y轴加标签 ! f: K5 R( r0 [9 t
legend(加噪波形,平滑后波形);
& j# P/ _$ o' x) u# H
5 M0 d1 X+ E% h/ i+ w 【方法4】 2 H( c. ~' l7 _0 b2 |
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
6 |6 ]& q3 y6 w0 @( R! k yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
, m( I3 e4 s/ c% ` figure; % 新建一个图形窗口 0 ]0 ]. f& T3 l1 z& N/ o8 H& ]# ^
plot(t,y,k; % 绘制加噪波形图 # P# t8 P E+ ]) C
hold on; 8 e; h2 U" d) C2 e1 d+ L$ W
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
) P0 [4 K8 k0 U8 Z9 { xlabel(t); % 为X轴加标签
3 D. `- y! V6 B4 p2 [ ylabel(loess); % 为Y轴加标签 + k. e) h: J7 O0 f3 _! W* c. R
legend(加噪波形,平滑后波形);
$ _( y( J+ I( p8 |& c2 ^7 n
# k. p) a* D, n9 Y7 t 【方法五】
+ t# i: @ c- A& Z* m( |+ N 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 . `- d# y6 l2 X G" }7 Z
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 : e: w- {& M- \0 V5 C; [5 ] ]- H
figure; % 新建一个图形窗口 ( W" ] M- n5 L. J. O
plot(t,y,k; % 绘制加噪波形图 & O/ ^+ V7 Y8 B$ p. {7 e3 U
hold on;
6 `* d0 D: h- h/ T$ ] plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 . N6 w) C3 ?* h7 s! Z, \
xlabel(t); % 为X轴加标签
m7 v4 B' E' T& K2 l6 P ylabel(sgolay); % 为Y轴加标签
. x' H% n# R$ N2 t& U- f legend(加噪波形,平滑后波形);
7 Y( e9 N1 _2 e4 ?/ v% @, H5 r 3 ~0 E& u( O$ h
: h: k7 U2 [' U8 i( K0 P# y& P
9 Q6 X( g' H r8 N% W5 z$ a; q
( k/ ^4 j4 O7 S1 @# Y1 e( q+ v( w* n# o! X. a L- b) z
|