|
+ R1 s( g E- m- _ 如何使用Matlab对数据进行预处理
/ s+ [5 l2 l4 n' `. f 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 9 |) {' q# ]0 V8 G0 g
1.1 smooth函数
' K. Z. K. E7 X8 `8 W+ i1 r Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
! ~" \* b- G; p7 c" e 1)xx = smooth(x)
2 u: c7 p9 N2 d3 k 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: $ M3 m; f% K$ o; W. y
xx(1) = x(1) . p- M% J& f0 O9 X K
xx(2) = (x(1)+x(2)+x(3))/3
2 w1 Y: u) b* C8 r. A' f; S) [ xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
$ P: f# N. p1 F9 ]' Q$ Q xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
$ Z5 f; T! g8 k xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
1 q" _4 Y0 s" Z4 I: q+ S2 W( i 2)xx = smooth(x,span) % S. \0 `7 o$ d- M) f! F
用span参数指定移动平均滤波器的宽度,span为奇数。
J0 B7 w, U6 e3 j, ^ 3)xx = smooth(x,method) 1 Q* z! y8 Q: o" v
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: ! P3 y& r$ X0 I
表1 smooth参数支持的method参数值列表 ; M+ L! p/ W$ r0 @5 H9 K! x
 * W) m; A( |5 C$ f, ]& Y, L
4)xx = smooth(x,span,method)
. S1 [) F9 {* |. c: M 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 ' D7 J' k0 t1 L
5)xx = smooth(x,sgolay, degree)
) L3 Q" E: c8 z* k& y 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 8 |, P' o1 S$ S9 B' \" q& n1 S
6)xx = smooth(x, span, sgolay , degree)
e* o' i2 d5 ?" `8 P8 t5 S& y 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 . z& ^$ F; i( F P+ _6 y3 }; c; Q/ U
7) xx = smooth(x,y, ..)
' a2 B3 u- w& q7 m 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
/ [" a( r1 \3 L4 c9 Z# l 【例题1】
: }7 E0 f* K9 z+ A/ H 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
# y6 t% @( j. Y! [2 m! W0 B 思路:
- t- C& R% F. s; _- } 1. 调用smooth函数进行加噪数据的平滑处理; , R/ t+ P+ {5 s( H, i q
2. 产生加噪正弦波信号;
# h, l- u6 L0 s+ o2 I 3. 绘制加噪波形图。 / H! X7 x% T1 f* G+ f% b5 n9 W( F
解题步骤: 5 s& t V( r* b7 S8 A
1)构建数据
- J ~8 o7 T( G( N( P( N9 \5 ` t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
6 k& I; _6 \5 _+ x5 d2 @ y = 100*sin(t); % 产生正弦波信号
. Q3 A9 n" z1 S8 W9 x6 d % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
. F! @% f3 }# K/ D, G noise = normrnd(0,15,500,1);
1 ~1 `2 T2 l* T) A y = y + noise; % 将正弦波信号加入噪声信号 / `- s" w8 R: v, m1 V8 @8 S
2)制作基础图 ; {" G% Q" E. c# Y
figure; % 新建一个图形窗口 2 L* i8 J. K% X4 e
plot(t,y); % 绘制加噪波形图
7 C' F8 F6 V D4 i) Y xlabel(t); % 为X轴加标签 4 N- Q' U6 |5 H' i5 E
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
' Q0 K1 T! D! z7 q! z  + m8 J# i- U! t& b, ~
3)制作平滑波形图 2 N. S2 |# ?. Y+ I0 f' b* J/ N
【方法一】 ' D8 T1 [$ _0 G. n
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 4 Z8 T5 v7 s9 ?; _, q! n
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 $ C/ b" Q9 ]+ L: A9 @
figure; % 新建一个图形窗口 ; _% L, f# f8 I+ P# j
plot(t,y,k ; % 绘制加噪波形图 4 i2 S1 F; N2 f: b4 i- v
hold on;
) |* b, n6 D1 Y& [ plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
+ V6 |' E/ y; N$ a4 A+ h xlabel(t); % 为X轴加标签 ) e7 l. v( U* D( b. i
ylabel(moving); % 为Y轴加标签 * @9 i% Y. w5 P% Y9 H w; `
legend(加噪波形,平滑后波形);
3 S% c! l) J# u3 H/ S# v  % J9 `& V: [& G2 P
【方法二】
7 A) _- V& `3 _& _) `# `6 u 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 . s! r W+ q) m' `& P
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
6 [, L7 p, D$ ?- R- F q/ i: i figure; % 新建一个图形窗口 3 n G0 M: C: Y2 b* m$ H
plot(t,y,k ; % 绘制加噪波形图 5 [7 Q6 d: r! q" U0 W
hold on; 9 _+ g v( n/ G& U1 f+ c R
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 9 ~9 c+ }+ y6 f/ h9 m" ^& U
xlabel(t); % 为X轴加标签 H* ]5 n" u( E
ylabel(lowess); % 为Y轴加标签
+ m0 @; K9 i' O9 Z( F" v" Y, B$ I" Q legend(加噪波形,平滑后波形);
1 c* ?0 |# o! Y! o }$ D" r  6 C1 W. V. }3 a4 [5 v w. l
【方法三】
" \8 ~% C1 l6 N( i h* d 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 $ i9 l# C* W/ I6 g, {8 I
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 8 U. k. \2 p. k: T( y% y
figure; % 新建一个图形窗口
- X- Z5 I/ h( o3 u$ t- L+ W plot(t,y,k ; % 绘制加噪波形图
- ^# i* k% N! |4 o! G. @ T, r% n8 b5 _ hold on;
$ U( e H3 B) I' `1 z9 k plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 - d; c, O2 n& E
xlabel(t); % 为X轴加标签 9 H6 `' Z [# [8 A4 ]7 z) f
ylabel(rlowess); % 为Y轴加标签 ' u' ^# C2 }8 s B8 I: ^
legend(加噪波形,平滑后波形);
1 t2 M+ Y% @: j9 W- x; I3 k2 z9 w) {  $ [ e( {9 Q8 K. k0 y8 G
【方法4】 % E9 h, u! E0 C
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 7 g9 q( Z5 K2 ~$ A+ t. x
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 4 {; F7 n, F$ d6 u
figure; % 新建一个图形窗口 5 G. f# @) a3 e1 _0 K# h0 D2 m0 j
plot(t,y,k ; % 绘制加噪波形图
0 R% }( o; n+ `( p a$ C! e hold on;
5 q3 @8 `; L4 T( i" ~* D5 t* ` plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 2 ~) D' s) U# G- u3 ]; A6 i
xlabel(t); % 为X轴加标签 0 _( k) ~& A5 F& x J
ylabel(loess); % 为Y轴加标签 ! j' O$ d5 @6 O5 b$ [3 G+ ^
legend(加噪波形,平滑后波形); 0 L, H% } {. O* W; c

: }1 M% H2 P2 J- C6 a 【方法五】
& |8 z( M# v7 Y# j 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 $ U7 b: m } a" Q: e( Z- V$ u
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
+ A% c2 V, L2 @% s Q3 l figure; % 新建一个图形窗口
# v8 | A8 V7 n8 \ plot(t,y,k ; % 绘制加噪波形图
$ z& Q$ Y$ b6 Y8 {! U& X5 P) e3 Z hold on;
4 B2 d; V) H j3 s& |; M plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
% r* y9 \; B3 j/ l3 |. _6 l1 S# v xlabel(t); % 为X轴加标签 / o& l. w4 X0 M
ylabel(sgolay); % 为Y轴加标签 3 @5 p0 x: H4 _2 v& J d7 s. _
legend(加噪波形,平滑后波形); ; F7 A- }9 B- E$ P4 Q- V

- h, Z+ f( p& b; H+ B3 I5 L
8 Q8 l+ q/ h/ [1 P3 i, d% M+ I& i c2 H F2 Y9 B
- x( R+ u" b- t6 C
2 s- h' n- Q- D4 i
|