|
* p" k. _/ Q2 ~' p+ K1 z
如何使用Matlab对数据进行预处理
4 S, l8 d0 P7 L }. O% W# \; _2 F 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ; L0 o, V8 E' _) o3 H9 W! ~
1.1 smooth函数
* B" t3 A8 A# ~$ Y, O. W" L- j Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
: s; D6 k0 ^/ r: i8 E 1)xx = smooth(x)
; ~) G) _3 P% k2 q7 d- T6 v/ P# B 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
. w- {3 F3 O' I9 } xx(1) = x(1) * G4 q% y$ h+ @9 N5 l( H
xx(2) = (x(1)+x(2)+x(3))/3 ! `0 I% ?5 f+ {( Q. U3 e
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
l2 b7 v* ^8 ]" B" l xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 ! G: I, b5 I4 P$ I, m6 P
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 8 U7 `' A2 H' z8 {; t. X5 d; g
2)xx = smooth(x,span) - {1 z" Y. X. x: B5 ]+ o
用span参数指定移动平均滤波器的宽度,span为奇数。
& |+ M* x/ \# j# `& a9 q% m) | 3)xx = smooth(x,method) " u* |& S' r1 B5 }# v
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: / E+ ]+ K! k( u0 J
表1 smooth参数支持的method参数值列表 % |4 O$ C& j; p' I5 H3 U. Z& A

- A) e# k0 t- o- T0 D) n 4)xx = smooth(x,span,method)
- h6 \2 f' k+ W1 } 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
4 A$ i% L6 k. K, R4 Q% L6 X8 c 5)xx = smooth(x,sgolay, degree) 3 f: D# @* B) t$ R$ Y7 V
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
4 I8 z- s0 e2 i ` 6)xx = smooth(x, span, sgolay , degree) , ^5 n/ v% p4 M4 |* h& J
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 0 e# e$ B2 f. g7 Q" x
7) xx = smooth(x,y, ..)
! E) @; U8 q: E+ s0 A 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 2 ^- e8 R! n( s. _" e
【例题1】 3 m5 y/ E6 e- L
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 9 Y& y% Z2 {% R( Q* Z6 l
思路:
8 `+ [2 F. Y1 R' D! c/ q) w+ j 1. 调用smooth函数进行加噪数据的平滑处理;
4 r- v; K& x+ R) j( {( r0 K 2. 产生加噪正弦波信号;
: \) f: Q' h- e 3. 绘制加噪波形图。
$ ]2 C9 H6 `$ s1 \+ Q! j) t 解题步骤: ' C( a( o+ u1 q6 v! y
1)构建数据
5 |0 S5 Z2 a8 K: ^ E t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 / c, n$ Y0 S" [
y = 100*sin(t); % 产生正弦波信号 1 `& p. m2 Y0 V( U
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ( Q/ o3 Y# I4 ], Q! q6 i
noise = normrnd(0,15,500,1); ' f5 {; |, L2 x
y = y + noise; % 将正弦波信号加入噪声信号
0 _6 B6 T; p% I& m1 R 2)制作基础图
0 x7 x) m a/ J4 t" Q) F figure; % 新建一个图形窗口 ) P; h2 h% u7 B# x8 L
plot(t,y); % 绘制加噪波形图 - s2 D3 q- Y; o0 N- p Q- b4 {
xlabel(t); % 为X轴加标签 % r6 B# H- v- v4 z/ P$ C3 c
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 / H2 w; O. X$ k" Z8 d

3 P# A( _+ e/ _/ N! y& }( ?' ^ 3)制作平滑波形图 1 c A% I( {" A& u( F3 ?
【方法一】
0 r% ~2 K8 r" s0 i5 ? 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 9 ~: F; _# P7 X$ F/ @( d
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 % A1 `0 ^6 r: t9 T
figure; % 新建一个图形窗口 : y: j$ K0 G9 h
plot(t,y,k ; % 绘制加噪波形图 ' H7 f0 l# W$ V+ Y, c
hold on; D' ^' C0 ?# |
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
0 w1 q$ `! b* U0 I xlabel(t); % 为X轴加标签 ( i( f; J" J* T3 s
ylabel(moving); % 为Y轴加标签 ; C5 o+ H$ S' O" o4 W& }
legend(加噪波形,平滑后波形); + n6 |& L3 F+ L/ e$ x' U# p8 e
 7 Z$ I' R' }: }* b0 Z
【方法二】 , S( n+ I% ^& O( ]
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
; U" C! @1 W2 X. c% K yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
. |4 K# g0 L/ F0 }2 X figure; % 新建一个图形窗口
* i7 b: d7 \2 G. p% S7 | plot(t,y,k ; % 绘制加噪波形图 4 U0 H P- f% @8 x# a/ c
hold on; & y# j: S9 X( a3 V' Y
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 l8 C! l3 M5 n% o8 G$ i
xlabel(t); % 为X轴加标签
; P: G }+ Z$ y- y" \ ylabel(lowess); % 为Y轴加标签
, K5 H4 `2 P; H/ L- t! _+ u6 |# ^5 Y, j7 q legend(加噪波形,平滑后波形); 0 }1 r G) r O" l4 x; s
 % ?- O1 x& }' W+ a7 r: h; H2 K
【方法三】 : L! s3 t+ Q7 s* }6 r8 u4 ]2 k2 z B
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
C+ t j/ Y' p' Q' q3 R% e+ F. O yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
+ H. V; G! U" U8 p0 ]" P figure; % 新建一个图形窗口
4 Z, \% ^$ L% R plot(t,y,k ; % 绘制加噪波形图 " S! E' \: k2 { m
hold on;
# d1 e# D9 n3 u$ w" E plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
+ p0 I' n: g' ?* c& H xlabel(t); % 为X轴加标签 7 `+ X7 _% z2 R
ylabel(rlowess); % 为Y轴加标签 {1 t4 k" u6 V; H7 K8 l" q5 l
legend(加噪波形,平滑后波形);
6 K4 l- J9 E/ o; A; O) \# ~  ! F" W/ N/ ^. |
【方法4】
9 |# ?, i8 \9 d2 Y' d 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 ; N) A: d! N, D9 E* F5 P9 O
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 6 u: b1 p/ r2 @' o
figure; % 新建一个图形窗口 2 M% V; Z6 m- w5 A7 b
plot(t,y,k ; % 绘制加噪波形图 7 |$ f, t0 {7 c4 K5 d1 o
hold on;
( ?( Y) F3 S$ d- V& Z$ ^! L0 j plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 3 ^, H2 H1 I" F& v# U+ F; t( ^
xlabel(t); % 为X轴加标签 + b A; B) |( ~0 A! U, J: {. j
ylabel(loess); % 为Y轴加标签
: h3 H( t6 G* v( @9 F' Z b" v9 v7 ^ legend(加噪波形,平滑后波形);
8 `9 h7 U: c$ n! U9 K d 
7 _& z2 Y5 E* G/ o- V 【方法五】 / B# F) \$ u* U' K; p
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 - n2 c% o; T9 y9 `4 ?, X
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 H+ X7 z e" j( s* k1 Q- O/ n
figure; % 新建一个图形窗口 . P/ e, F& A2 |+ g) g
plot(t,y,k ; % 绘制加噪波形图 7 o7 S2 q' u( B q' R h
hold on; 3 |5 v$ R8 g5 ?- Z
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 ( B/ D5 {9 D7 D) ^
xlabel(t); % 为X轴加标签
, w4 X* S2 w# [& ~4 B u; g ylabel(sgolay); % 为Y轴加标签
# D/ g: W R( @- L/ C& J; Z legend(加噪波形,平滑后波形);
( Q1 t1 m, ]9 D9 X' E  + d6 t8 K3 V0 Y+ t% R+ n
2 C3 H1 t4 \/ G2 c
/ x1 q3 a# u( b, R4 U
6 P1 j7 x) o5 V. [; Y
' K; @' b$ q4 }
|