|
/ F2 \- y6 q! w) z 如何使用Matlab对数据进行预处理
+ q3 i. h# d# m 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
5 w* h( u) q0 R: f. y 1.1 smooth函数 ; `& p1 ?5 e6 [+ p
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 6 T5 i: t0 N( H2 w- b1 U+ Y
1)xx = smooth(x)
, x5 d7 {4 ?4 ^: _5 n; W 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: " O; V# N. n; |$ V2 a! D5 E
xx(1) = x(1)
1 p8 m6 t6 A, \6 R' o$ k9 [ xx(2) = (x(1)+x(2)+x(3))/3 ( f. M# S* l& X! r* o a
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 ) g" X2 f* }, G0 V
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
" u% `0 i+ a8 t+ g xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ) S9 H; A. p; m$ M. S- [' c
2)xx = smooth(x,span) - I3 a. t4 Z9 M4 b6 t1 Q/ \
用span参数指定移动平均滤波器的宽度,span为奇数。
4 K& R2 `; ?6 k, n3 w g) L8 Y 3)xx = smooth(x,method)
4 D7 Q3 A# Y/ k4 Y% y 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
, o" C0 e* h% Z7 s 表1 smooth参数支持的method参数值列表
- b- X$ t- Y% n" o 
5 [6 b% c* g: a/ e' I 4)xx = smooth(x,span,method)
/ |; I- f4 S5 k 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
( k; @0 K4 D3 Y* V I L 5)xx = smooth(x,sgolay, degree)
7 y& O' J4 e1 s0 K( W 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 - Q. c/ f3 Q4 e
6)xx = smooth(x, span, sgolay , degree)
2 k% k' z6 i' C3 y 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 ' G8 n# q! Q& a: {+ {
7) xx = smooth(x,y, ..) h' R: q& J: l1 a
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
L1 h2 L' o, L 【例题1】 % j( G; B3 v( Z* P. P3 r' }
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 6 ~$ W3 L4 l$ V( }
思路: ( ?( B6 q: L' G) B& U) n6 O
1. 调用smooth函数进行加噪数据的平滑处理;
0 f$ F* E9 z, t 2. 产生加噪正弦波信号;
: x- G2 y) z, O. t" b" u 3. 绘制加噪波形图。 ) V0 X# H6 ?! W' D0 D! h9 y2 G
解题步骤: 9 I& P* x9 i8 p' ~$ a: L
1)构建数据
P3 e& }0 ^" _! Q, ]. i$ { t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
3 Q7 ^; Q# Z7 G y = 100*sin(t); % 产生正弦波信号
& |' x" m2 C# s" q1 U& S2 ?+ A % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
$ I# f% S8 u- f( a \ noise = normrnd(0,15,500,1); " m% m2 T+ o; b3 f* ?
y = y + noise; % 将正弦波信号加入噪声信号
7 Q: h+ y- U9 Y. _. f7 n( ~( x 2)制作基础图
8 D' X8 |( n& F9 h figure; % 新建一个图形窗口
2 J7 @( R) r* H1 R9 b plot(t,y); % 绘制加噪波形图
+ ]. `8 y. a9 |3 c3 I( [. @ xlabel(t); % 为X轴加标签
" t1 Q% i7 O$ k; i ylabel(y = sin(t) + 噪声); % 为Y轴加标签 , B; s. \2 i* V: I6 v' |

5 J4 f9 _' S: W }$ U' Q$ L 3)制作平滑波形图 O" ~9 q) b/ l3 W0 y
【方法一】
' K: K# r+ K2 P# G, @0 m 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 ) y5 q6 |8 M2 s2 P# z( g
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 " i, w; x g, p8 d7 G4 k2 U7 h
figure; % 新建一个图形窗口
' L6 F; m4 v2 W8 ^! G+ X5 i: [1 E( B4 f plot(t,y,k ; % 绘制加噪波形图 8 e. w5 z0 n) z# z7 x
hold on; 0 d, z) D& u& r# k; x/ `
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
! s8 \9 c2 k) g7 ? xlabel(t); % 为X轴加标签
" E" @( l3 e5 z5 n/ l' s ylabel(moving); % 为Y轴加标签 1 D& ^7 o* Z' Y7 b. d
legend(加噪波形,平滑后波形); ( N3 H+ g! r* {9 ?
 ) _+ n/ | i: z3 K2 r+ U
【方法二】 X4 q9 U g6 K' w! A3 N
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 & I; @2 p# R/ H! D# O) U
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
" e, @0 ^$ o( A- W! ^0 h; t figure; % 新建一个图形窗口
/ o. B, P/ V8 o* z+ z6 l plot(t,y,k ; % 绘制加噪波形图
+ o% u/ R$ E3 k6 e hold on; % p4 R7 Y& Q6 j) T' ~) J/ K. z
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 0 r0 w3 y& K! I. \
xlabel(t); % 为X轴加标签 5 J Z5 ?% c4 F/ C7 d" q
ylabel(lowess); % 为Y轴加标签
" z) S" u! J" I6 h legend(加噪波形,平滑后波形); * [/ Q7 z z4 a* f
 4 r$ q: [$ i5 ^+ M+ g* A
【方法三】 , r& b* R3 o# g9 i( i
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 ! E$ J/ H5 B% N) u
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
$ [, j+ ^7 r) y, @0 ?3 r figure; % 新建一个图形窗口 $ c, [$ ?) G. e
plot(t,y,k ; % 绘制加噪波形图 $ z0 C# h7 A! C( P
hold on; 3 z# F' Y% A! ~5 X
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
; y! _8 K# j" w$ O/ E8 G/ f xlabel(t); % 为X轴加标签
- E% M' d' J. F4 D) q ylabel(rlowess); % 为Y轴加标签
% ~% }. }. h6 m f4 @ legend(加噪波形,平滑后波形); 9 |/ c3 C% x. o) _- l- D: O

+ v0 g* U/ _5 P3 j1 Z, o 【方法4】
m U/ |% h0 B& Z) a$ n2 K 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 4 a# x6 Z; S/ [8 l1 G4 t5 p) U& t
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ! ^6 \& }8 @4 H
figure; % 新建一个图形窗口 9 R" u8 V' u7 h0 ^% [: c+ ?
plot(t,y,k ; % 绘制加噪波形图
8 \9 r3 C) ]6 S6 {& W; H hold on; & t7 P2 ~7 C/ r# ^
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
# T% G- O- \, w, w xlabel(t); % 为X轴加标签
$ Y8 {' H6 h" j E- f$ c ylabel(loess); % 为Y轴加标签
4 e3 Y& I( Z" E8 ~! r7 r- e/ E legend(加噪波形,平滑后波形); % r, v# F! F" f+ Y! E. }1 X9 x

1 H4 Q3 J6 @/ h' j) t 【方法五】
% t8 @7 _% X% Z& T- c 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 , ?# J6 y; c; m. O
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
% [/ w2 m. d: T5 g( j3 [% v figure; % 新建一个图形窗口 K/ E) ?0 ^- L
plot(t,y,k ; % 绘制加噪波形图 4 [* J/ z2 b1 I. `9 O0 r2 g
hold on; 3 U3 O' v+ j" ]% g @
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 / p' V5 v j$ h G
xlabel(t); % 为X轴加标签 ! C" ~/ ~, M) N
ylabel(sgolay); % 为Y轴加标签 . D6 X# U2 v" @; e+ Q5 F" l
legend(加噪波形,平滑后波形); 4 s: f# J! X$ J/ [' v

) x: @4 M- R# p( X' C9 N0 l" T
$ F; t/ k! q5 T0 A! I- ^2 a) n; _) P9 H
4 d+ l t0 c: W! Y$ g. ?, F
* P/ e d. W% ? |