|
1 H5 w6 i2 O0 L6 e! _) P7 Q8 n7 q
如何使用Matlab对数据进行预处理 3 {1 P* E: v4 d2 O+ z
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
# x; ~$ B, \/ O' u- X 1.1 smooth函数
% S7 @ G' K5 l" D; w Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
; o: {- X3 H, w: {9 m, m 1)xx = smooth(x) 8 x* O0 Q; Q" ^2 y" C
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
# i h- N- ? }1 W7 d4 l xx(1) = x(1)
8 X, [* ]5 j& ]2 R9 C. v xx(2) = (x(1)+x(2)+x(3))/3 + i8 b- g% u- t( L7 u
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 * K# f, b+ @% `9 g6 B, Z9 G
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
$ `) e4 M7 f( Y% p xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
. I2 L' c- {0 B0 V2 j 2)xx = smooth(x,span)
. U2 ~* r: J# ~& Y% P9 J6 o 用span参数指定移动平均滤波器的宽度,span为奇数。
4 B7 ~: H# R& Q: B9 ` 3)xx = smooth(x,method) ; r2 f; r% K$ D) T0 c
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: # G" _" J* K4 X+ ^4 \4 }! N
表1 smooth参数支持的method参数值列表 % e V0 L4 _1 Z2 _+ }3 Y

4 `8 z4 \" Y9 A- |2 @ 4)xx = smooth(x,span,method)
: a/ T M( J0 U, p; I. W0 {4 g 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 ; J3 N4 W1 C2 ~! @' F3 D( k6 D
5)xx = smooth(x,sgolay, degree)
0 W0 G8 K/ c5 o: c- @ 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
. W- v* l5 e, L% ` 6)xx = smooth(x, span, sgolay , degree)
+ ]- V1 Q; { D5 e6 A 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
7 y: ]2 F( ]+ _ f 7) xx = smooth(x,y, ..)
8 ~ A; a, ~+ p" ~! a* @ g 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 1 ]! [) v& W2 z
【例题1】 " d4 J, `# N# T5 R; A& I
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 # j5 a) O! w+ X
思路:
) X& r) L. v( T3 g; i4 v" u 1. 调用smooth函数进行加噪数据的平滑处理; 6 ` J' g0 i5 f* v# Q6 t
2. 产生加噪正弦波信号;
# R' K& I* u: i5 D 3. 绘制加噪波形图。 & y7 H. u/ n7 [2 Q: g. N, i( Q
解题步骤:
$ m8 B- K, u* W- k( \# O8 E6 A 1)构建数据
9 S3 G+ U7 [2 b9 f9 U* X1 B) r t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 / Q8 D t9 B3 _! y
y = 100*sin(t); % 产生正弦波信号 " H, m9 u% j) D6 F8 h# r3 I
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 I: ^7 v5 Z4 ?; g- N' ^. e
noise = normrnd(0,15,500,1); . S! E2 h! i" p* ?
y = y + noise; % 将正弦波信号加入噪声信号 $ T a% p; a) {" G* E7 n: c' q. F
2)制作基础图
' h1 b% G* @: u figure; % 新建一个图形窗口 8 \1 N& V+ q! B3 b/ p
plot(t,y); % 绘制加噪波形图
) T/ F& x2 Y& h5 h! t C4 j xlabel(t); % 为X轴加标签 9 m2 P+ @) g; V1 b) G9 o5 p2 |* ?
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
V6 {, E# {% r( r! p9 t% H 
3 Z3 @: |6 J& |' D: Y+ m3 v# L 3)制作平滑波形图 : \' c: l* V; j% b
【方法一】
' f" [' x" e) y' e% k3 B l 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
5 Z$ r: y+ _- l" m yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
/ Y0 k5 O8 k6 e+ d6 x2 S figure; % 新建一个图形窗口 6 x9 K# N: ^' i% [+ ]2 z z
plot(t,y,k ; % 绘制加噪波形图
3 }) }% e7 m( s0 k hold on; 3 {+ V0 ?( V. X2 n; Q
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
1 s9 w$ f; r) i3 \& W8 b7 t xlabel(t); % 为X轴加标签
* t7 I" j0 @5 t2 S ylabel(moving); % 为Y轴加标签
4 d1 n1 i7 w! x1 s legend(加噪波形,平滑后波形);
: h4 F* s, b# Y, B  # V2 z, G& G Y, I
【方法二】 9 H6 ~9 `! I# ]7 x+ c6 D! M
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
% q4 \: @" i6 [$ J yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
8 P N2 f4 M: Y( C8 D! N, t figure; % 新建一个图形窗口
2 g1 `0 A& X3 q2 m plot(t,y,k ; % 绘制加噪波形图
C/ `( Q2 s* m* e3 P- N- `8 ] hold on;
! Y& L5 Z {2 s/ |/ n plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 # J+ p" R( w8 S5 \8 W, q; ?* K
xlabel(t); % 为X轴加标签
. F/ E3 \/ Z4 N0 `1 c) x ylabel(lowess); % 为Y轴加标签 ' c, f% `/ V4 b
legend(加噪波形,平滑后波形); + R4 u3 \; v0 g: Z2 |9 Q: ]) s
 - L* f; ?$ Z' |6 L
【方法三】
, p* K! X+ _6 h8 r8 E3 K 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
$ V7 W- ~6 @" S& L3 t yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
& S% g$ D9 `& _) z1 M" p figure; % 新建一个图形窗口
1 I: }, \+ b5 ~4 R/ L/ s3 m( `. C7 j! o% a plot(t,y,k ; % 绘制加噪波形图 7 Y$ L' N6 S: }7 z& K6 R1 j
hold on; : J3 z7 F7 @( r6 m2 K; Z9 l) h# ~
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 , n2 c- X+ }# H' P3 q) I
xlabel(t); % 为X轴加标签
' ?& G$ _' c0 ` ylabel(rlowess); % 为Y轴加标签
6 h/ p' f5 ^+ W( i legend(加噪波形,平滑后波形); % \4 Y( a/ l; `4 K3 S. i, k$ @
 Z9 p& J ^/ C% s' C( b
【方法4】 2 v. }! l$ j' A& f: b; j5 |
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 ; B0 _/ g2 F* k7 i( O4 A/ k
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 + E& f8 D% E- K8 q' L7 ~( [
figure; % 新建一个图形窗口 3 ^: {& k* ?: k" C% n, C
plot(t,y,k ; % 绘制加噪波形图 8 e& O1 h7 M4 e9 e6 A; r4 w
hold on; , |; a0 F( Q( d( ]5 \* e6 K
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
# T4 e2 B% h, S, ]- V/ E; O* E xlabel(t); % 为X轴加标签
; P' d* v" T; f* G ylabel(loess); % 为Y轴加标签 . m( W3 b. \ b; O; \+ ? u; @% g$ T
legend(加噪波形,平滑后波形);
+ [- C2 \, W! K( }7 l  y5 C( A6 c# f. c2 ?" S: w. W; f! W
【方法五】 " R, v- F$ k. y9 d
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 ) f3 W0 I' s& X }( Y
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
* G: p& J, b' W) V# i% ^1 ]) V+ t figure; % 新建一个图形窗口 # k, u. p9 F" f- c P4 {
plot(t,y,k ; % 绘制加噪波形图
( K! c& K+ E3 W5 ]9 o hold on; % i2 m' ]: O K2 l
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 & B7 i: c7 b8 h8 E" [* G# ~3 B8 I& K
xlabel(t); % 为X轴加标签
( r- k% {: B# @# W ylabel(sgolay); % 为Y轴加标签 $ I+ x& Y2 i" w1 J7 ^6 C9 ]
legend(加噪波形,平滑后波形); 2 i, a1 H6 B1 F$ x& E5 m' k7 n4 y

; r! H! y, e7 f) w( H5 r4 B) s5 Y8 N* w; |0 B' e0 o4 {
1 w# `" U4 z" E" q7 r* j4 N. L6 k8 `9 B1 {* l1 G2 b8 l0 Y
$ D. C7 ~# r7 @4 s, {2 V
|