|
0 t6 e+ P* r* Y* S; g( q
如何使用Matlab对数据进行预处理
( v' M8 Y" e5 r8 J1 R0 Z 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 0 ~9 P8 B4 A- z. v
1.1 smooth函数 ( o) W) q! ^9 _7 W% |' S7 u
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: ' U+ W x5 \' p/ ]6 d, w m( @
1)xx = smooth(x) 9 d' J4 v$ B7 }+ d' J' v! f8 [. ~
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
i$ ?. M* D- K S xx(1) = x(1)
- w. _6 W2 @ z+ q/ ^ xx(2) = (x(1)+x(2)+x(3))/3
* }& U( N; Q" k: c) `, G xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 & p5 S$ v5 P, A, m
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
2 @% |3 o1 m4 p/ [4 E3 k7 s% P xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
; P4 P" `3 c( v: G 2)xx = smooth(x,span) 5 \: B: p2 T1 H" Q3 h ~
用span参数指定移动平均滤波器的宽度,span为奇数。
9 A6 f9 d9 t) m# K* w, R" {6 Z 3)xx = smooth(x,method) 4 O' I. u6 u8 K: V5 W8 @' W, n
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 9 Z i; v! e# o4 B2 Y: w! _3 K
表1 smooth参数支持的method参数值列表 7 |& j2 B n* d: x. c

2 `2 \1 \8 f) l1 Y9 W5 N 4)xx = smooth(x,span,method)
7 K4 N8 C! U4 ^: {, E e 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
# G- }7 d) ^+ q) H) r 5)xx = smooth(x,sgolay, degree) . X$ |, i3 m0 B* C
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
: |6 I5 m3 @1 l1 X: |; ` 6)xx = smooth(x, span, sgolay , degree) / z; }! n" \" O& G) F- n
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
$ K5 n0 j- m% V7 y8 ^% Y 7) xx = smooth(x,y, ..) ) m* B2 M! m- y5 h0 [( }( a$ S0 {
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
' ~/ ?# P/ g4 z+ x0 T9 B 【例题1】
+ w7 e3 z" a4 k 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
) {2 j. }6 `; }" `, ^ 思路: & { c5 i$ ~5 ], b# Y
1. 调用smooth函数进行加噪数据的平滑处理;
, \$ ]" R F! l 2. 产生加噪正弦波信号; ! z" f H- q/ m9 A
3. 绘制加噪波形图。 1 P3 L# ~ @9 `
解题步骤: ! U, u0 p0 @. O7 P d
1)构建数据
9 }5 |. M& U2 _8 |- Y% q" t7 c t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
0 o* Z( q4 e' {, t5 ^4 p0 m y = 100*sin(t); % 产生正弦波信号
" N9 Q% X' H: Z! f q6 T: a % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 8 v0 P2 u, Q. j' l/ |
noise = normrnd(0,15,500,1); 1 l4 y' a( U7 J" h, p3 J2 P
y = y + noise; % 将正弦波信号加入噪声信号 0 J9 v& H3 f+ f
2)制作基础图
) p) I4 g/ D' y. }1 j figure; % 新建一个图形窗口 0 @8 Z9 U1 J! y* D
plot(t,y); % 绘制加噪波形图 + @5 B. L- n/ i: C/ w/ ]
xlabel(t); % 为X轴加标签 " K1 J8 _% S$ |+ F6 ?2 o! f
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
, N1 \) ~! H8 Y# L+ g! \( X  $ N3 B8 @ l2 a0 B0 S
3)制作平滑波形图
$ Z' H0 U- s- r' u' c3 C2 [. Y 【方法一】 ' _4 O- g9 g* E
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
7 i, k; k+ _1 K" e* r; @2 D" F yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
; ]; c q- Z* c5 C& u0 B figure; % 新建一个图形窗口 ! m" v- @/ f. h: K2 I* ~4 H4 y
plot(t,y,k ; % 绘制加噪波形图
* N0 s3 f7 z" l hold on;
# S, X; q* n# f9 w plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
' O8 @0 _6 `8 x. N$ \ xlabel(t); % 为X轴加标签
) Y$ o* h1 t0 t, K4 ` ylabel(moving); % 为Y轴加标签 & {3 o/ D. M$ _. R1 N1 k2 r# h
legend(加噪波形,平滑后波形);
1 I! I# w# V6 m2 D% S7 t! E0 Q" t 
1 N( g& ~1 X% q6 l* W 【方法二】
6 G- f1 T) ?8 S% u4 \8 o 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
7 P0 I- ?6 j+ e. [/ z5 Q9 B3 O yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
7 ^4 Z3 b9 A9 k! b, l6 ^ figure; % 新建一个图形窗口 3 z4 ]2 v/ [7 Z- b
plot(t,y,k ; % 绘制加噪波形图 2 L6 x# X6 a, X" ~5 L
hold on; ! ]' s# W. Y, k7 w
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 4 Y3 k3 m+ l3 }. x: r( Y$ i
xlabel(t); % 为X轴加标签
% g% Q! W! m4 f* \$ _8 \7 } ylabel(lowess); % 为Y轴加标签 9 J2 J" B$ T8 }& ~' c' s
legend(加噪波形,平滑后波形);
8 {& e9 F# ^, d# H7 i  , s8 [. e! i) @& J: c, m& Q
【方法三】
: U' g0 k1 W+ I* R+ u9 e* L 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
/ ~9 [9 g6 W: `/ O- }7 |* K yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
3 h" V9 @1 Z: T2 I& Y figure; % 新建一个图形窗口 ; _7 f. p {9 S; y6 v1 M
plot(t,y,k ; % 绘制加噪波形图
. E [4 D9 `) f: M0 x7 V+ {9 U6 P hold on; 3 @, m. x* ^$ {- R, S/ M, O
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
: Q$ t, s) H# [) u% J xlabel(t); % 为X轴加标签
5 _& @! ?0 T+ I% A! m N ylabel(rlowess); % 为Y轴加标签 ; h) \3 l) {8 N* h. v1 y
legend(加噪波形,平滑后波形);
. M# p6 u6 H! ^( {" D' t! I0 \' Z( x  4 i, m, L( i' `8 [5 ^" p9 n. K1 n# r
【方法4】
) t" [- k% m, c5 _( M2 V 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 / w. ]/ d( `% R" r8 D2 N0 g
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 % s! b+ w1 |: N& C7 _- ?
figure; % 新建一个图形窗口
0 S! r3 q4 D. a( [# e plot(t,y,k ; % 绘制加噪波形图
5 {3 l8 e+ d5 ~& W b/ o8 v0 W) U hold on; ; g1 i3 \. Q6 b
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
' V, d0 O; @1 o xlabel(t); % 为X轴加标签
1 ~6 K+ l5 T! d+ x: I' Y0 V ylabel(loess); % 为Y轴加标签 3 L0 c2 G; S" I/ U% Q9 P9 w
legend(加噪波形,平滑后波形); 9 ^. @1 D# |. r

7 h2 x$ n0 s8 _5 r: U* _ 【方法五】
8 W8 ^6 ^* S" @+ R0 F 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 - Y+ X0 f1 W8 h% Z' \9 T/ ]9 ?, b
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
- P Q! D c% A# W8 k) W# D4 r figure; % 新建一个图形窗口
$ k2 }1 G7 T2 _; f! X) C plot(t,y,k ; % 绘制加噪波形图
& I+ ~# f- L( ]: { hold on;
! Z$ x# l7 ?5 m0 L; A# i) T! E plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 . x3 C$ S+ l8 b* V
xlabel(t); % 为X轴加标签 0 V) M6 G4 L* Z8 W8 S5 I: }
ylabel(sgolay); % 为Y轴加标签 ! v2 n0 P1 B; [6 H D2 m- {$ `
legend(加噪波形,平滑后波形); @' L/ u5 B0 J Y; C# P

% ?* ^. M+ T. \" G
" N: a4 l9 P3 O$ r
0 Y( C( W$ l% y3 i* E9 S5 K" {4 k, Q% T. `, s" A+ X
% S6 ], B5 E6 y+ T/ ~3 ] |