|
6 k7 C+ Y/ p% ~1 r' g O0 Q3 w% S 如何使用Matlab对数据进行预处理
% k; m- |; |3 ]' A) Z 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 8 Z" A3 i6 \0 p% P
1.1 smooth函数
. h @: C, S u, v. ]$ } _1 y, s Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: . O I% u9 k$ W9 S6 U- b( i
1)xx = smooth(x) 9 N7 o9 ?9 L, Y7 k# D
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
! j0 ^6 _, p' K2 t" S: b; H xx(1) = x(1)
0 m1 q% ?8 Z' \& f6 W5 N xx(2) = (x(1)+x(2)+x(3))/3
/ ~+ z% p! G" s) q xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 * z v5 n0 _) F3 v: U B
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
) k/ Z" r- @) z6 q. C5 Z, n xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
" l; W, p9 M( S9 O. V 2)xx = smooth(x,span) ! t) @7 T1 @* e! E
用span参数指定移动平均滤波器的宽度,span为奇数。 9 k; D# L. @: l; i8 B8 P
3)xx = smooth(x,method) 6 v" s8 C1 U3 e( F* p9 |) B1 o5 x
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: % a! j' B# V1 d. O, K# \
表1 smooth参数支持的method参数值列表 / F3 g* t& q' a1 r% ?) D

; ~/ } [& B5 @2 t; e 4)xx = smooth(x,span,method) # H& E7 n9 f$ x* O* W) a# z- p
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
. N/ j. F% n, H, Y9 \) A( m+ g 5)xx = smooth(x,sgolay, degree) + w" n( P8 C# H. M% Y: V
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 : G5 g e- y* {2 ^+ a- b8 b& G
6)xx = smooth(x, span, sgolay , degree) 4 a" u; k% w! s
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
8 c! r# |& V0 l# Y 7) xx = smooth(x,y, ..)
3 ]2 {: m' x0 j/ p& F( N( ` d+ W 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
, E$ y$ N% R" h7 Q 【例题1】 4 ^5 ?% U9 e' a% `8 z$ `
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
3 K2 }: r* A2 i3 u3 J 思路:
; H t( d( Q2 |8 | 1. 调用smooth函数进行加噪数据的平滑处理;
* ~/ `( |& U( A+ G# d. m6 K 2. 产生加噪正弦波信号; 7 E& G# t5 v) K/ I. g
3. 绘制加噪波形图。
7 M3 R, p) t7 }! `6 ~, @8 ? 解题步骤: ; ^; @: e1 e! s% o5 o5 N; Z4 o
1)构建数据 6 Y2 j* m& C# C
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
, _ r) n1 V+ }+ b" r y = 100*sin(t); % 产生正弦波信号 ; d" u$ d7 ^9 A9 V0 o/ g
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ( ?5 x7 j" l5 g* @ r# g
noise = normrnd(0,15,500,1);
" F( i4 N# Y" ~+ D6 s& k- x y = y + noise; % 将正弦波信号加入噪声信号
% \9 ?/ e5 T5 F: J+ Y 2)制作基础图 ; i' M ]/ X; z
figure; % 新建一个图形窗口 5 c6 \& a$ ^9 a8 h* F. f
plot(t,y); % 绘制加噪波形图
. P2 J* Q( I( n; W xlabel(t); % 为X轴加标签
+ d) p4 L, q# Z$ C7 u ylabel(y = sin(t) + 噪声); % 为Y轴加标签 7 P7 } b8 O: k- h3 l

4 ` H0 E! O$ T$ q7 X" A/ a 3)制作平滑波形图
/ _$ ~3 v$ G9 e% K* I, W% V% z5 ?: q 【方法一】 % e. F9 j" J' N# y/ R3 i
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 ' C# l o3 n9 N9 Z
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
: [0 [; S4 Y: }: r0 Z* ] figure; % 新建一个图形窗口 6 J* D! u B; u$ E3 `
plot(t,y,k ; % 绘制加噪波形图
- J) k# {1 g9 y5 B hold on;
3 e2 n, N* ^) n& X' | plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
4 G7 e& v7 z3 \) Z! V" U$ O: M! C xlabel(t); % 为X轴加标签 3 w0 ^7 w; I: v& W* P: c! T
ylabel(moving); % 为Y轴加标签
" @% ~+ m4 p2 Y# _' W6 {9 Q legend(加噪波形,平滑后波形);
) X, O7 |4 ?! p$ i* J 
' E: i+ c$ J, h- a* t+ [ 【方法二】 , d. `, ^. ]3 L8 ?
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
+ j3 r2 q# q" c2 Q' ]4 k: W yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 9 i0 ^8 O) M0 C+ b2 C
figure; % 新建一个图形窗口 , p/ w) ^4 V& [
plot(t,y,k ; % 绘制加噪波形图 0 M& Y( a M) X- u3 P9 G' S, u
hold on; ! @8 r8 p# @, O2 {( L
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
" o( Y. U2 R/ H, P6 \& d$ b# r xlabel(t); % 为X轴加标签 , S+ _# F0 v9 B" L& m3 @- S) T
ylabel(lowess); % 为Y轴加标签 - n8 U0 o2 h9 ~5 A' `* F4 w
legend(加噪波形,平滑后波形);
) o4 g, l% V. S f( d  . X! X6 u$ [% J% F( K6 |1 R' w
【方法三】
0 V) i$ [/ m% {& r* o! ~ 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
+ @$ D$ b3 G8 B9 z$ K7 Y& I2 U yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
* X" }* S0 n6 K8 o, \3 h figure; % 新建一个图形窗口
" d5 d* h% l( h/ H# @0 ? plot(t,y,k ; % 绘制加噪波形图 + o5 L1 t8 }: {
hold on;
3 j' Z- ?7 ?/ ]! ^% m* k- { plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 + b, o e8 Q8 D2 ?( R/ W) t& g! V: _
xlabel(t); % 为X轴加标签
# a" S. z4 H8 L. |( d; `3 z4 o* d: I ylabel(rlowess); % 为Y轴加标签
' P" O" v6 ]3 |3 }, Y legend(加噪波形,平滑后波形);
! ^) y) p5 w- R: ~" n* h7 Q( g$ T 
; C. B- F& z! j+ K 【方法4】
: H8 @# V1 }$ F2 V* L3 |! N) z 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 # K5 }) K% l$ t9 n z0 `
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 9 I6 ]. X. m4 m* h
figure; % 新建一个图形窗口 ) v2 ~5 T# f! O3 ? d8 d3 w
plot(t,y,k ; % 绘制加噪波形图 2 O! z' k% Q, K1 ]
hold on;
7 s1 T+ u+ [7 H5 k, n* [/ x plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 1 _! g" r2 W. \! r
xlabel(t); % 为X轴加标签 0 s) A- B# J- I. e$ B
ylabel(loess); % 为Y轴加标签 + O5 o: ?$ \9 }1 _5 {1 k
legend(加噪波形,平滑后波形); 2 Q+ p: J/ ?6 ~0 Y8 N: G- X- Q
 % k3 r: y+ j a5 W
【方法五】 9 ?" X O& Y7 O& b/ a, f8 X. f
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
; c+ f1 [( k4 q4 d( D8 L yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
9 g8 s& F1 ]' j: W2 h. V0 W3 d figure; % 新建一个图形窗口 ( a! S' u, Y8 C- I
plot(t,y,k ; % 绘制加噪波形图
6 S: |- r+ B( w& U! h% y8 ] hold on; 8 `' m( H' `* r, W
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 ; ^4 Y/ y) R3 g% \" [
xlabel(t); % 为X轴加标签
1 e1 \% F1 i( F# h% ?4 q ylabel(sgolay); % 为Y轴加标签 4 r4 o+ P2 ? C' n* u2 b- h% X
legend(加噪波形,平滑后波形);
" p1 A" S `( v6 N% K 
5 g4 m/ L- e$ J5 T$ T3 }
* B& P4 g5 S1 J5 E& e$ q P$ R& `# z8 A9 F+ A$ G2 V
, j) f2 i. ^2 h; G# {. v/ b7 V
# V' P, _! O. x- F& v* B# J5 U |