|
6 W# ]1 @6 V9 q( C$ R3 t 如何使用Matlab对数据进行预处理 7 ?& S1 p: B# r
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ; i4 b. R8 l" S
1.1 smooth函数
! o/ s9 A @' d" B/ |/ @ Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
+ I N7 q, N9 E* x! B 1)xx = smooth(x) 2 s$ R/ v( @3 k' h3 G# g
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
( ]. I7 R- Z% p* ~: O/ D5 v xx(1) = x(1)
: D7 |6 u" y" ]: @+ ^ s3 @+ { xx(2) = (x(1)+x(2)+x(3))/3
! ^) e( U' f/ d xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
& l5 P+ n# [2 p7 @$ {* w( Z) y xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
9 X( O' |& B, ? xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 . \0 \1 X( n- d3 V! r B
2)xx = smooth(x,span)
& f6 C% s# Y8 s- s2 h 用span参数指定移动平均滤波器的宽度,span为奇数。 3 P) \, ]( F1 }0 n
3)xx = smooth(x,method) : m& d3 p8 I9 [$ ? X: Y
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: ' e& i) W4 Z2 ^9 E: Y2 ^/ H
表1 smooth参数支持的method参数值列表
8 F. d& a0 e# f- d" k k  9 s# r) U1 D) U" X% z* A
4)xx = smooth(x,span,method) / [7 G% {6 r& I9 ]; h2 ~/ f
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 / P8 O0 A* }7 a& Y% q, B1 Z5 p
5)xx = smooth(x,sgolay, degree) 8 P' t) ~2 A, p3 i& P9 Z
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 # X- m* G" J. @& T
6)xx = smooth(x, span, sgolay , degree)
" z8 T# I6 }; E! o9 { 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
8 C4 p, O0 Q/ m( k3 G( y3 f! }2 E7 { 7) xx = smooth(x,y, ..)
& k; k4 J3 k4 T! s5 f/ f 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
* V8 S3 b2 V% l! e! R( }: \0 U 【例题1】 " z. d: J* J! i( T/ p" C I' ]
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
) I) k5 n2 l2 ^) |$ {* } 思路:
) p% S+ P! l8 ^/ t3 L+ R 1. 调用smooth函数进行加噪数据的平滑处理; " y3 d' r j4 K- E/ B1 D1 N
2. 产生加噪正弦波信号; 5 Q% g: K' m9 t! ?! e7 K' K
3. 绘制加噪波形图。
3 ^2 ?9 w, u4 d2 h3 g0 A 解题步骤: # t. l, q# i2 m
1)构建数据 # L* m3 D T2 }$ ~+ i
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 " d+ U2 q5 |% L" V$ E* u9 w0 r
y = 100*sin(t); % 产生正弦波信号 6 Q5 T, }5 Z9 ~4 k9 l7 ], M/ z
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
; D# Q) V; \6 W: ?5 l noise = normrnd(0,15,500,1);
8 w" U7 x$ }& }8 j y = y + noise; % 将正弦波信号加入噪声信号 ! \$ F+ }) w3 p0 ^
2)制作基础图
6 ~; S9 `8 y' m3 V/ V figure; % 新建一个图形窗口
5 a( t- d X0 y, `4 }% ~8 A plot(t,y); % 绘制加噪波形图
; v4 |# A: V+ a& b+ h, n xlabel(t); % 为X轴加标签
* W! S4 C$ m! w ylabel(y = sin(t) + 噪声); % 为Y轴加标签
' ^( w+ J' f# y4 W5 d r1 o  : O5 C+ ~$ u9 I/ O/ B# E) e
3)制作平滑波形图
1 e. }3 D1 L: r+ b3 C 【方法一】
3 B- e) H1 O% w- `* O 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
m( O% L7 j# P yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
7 @' J: m% [4 a figure; % 新建一个图形窗口
. B: d& }' N2 v' O7 P) N$ t: p plot(t,y,k ; % 绘制加噪波形图
4 o9 W3 ~( Y6 b9 X hold on;
! f2 S- y+ |. ~8 H8 w0 ^ plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 $ A2 P6 Y/ U3 s
xlabel(t); % 为X轴加标签 * H9 X* }; @, o1 [$ H! S6 g
ylabel(moving); % 为Y轴加标签
% g, }5 D5 l/ ~) b legend(加噪波形,平滑后波形);
: b: z% s+ L( y! M 
" H. x/ S: E1 h$ @+ Q B 【方法二】 ! P1 k6 Y/ G z k* X
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 1 j X1 B( M+ w% K
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 3 o2 O& \6 x5 \7 T
figure; % 新建一个图形窗口
1 C( N9 A1 {2 G2 `$ }; w- k plot(t,y,k ; % 绘制加噪波形图 9 X: \4 a6 |8 ~3 y) _
hold on; 2 H4 x) s) a! @7 A( _) o6 s3 k9 T
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 ' [- o G5 |& N3 b/ l
xlabel(t); % 为X轴加标签 8 I/ m0 v: g( t
ylabel(lowess); % 为Y轴加标签 ' h$ U4 c3 m1 v4 b
legend(加噪波形,平滑后波形);
: w% N4 Y/ K" C0 y' _, W" ^* F 
3 k: d! `% w+ o$ C 【方法三】 & t7 {! O( R% d$ `' A0 B1 k" c
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
' u& R) c8 |0 L M4 d L yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 1 G. j" M% Q4 r0 _9 ~& k$ _
figure; % 新建一个图形窗口 g. L5 J4 i1 s; T( B+ u: @
plot(t,y,k ; % 绘制加噪波形图
' q; e# W, d5 G, j% O' Y hold on; 9 ~9 Q" Q/ r" J' [/ L z
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
9 y+ Q8 R4 S$ E/ p! v0 p xlabel(t); % 为X轴加标签
) i4 V2 {" }. w* {. I ylabel(rlowess); % 为Y轴加标签 6 r1 y6 w$ I( E1 [. s$ a
legend(加噪波形,平滑后波形); / C- e. x) t% i& p* M. b* l- R% l
 # m Q$ _% W; R8 w: p4 a
【方法4】
: B) s: h# {" l( X 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 0 A+ J/ _; i8 B; l* K8 R" o6 O
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
/ s2 g; Z; N, R6 H9 F0 V figure; % 新建一个图形窗口 7 N# _4 s4 B0 `9 u
plot(t,y,k ; % 绘制加噪波形图
0 u) I% G. t. C$ M- t/ e hold on;
- o/ J8 Z4 u& I h plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 9 i0 E c0 `; w4 V7 |& o) C
xlabel(t); % 为X轴加标签
6 q( Y; V/ s4 o$ C8 u8 B. \6 X3 W ylabel(loess); % 为Y轴加标签
3 Y3 }, ~1 Z$ f# f legend(加噪波形,平滑后波形); 4 k& H5 u0 g( E$ L$ x

: V# o1 O: t5 {+ N; u/ u7 ]; W 【方法五】 , Y# b" W( p: M. G8 V
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
/ Z- e" I2 b4 C: v5 G yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
. R: E3 I% u5 s8 |& T8 A# _, o, u0 { figure; % 新建一个图形窗口
' m* k' O8 _1 w. z+ t, @ plot(t,y,k ; % 绘制加噪波形图 ( S& g) K! U: @, A8 d. r" |! v, m
hold on;
2 r: g% t; ` P+ c1 H6 j3 r8 P: x* S plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
8 y! ~/ E2 O% N9 T# r xlabel(t); % 为X轴加标签
9 ~0 r5 o! p( u' `3 e. n5 \$ w1 S ylabel(sgolay); % 为Y轴加标签
, d- o; ^- h3 r( {2 u legend(加噪波形,平滑后波形);
9 J1 R9 q' r* X' C+ p; s 
% [/ I% b. ~# i6 p8 [) D* S) }* R1 K3 j
1 {5 h, A& _- ]- s3 L! P# w. w( a2 G
- X$ ~- K) [8 S: ~1 s
3 C, M, w# [) S0 }+ ]% c
|