|
2 `5 Z! x4 B4 w4 b2 W$ H 如何使用Matlab对数据进行预处理
* T- [1 b: {! j1 K 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
3 k6 r7 J( _3 G. k" ~' s 1.1 smooth函数 ( ^0 Y& H# k, l0 T' L7 [
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
. w6 `, ^' ?# i }5 T 1)xx = smooth(x)
+ y7 N1 d/ |. ]7 | 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
) h; P% Q- I( s7 T0 ? xx(1) = x(1) ( _+ E, W. V9 K3 s' A
xx(2) = (x(1)+x(2)+x(3))/3 % E# Y2 b! ^4 ]0 }
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
6 d' c* s0 P' L0 o( l xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
2 S! d" A6 }& ~7 ? xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
$ J1 F, n" [7 {; y$ X5 G2 B 2)xx = smooth(x,span) . P9 _( `2 ^' D4 ^0 k
用span参数指定移动平均滤波器的宽度,span为奇数。 4 R1 ]7 H, W' l$ X6 j
3)xx = smooth(x,method) S# ?2 Y& M, K
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
& E Y9 r& b" t. x, r$ K 表1 smooth参数支持的method参数值列表
. W: O2 [: M4 ~4 S5 r6 U3 i1 {7 T  0 V/ A- t6 G' |. k( [; C& r" T
4)xx = smooth(x,span,method) , h$ i1 K- s( z2 B0 q+ T
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 * l8 c m& d* z6 x
5)xx = smooth(x,sgolay, degree) * L' W: q7 p5 ~
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 / _* Q! }: |2 P. M2 \3 `
6)xx = smooth(x, span, sgolay , degree)
7 h! ]9 @. w9 c( ? 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
+ y% Y3 o* S- C 7) xx = smooth(x,y, ..)
; f4 T, s/ v H% @6 i 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 ( ]5 G0 `1 I1 H' r4 I5 x# |* z
【例题1】 $ m# J& G% @7 Z" K3 H- w. @" F
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
' Z7 x! ^# b' v; o/ E 思路: + ^) I- K3 a) u" [" {+ F
1. 调用smooth函数进行加噪数据的平滑处理; 2 t( |6 M! D5 _& _8 b
2. 产生加噪正弦波信号; , D5 ?' H1 e( v C+ T: L$ t) M& ]
3. 绘制加噪波形图。 + L5 @: I7 {# [% E7 K: B5 l
解题步骤: . p1 ^- n' v0 e" P0 Y
1)构建数据
' U; I4 L E* y9 K8 k9 T t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
1 U# M7 L# L0 {0 }$ V3 P) ^, }% h y = 100*sin(t); % 产生正弦波信号 2 W- N1 C. U, _# B! K! F" Y) F4 d
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 0 Y8 n6 b2 l$ p1 O
noise = normrnd(0,15,500,1);
3 ]. D& q; ?8 [3 i( n' X y = y + noise; % 将正弦波信号加入噪声信号 4 t8 R1 o1 m6 e: m
2)制作基础图
3 \- \$ l6 A& a; b. T5 G( K3 x figure; % 新建一个图形窗口
# X8 H* x3 ^5 n D2 y4 z plot(t,y); % 绘制加噪波形图
9 ?6 b7 Y! ? |4 L xlabel(t); % 为X轴加标签
# t. s3 U& k$ @ ylabel(y = sin(t) + 噪声); % 为Y轴加标签 1 K' ]. j0 T3 @4 V5 D6 q

6 i: H, h3 H* ?9 F- ^ 3)制作平滑波形图
% R4 O8 K1 T( X 【方法一】
- w; ]8 F( ]8 B+ @ 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
; O) x8 m( B4 b# c yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 $ p3 j6 g; B5 s2 i
figure; % 新建一个图形窗口
, O! ?1 I8 ^) D0 F8 ~4 s- S plot(t,y,k ; % 绘制加噪波形图
) M( g+ b. B9 q2 @ D( U hold on; . I3 D, H$ t% H8 |2 L2 A( u
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
8 {) Z, o( ^0 f' x' s$ e- ^) U xlabel(t); % 为X轴加标签
' B! _' Y$ u9 k& |8 F! ^ ylabel(moving); % 为Y轴加标签
5 n R( f& }; Q- I' e legend(加噪波形,平滑后波形);
. @0 s6 {; Q, J7 c, x3 V% ` 
4 v* j: Q! B) P* T1 w8 W 【方法二】
5 A8 ?7 E' {) e 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 # ], D j4 p0 `. H7 _: y
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
. _3 g& w S4 r/ `+ B figure; % 新建一个图形窗口 : o0 S7 }. I ?! S' W. S
plot(t,y,k ; % 绘制加噪波形图
8 C' S# H* K4 r2 Q1 z hold on;
$ t( [/ ]0 k0 b- U/ m: Q plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
! w5 @0 @3 G* b: Y. @ xlabel(t); % 为X轴加标签
; Y. ^" Y5 k4 c2 M ylabel(lowess); % 为Y轴加标签
/ q5 {# o6 V1 K6 T- Q legend(加噪波形,平滑后波形);
+ V0 j, p2 J# Y4 o 
/ w) F0 R c4 N( K0 X. S 【方法三】 7 _8 L0 Q/ Q ?/ D- w
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 % Z# ]$ L7 l5 w T
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
" o- \$ `" c8 t figure; % 新建一个图形窗口
) [1 t% @; L& O! c% j' _; Z } plot(t,y,k ; % 绘制加噪波形图
# A# O- C7 B7 ^8 g( F) [% D hold on;
* b$ m4 w5 Z6 n& k1 Y9 x0 g! Z7 [ plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 % _0 {, }8 n% t" J5 C6 A. n$ \
xlabel(t); % 为X轴加标签 ' p1 j7 \( c1 _
ylabel(rlowess); % 为Y轴加标签 V2 ?: |, [. i1 q4 ]. ~& y5 X
legend(加噪波形,平滑后波形); a$ c1 k! ^5 j3 D. [

, d, r6 c5 e. ~2 \ 【方法4】 - h4 }% a' m9 a- u
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 ) m2 q- ~" E& r# Z" K4 `9 O5 f
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
4 a/ g7 e2 I3 d( g+ e, s figure; % 新建一个图形窗口 3 \' k6 T; G Y
plot(t,y,k ; % 绘制加噪波形图 9 S# p: e8 \2 W G
hold on;
, M8 a) P6 ^2 b& D/ c! v plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
) a3 s# c4 c5 g' S* X xlabel(t); % 为X轴加标签
, X- ^$ d: T Z/ |4 L ylabel(loess); % 为Y轴加标签 ) I" e \ A' L3 ^2 J# L
legend(加噪波形,平滑后波形); , s8 t/ _ K- X0 @
 0 d4 g. b/ w6 k) h
【方法五】 # g+ s1 e4 t, L
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 " _+ j4 J3 t0 D4 o0 c) |& |
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
0 i6 K; ?: F$ B- S1 U$ K: N4 j) r3 r: [ figure; % 新建一个图形窗口
( h, }: j+ l' L2 K plot(t,y,k ; % 绘制加噪波形图 }2 a* c/ S( }; X
hold on; % E4 {' B* o" V
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 - {) I, O/ B4 l
xlabel(t); % 为X轴加标签
0 d! Q6 J% r% v8 z5 L2 Q2 ? ylabel(sgolay); % 为Y轴加标签
4 x2 W/ d4 C% g5 W$ u" o0 V- ` legend(加噪波形,平滑后波形);
5 S3 R! q. X8 [; L; D 
( k7 s# h9 p- V2 C; o1 ?% y" J
+ E1 S l8 ? [. @8 Z
1 V& l# R5 s6 _( y }8 i) h7 @* B# d9 B7 G
, [- ?* N$ b0 q |