|
* Z3 A3 R$ a8 R! E- y) b) E 如何使用Matlab对数据进行预处理
1 p) P" D% q" I" w M9 p 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 : T0 a3 b \2 e# y+ O2 ]' X
1.1 smooth函数
! g$ P& f& [- ~0 t Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
# P0 y& Y, z. D* { 1)xx = smooth(x) & X" p3 A. _- G4 C' h! n6 U! a
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 3 L/ z2 z7 t ^4 Z+ i/ f5 T6 `
xx(1) = x(1)
& p3 @ N1 L6 B6 r$ R% U xx(2) = (x(1)+x(2)+x(3))/3 ( d* g% k, K0 \8 ?$ \
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
( c# J, } m( U" L xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
; h9 o2 v. k( N xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
% U* L F& X& o6 a {4 Z% m 2)xx = smooth(x,span)
" o# Q2 p/ p( m8 z 用span参数指定移动平均滤波器的宽度,span为奇数。 O, }8 s: \9 g0 O. a
3)xx = smooth(x,method)
# v2 y5 L$ y J4 {" ^ 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
5 u( ^4 s7 L6 O) x1 a S 表1 smooth参数支持的method参数值列表 c2 J9 i# t" S9 j0 F
 8 \; M' {% j+ h- K
4)xx = smooth(x,span,method)
4 e) F) z/ d$ c. I( r7 { 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 1 ^7 W, F" B) x* k& s3 r4 x- I
5)xx = smooth(x,sgolay, degree) 9 y3 X# t, H- I$ [1 C2 Z$ [- z
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 / ]2 g% `6 h+ }
6)xx = smooth(x, span, sgolay , degree) ) P: q \2 |# S, S% H0 }
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
5 c5 d/ J# m0 E- \' a# X 7) xx = smooth(x,y, ..) 7 d9 J) w! K C+ i' p
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
: j- ?; S H. H# M 【例题1】
/ x, X& h/ ~0 t8 v' X/ w5 F; E 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 9 h9 q) }# i b' P% d
思路:
8 b. q3 g$ D- b& R7 N0 l 1. 调用smooth函数进行加噪数据的平滑处理;
! N; l- n9 D; j/ k4 f1 I9 p2 y 2. 产生加噪正弦波信号;
6 K# C, E( H s! B/ R4 p 3. 绘制加噪波形图。
( I( ?" i1 j6 ]* u 解题步骤:
, Z- x n: y4 _5 L; u& h 1)构建数据 . V6 b8 x& D! D2 X6 r6 z, i7 ^
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 6 m& b& Q( s. L" P) P! W. ^; k
y = 100*sin(t); % 产生正弦波信号 ; P) w5 n; U6 m& O E g) N
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
1 c. S. v, w2 I* @* M2 s; n0 D noise = normrnd(0,15,500,1);
A1 T0 Z( q2 M$ N y = y + noise; % 将正弦波信号加入噪声信号
3 |, U( m5 K. z4 T, z 2)制作基础图 4 b# Y& I v1 W$ z6 }+ G b
figure; % 新建一个图形窗口
4 U$ R8 p# w" n8 Z5 S plot(t,y); % 绘制加噪波形图
. X( I2 E2 w+ s1 @. c5 Z; r Q! m xlabel(t); % 为X轴加标签
e7 b) B- a) {* |" F ylabel(y = sin(t) + 噪声); % 为Y轴加标签 + ] ?3 g' B& _4 G0 B7 _% N1 L2 Q

" K5 v" ]" c% Q8 Y2 I, Q' h 3)制作平滑波形图 : d' J) T1 D' X. d6 t8 l
【方法一】 8 S7 W; F) A' G* g* L* L' L
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 * k7 o2 w' H u, a2 o; W7 a( z1 w
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ) c+ D7 K S- F/ }6 D. O4 V. _8 }
figure; % 新建一个图形窗口
- _8 @4 `; _2 O) `( ]+ ~ plot(t,y,k ; % 绘制加噪波形图
! ^- ]% ^9 H& V! G8 Y y) Q+ U! \ hold on; ! J2 u' Z0 M2 G" @9 \( M
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 4 Z5 |' x3 s2 N) ?
xlabel(t); % 为X轴加标签 " y1 C6 P% @. v4 e# r, {
ylabel(moving); % 为Y轴加标签
" b3 e" o" I6 g1 z b( N1 n legend(加噪波形,平滑后波形); 3 Y! X# Z# L3 s1 w

0 |2 l2 i# R: B/ p5 E 【方法二】
6 y# j* g7 Z0 [* E* P) y: \ 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
+ ~% O9 i: M) O1 K yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
$ P% x- @0 x5 g; I5 f! p% J" g4 w figure; % 新建一个图形窗口
" d1 w; x: Q9 f$ X plot(t,y,k ; % 绘制加噪波形图 ) s# ^0 n. d, g1 \( g
hold on;
: r7 z7 a1 M7 |! c0 f plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 ! ^$ o" p8 F1 h! C5 l9 ]; Y
xlabel(t); % 为X轴加标签
" d: w2 D; }. S% r! R' e. A+ V ylabel(lowess); % 为Y轴加标签 : n5 O6 \* }2 ]) ?* t2 C5 D' i
legend(加噪波形,平滑后波形);
( X5 j8 c4 I& {% P 
& {6 ~' F6 Y2 P# B- F9 H 【方法三】 $ m5 M# ]* v. G2 {, r2 `
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
9 E- D- ^2 K* A+ _ yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 % h1 l2 T M6 b! U' ^ }
figure; % 新建一个图形窗口
+ F0 _6 @! f9 F7 b# } plot(t,y,k ; % 绘制加噪波形图 . c) V$ P$ v2 g% z
hold on; 1 k' L; a& J6 Z/ P
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 ( p9 k U) K3 l/ ?( K! A7 k
xlabel(t); % 为X轴加标签
8 |! M9 Q" K( q9 v* Q ylabel(rlowess); % 为Y轴加标签
9 ?/ m2 o V$ q0 ?" o legend(加噪波形,平滑后波形);
4 R) r$ a, _6 h4 L6 n, Y, S  ( x3 l$ J" E* A8 U( w/ I
【方法4】 ; s6 }) O$ l0 G8 p9 k+ k
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 - a# L+ Z& d/ O& N9 @* U3 @
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ; b. w; D; k4 \; u' ^6 ?+ j
figure; % 新建一个图形窗口 4 r j" Q& `2 z! c
plot(t,y,k ; % 绘制加噪波形图 ' P3 u! h! e' N
hold on; 4 H" L! i5 _7 O
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
8 W/ t0 B5 {1 V" W, I) s; l" h xlabel(t); % 为X轴加标签
+ Z2 W& V- E5 j, V L9 J ylabel(loess); % 为Y轴加标签 : p: k" k* D* R s* I
legend(加噪波形,平滑后波形);
5 S: _2 e0 Z9 C X% D% x 
2 m0 y Z! i6 Y# \) n0 B; x 【方法五】
. {5 O8 F6 G7 D! X! r _ 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
" R9 [6 v( h, F9 }" B( F yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
8 n6 G5 J; D# D figure; % 新建一个图形窗口 , K f6 F* d+ W+ G' A! b0 `. E
plot(t,y,k ; % 绘制加噪波形图 ( z3 R5 _" h+ S
hold on;
' S/ e4 d% M% q plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
- Q* v4 P# D3 d2 x3 i3 C2 p2 R$ y xlabel(t); % 为X轴加标签 : c$ t( @0 i+ ~4 z
ylabel(sgolay); % 为Y轴加标签 8 B/ O" P* @! }0 w+ Y# L9 H& k) H
legend(加噪波形,平滑后波形); ) u( l7 h( ~8 L1 A3 L

0 {* j$ q9 I) H+ F& P8 F
* _. k7 R5 L" X) q* X& g. A% ?8 T6 N8 a, D8 U9 [& F: L! d
1 X: G) o* i: w6 T- \& P
* k6 T4 Y: U! _8 u7 j$ T2 M |