+ \9 m0 U I2 ?/ v1 v! V
如何使用Matlab对数据进行预处理 3 o4 |" U; o% ]) E
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
# y3 E: w3 `# D* r/ @6 V0 ^ 1.1 smooth函数
/ U* ~- V! N' a; v: _' ~ Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
* w3 ?5 t a7 v* A/ w5 ^% `+ Z* N 1)xx = smooth(x)
6 \2 M, m, L" e% R$ j- f) ]: S; { 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
& ]+ [' v/ a0 U xx(1) = x(1)
1 {! a4 l; _* _ xx(2) = (x(1)+x(2)+x(3))/3
; P& u. B) p) V! c1 f9 R2 ^- j4 ^% A xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
! B" A* {' Z" a% x1 e$ z xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
. x! q+ ~" Z0 l% e) q& L! o xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ) }' r' k# w6 @
2)xx = smooth(x,span)
! Q) s! p" t+ P/ G" d& r$ _ 用span参数指定移动平均滤波器的宽度,span为奇数。
& s' u( s/ d9 | 3)xx = smooth(x,method)
# G$ i% e5 U5 @7 c7 g/ K( [ 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
2 j* E6 `+ G) W) U 表1 smooth参数支持的method参数值列表 7 `- b. e1 D# X4 ~
; t; N: \/ s& F, e7 v 4)xx = smooth(x,span,method) 1 {0 [( p5 M. f: p% ?, b1 Q
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
8 P0 F( j: U: K7 m2 x 5)xx = smooth(x,sgolay, degree) / | }; ^% _' I$ [4 i; q! [ ]% H. `
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ' }: P2 g% H* e3 N. R W
6)xx = smooth(x, span, sgolay , degree) , q1 d& ]8 A( v
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 9 i5 y. K5 X2 M: K i+ J
7) xx = smooth(x,y, ..) 6 T& Q/ {; ]( `. J) B, ?1 K
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 7 ^ H; b8 g" Q$ m' S# L+ L
【例题1】 + y. y0 i5 O0 y; U8 F7 W
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 0 H' k6 f* O$ q( y3 i
思路: % g! t0 Z; e. V7 q: g9 v
1. 调用smooth函数进行加噪数据的平滑处理;
" ~/ A4 }9 ?' H h. R0 {: w' C+ `2 U 2. 产生加噪正弦波信号;
# v5 R) o3 | J2 M5 y; \8 j$ S 3. 绘制加噪波形图。
$ n Q/ @, N6 o8 | 解题步骤:
' Y/ ^5 y8 l3 ]- O) G4 P 1)构建数据 2 C u) ?% \: a3 ?7 r$ L* d/ ~
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 & s' v- m- ]' z; I
y = 100*sin(t); % 产生正弦波信号 5 k) g3 { r4 ^3 k7 o
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
0 q6 V9 i1 |1 s! F noise = normrnd(0,15,500,1); 3 M7 C9 z4 p5 x1 X( y, E
y = y + noise; % 将正弦波信号加入噪声信号 9 }1 L Q8 d1 L D7 p( [6 z
2)制作基础图
/ ^3 j: J: z9 b8 X; K figure; % 新建一个图形窗口
( T1 d; M3 y/ Q) G' F* _ plot(t,y); % 绘制加噪波形图
$ E" r/ s& W# k- I7 b. t xlabel(t); % 为X轴加标签 " `* L M9 d, J$ m8 _5 q7 m7 f" i
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 + @; }+ T! O/ o0 u* w2 l
S1 z) U/ |0 c( [" g. F; U
3)制作平滑波形图
! W9 g8 g8 e8 Y+ s2 G 【方法一】 8 }+ q* V. K+ E8 X
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 8 }, B; d/ I( t6 g/ @, B
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 3 F* i, A7 n: t0 U2 q
figure; % 新建一个图形窗口 & z8 x; X$ B% B. { T
plot(t,y,k; % 绘制加噪波形图 3 E$ _8 s5 E" U! ~ U+ t4 e
hold on; , a3 K7 B+ i& Y/ T! w4 N0 o$ K
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 ; A3 q- ^; e" B& f
xlabel(t); % 为X轴加标签
8 x2 a+ K& h" j4 n. f ylabel(moving); % 为Y轴加标签 & d& z* M( u' W
legend(加噪波形,平滑后波形);
! y7 w8 [) E& n8 P
6 p& t: y4 Z2 C/ O* L5 y) c 【方法二】
3 _" d% n: l( G, k) x- ] 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
4 c- k5 _5 D: s! r yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 8 c1 J% L# r7 D1 K! P
figure; % 新建一个图形窗口
T6 h; b+ h1 ?9 C7 t4 I- N) U plot(t,y,k; % 绘制加噪波形图 z4 K+ q' N, l. k) Y" n# p) `
hold on; ! l& V4 g: ]' s- x7 p8 g
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
1 M% n# b. `( ^" O3 e xlabel(t); % 为X轴加标签 1 N! `1 N6 q; w. \! e3 u
ylabel(lowess); % 为Y轴加标签 . Q2 H6 _" T* z2 k! u/ @+ Q
legend(加噪波形,平滑后波形); / i+ @- g2 O# b) H7 J! ~5 h( w. x! {
$ e$ Q8 z+ i! R" H' {, j' m
【方法三】
4 K" t+ w7 Z7 H" h 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 " o' t7 `+ t' X3 h7 N1 W
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 " n# ~; U+ y+ ` W3 Y
figure; % 新建一个图形窗口 . U/ d1 W, X& t6 F" x) ]
plot(t,y,k; % 绘制加噪波形图 + V N) T4 e2 Q9 O; w6 p5 |$ j
hold on;
/ k6 L+ y: p0 K/ Z plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 : g" r* s9 `- a
xlabel(t); % 为X轴加标签 . j) V- i% s- o( K8 b! `. E4 a& P
ylabel(rlowess); % 为Y轴加标签
9 ]9 |$ ?! z v( j0 t: D( z legend(加噪波形,平滑后波形); ! Q. m I. Y( l N
+ n+ e' w2 H% C$ H) \4 j' d2 T2 p t
【方法4】
! O4 V1 n; Q& n6 ~) T 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 8 k1 g1 ]8 P. p" B* I
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ' B# j/ ^) M3 _, t1 K
figure; % 新建一个图形窗口 2 y4 d! W! |7 [6 K
plot(t,y,k; % 绘制加噪波形图 5 G! h: q5 D/ w2 P$ r9 j" f) x9 c
hold on;
, P' a4 V- j: B0 I' \( s$ ?, U plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 * H9 ?$ d/ C0 f
xlabel(t); % 为X轴加标签
. K8 c3 H( D3 ? c; g ~0 J8 p ylabel(loess); % 为Y轴加标签
% e0 |$ H c( D) W legend(加噪波形,平滑后波形); + Q- D5 K: ?/ ~% \% l
% u8 n1 c1 ?! y# ]5 y/ K 【方法五】
! d* r. ]$ [" E# ?# {0 L 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
: z) B4 T0 A; I7 e yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
, L0 @6 L+ x: Y& z' G7 b& @ figure; % 新建一个图形窗口 3 L+ {3 h4 e' B7 ]
plot(t,y,k; % 绘制加噪波形图 , i2 U* f5 w7 s+ N) ^3 s: ?
hold on; ! a, @6 W5 I' A7 y. W a: @0 e3 I
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
, C" H% _4 V+ | xlabel(t); % 为X轴加标签
* J& d! ~! ]" R w& O0 W8 u ylabel(sgolay); % 为Y轴加标签
u3 f5 X5 ^3 Z) ]3 n/ ^ legend(加噪波形,平滑后波形); 0 N" Q! D) i4 g& W& }' s: B
- i- D% `3 A& L+ C4 _8 o
+ c. h9 {$ ?! [% L* v2 q( r- d3 O
" v7 p4 x+ q* O; j e1 S9 T( n; T1 v1 B
$ i$ ~! \: P9 n9 V$ G |