|
. C5 V! X7 M) Z X' E
如何使用Matlab对数据进行预处理 5 w/ J1 d9 l6 q
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
' J% w' O+ ` L8 X( x) D1 @ 1.1 smooth函数
( T8 q- m0 e, B* F1 O Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
! d c; ?2 d9 |4 i+ l 1)xx = smooth(x) 5 O1 Y7 A3 y( f P' b1 r
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 1 p d& {7 R3 {1 _, B
xx(1) = x(1) / X* i3 X9 U" u5 O
xx(2) = (x(1)+x(2)+x(3))/3
; J! Q9 J2 U& }' D- F xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
/ S' d$ C2 S/ ?9 m, [ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
) N8 E( k( j4 } xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
% n9 V, e; X+ {; [2 k [5 S 2)xx = smooth(x,span) ' W9 k5 g( y5 B8 v' Z
用span参数指定移动平均滤波器的宽度,span为奇数。 2 b, R% e2 R7 p* M& B9 R
3)xx = smooth(x,method) D3 f0 U" ~! W& f6 d! c, R+ ?8 X8 A
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
" D+ P& ~/ N& t3 Y 表1 smooth参数支持的method参数值列表 : g" F( }% z: I# Z4 {
 . H0 v5 L; P2 J# ~8 i
4)xx = smooth(x,span,method) - ^% d, c1 Z" J7 ~- N
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
# _& A9 t" |, v: R& b L' `+ H 5)xx = smooth(x,sgolay, degree) / z9 u* d) w! ]- M
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
3 A( G' B: u. z& Y 6)xx = smooth(x, span, sgolay , degree)
; p# W9 v8 ~8 N$ E- D5 t 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 # t8 H2 J; I! {
7) xx = smooth(x,y, ..) 2 x4 n8 U4 \6 v- J9 s( ? s( U/ ^
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 6 I$ } P9 G+ P% y
【例题1】 * E, z/ H8 L2 I* y! d b' D
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 0 f3 r7 o8 s- J0 \
思路:
1 p4 P4 Y; }0 T, S) x 1. 调用smooth函数进行加噪数据的平滑处理;
5 E8 E( D) J. `. L' i6 Y$ R1 \ 2. 产生加噪正弦波信号;
8 d, w" m* x3 Z7 h2 ? 3. 绘制加噪波形图。
" C. w$ _1 h! P \5 ` 解题步骤:
( s! ]+ \4 a7 ? 1)构建数据 , ^$ @. ? i" _: `( X1 k3 N8 }" f# J
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 # F! K. r: D, n2 c$ v' A
y = 100*sin(t); % 产生正弦波信号
a% h3 [9 H" b" S! Q % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 5 m$ n( E! O$ i+ ^
noise = normrnd(0,15,500,1); ! Y" N6 W$ l" z+ k2 ]
y = y + noise; % 将正弦波信号加入噪声信号
( i+ D- q4 G, f) R; Q+ B 2)制作基础图 + E7 `& a) R) I8 |2 N
figure; % 新建一个图形窗口
/ a! c( ^! M" M2 Y& k" x3 G6 r plot(t,y); % 绘制加噪波形图
( B* E1 W$ U6 W5 d4 g xlabel(t); % 为X轴加标签 $ @5 d$ \& N) i( @
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 8 g w4 s& T3 z. k+ |

8 R% Z2 A% d1 ]. Z. ~1 r- V 3)制作平滑波形图 - A) `0 S: ?3 h( f- @
【方法一】 2 e% k9 O: D+ x5 {& E
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
' v8 i' N. D0 t# M0 h yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
* I& B+ z) A) U2 ~4 G+ _ figure; % 新建一个图形窗口
7 x! ]: Q! k4 S% F. Y plot(t,y,k ; % 绘制加噪波形图
5 y5 p7 h0 W* K4 z4 F3 c! I7 C hold on;
6 g& R9 w* s! l8 G9 R$ F plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
2 |4 d7 H& _: a8 E xlabel(t); % 为X轴加标签
& c3 p. @% ?9 w) U" {" x8 I ylabel(moving); % 为Y轴加标签
5 T+ g( ^; M( N. T legend(加噪波形,平滑后波形); . d: `% n4 T2 _

4 Y" j/ I9 a6 I" `( u 【方法二】 % w P# }: d. z% `
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 ! t* O) Y# f- o0 @
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 6 I$ U3 w2 m" V) G" N& `) n4 j
figure; % 新建一个图形窗口
: O! A% h! d, X7 y plot(t,y,k ; % 绘制加噪波形图 " P7 y! G1 }/ v5 {0 d- T0 F- B
hold on;
2 t7 G6 j) V8 d! |/ V2 @$ |+ \# U plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 * z$ P! U) Q. v X4 s2 U$ U
xlabel(t); % 为X轴加标签 / b0 |, S- E5 V" i2 [7 O" b5 ]
ylabel(lowess); % 为Y轴加标签 3 O1 o3 z0 E& u {3 X$ C( E
legend(加噪波形,平滑后波形);
9 z% k; m5 C6 Y( Z( b2 M  U7 ^4 W# f9 h9 t0 c
【方法三】
% W4 J8 M/ m% @5 i 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
( S; ^& g. t* f$ w" t3 j1 H3 p+ R yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ( E' I- P& j6 q1 B
figure; % 新建一个图形窗口 & d* ~* I! D8 U+ j4 u1 c; _. i d
plot(t,y,k ; % 绘制加噪波形图 ! z/ j: s6 G3 u9 J* F w! k; A0 J
hold on; $ @2 l) B* S4 z! N! u! m$ x
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 $ `6 F& O0 l8 N( b) I
xlabel(t); % 为X轴加标签
( @$ z& l5 u0 n9 n; |; v: s ylabel(rlowess); % 为Y轴加标签 " U+ `* A/ p0 f! G! Q$ J
legend(加噪波形,平滑后波形);
' {; d B! x7 }, f$ {( k$ [5 I  ) i. W1 P& p$ s1 w" M, ]9 Z, E! e% u! d
【方法4】
) Y( r' C& N' E) V8 [8 G' n) j. N 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 $ | u2 [0 @) B- Z) m1 {4 ~6 j
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
. J1 {9 ? F1 x. G/ h5 g figure; % 新建一个图形窗口
. H( Q& q% ]2 w/ v$ a( N& t plot(t,y,k ; % 绘制加噪波形图 ( b5 r- W- F" D4 ~/ _5 J, x% e6 N
hold on; 4 C+ s+ \8 K9 [/ \- _
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
; @, O" _. c2 L xlabel(t); % 为X轴加标签
' y3 \ g* ?! i& a, p, k ylabel(loess); % 为Y轴加标签
0 T" |/ U( ]+ t% X; T% ] legend(加噪波形,平滑后波形);
1 d& h* Z Y: |* [, Y" ` 
4 V) J: C* N0 K9 a- ?: K B 【方法五】
6 G# F* h3 ?7 C v 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
3 @/ Q) Y, ]& y3 O1 ], B" W yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 0 C5 H; c* a1 u* g# N6 |+ H
figure; % 新建一个图形窗口 " c4 u' J. R4 o" Q4 {
plot(t,y,k ; % 绘制加噪波形图 ; M& \8 ~+ K! y1 S: U$ X1 |
hold on;
+ X$ x. Q! ?0 w2 E$ }; l T7 W plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 9 Z8 {9 I* L) f& f Y; L5 ^
xlabel(t); % 为X轴加标签 ! w3 g( s. G) ?8 b7 }0 Z
ylabel(sgolay); % 为Y轴加标签
l5 g9 o9 U/ z; n' M legend(加噪波形,平滑后波形);
/ c9 R+ d+ E- P% h; G6 i( A 
+ g9 W1 j# u P2 D. J9 O( p- \0 T+ F3 B
- h: s h' ~, u) m8 }& A! I" m" D3 g f" f4 ~) y. b
; G( V0 ~" c t! T* v% w0 w6 J |