) |; q& F9 u+ X2 N& \2 t
如何使用Matlab对数据进行预处理 3 L7 D5 Z+ M/ W" {* T2 h
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ; f0 n/ k7 F. t
1.1 smooth函数 m( ?% v! g2 U0 `: [4 T0 l! b
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
, N' I/ q! b/ P1 p) n0 v 1)xx = smooth(x) : P2 x: U% p0 _9 r
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
5 x/ D3 B, S! m$ J3 }1 Z% ]" @2 F xx(1) = x(1)
( z3 p8 ~" X$ H( {) i8 B xx(2) = (x(1)+x(2)+x(3))/3 7 n; ~& o! I$ n, }' X2 p( m) o
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
0 W3 a T0 H" @7 G" m1 a6 } xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
# ^% C' q! b& u* E* ~" a. j xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
3 E0 f, ^$ R5 w' |# w 2)xx = smooth(x,span) 6 }; \" f( @% E2 x6 e$ f N
用span参数指定移动平均滤波器的宽度,span为奇数。
: @/ t! P: q5 k5 u. q; o h- q 3)xx = smooth(x,method) - l, a* h2 P" V9 y2 n9 z& X5 L. E
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
7 S4 j o+ @8 L. y 表1 smooth参数支持的method参数值列表 $ B: _5 @" p, ~% T6 w! D
, u z, P: c4 d7 E# q+ O! r. Q" W 4)xx = smooth(x,span,method)
4 v7 D; S A; ~0 J( x 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
; e6 M; o k, |5 G 5)xx = smooth(x,sgolay, degree) / D4 H1 ~6 T( d6 \0 o. m, {
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
2 J7 y+ X+ m" |- f 6)xx = smooth(x, span, sgolay , degree) - h7 W' z; s$ G3 L: R) @1 A5 f
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
4 Y/ v' ~/ \4 d& h 7) xx = smooth(x,y, ..) ! ^( R) o: F& c5 B
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
$ O- B$ [7 H# Z: P 【例题1】 ; U" u v8 n$ U4 r( w
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 * ^) O, O! @1 n( U0 ?/ H
思路: 1 [2 N' C( y) h* R
1. 调用smooth函数进行加噪数据的平滑处理;
/ w8 t: m2 r' S2 t- T4 @ 2. 产生加噪正弦波信号;
! ^9 K; A( B1 K% J! V 3. 绘制加噪波形图。 ! @' A, `" A- Z
解题步骤:
/ n% ~' a; E: c, K. s" M% K7 H 1)构建数据 + m7 J% m- l& G$ _. T
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 : W) q6 _- Y/ g( c
y = 100*sin(t); % 产生正弦波信号
: Z+ e; q6 T1 J! j. {& Z+ ] % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
7 S2 P; A, X8 \1 O, { noise = normrnd(0,15,500,1); : F1 [/ j7 k [
y = y + noise; % 将正弦波信号加入噪声信号 8 W% o0 c. y) }. p2 Y9 n
2)制作基础图
, u: v3 U z1 s; z6 a6 y1 \ figure; % 新建一个图形窗口 ( t. `! w, S1 T; k: @
plot(t,y); % 绘制加噪波形图 2 A& q" s) U: v6 w& M0 t) u1 \. u/ t
xlabel(t); % 为X轴加标签 O2 b3 B* _ n" ^0 c4 Q- ?
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
8 ~) p% `6 b" n1 J3 u/ M) E w6 z u
, a; @ d2 w4 W( D 3)制作平滑波形图
0 d/ o% u! {4 u* [ 【方法一】 ; F7 P4 u% Q( f% L) ]7 a z6 u
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
1 E' x1 \$ _. T# F yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ! w- m3 T0 }) @/ B% c
figure; % 新建一个图形窗口 : M' \) m8 `# G# v
plot(t,y,k; % 绘制加噪波形图 . \% A- F- b! j) h
hold on;
/ ~1 D' f% }/ h" ?1 Y! Y1 n plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
5 M' s/ W$ x. I, X xlabel(t); % 为X轴加标签
6 h5 b! e: y( R8 Y ylabel(moving); % 为Y轴加标签
8 v! \, l% [" U: ?9 ]: E6 H3 B legend(加噪波形,平滑后波形);
8 B0 D* F: G8 b4 d. Q 6 Z0 M5 A$ f" ?4 l
【方法二】
/ b+ B# x; l, `( p1 o 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 % P( y t7 ^; C$ K, M: C
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 3 P, z; S1 n' t
figure; % 新建一个图形窗口 ! |/ K. E3 ^4 m
plot(t,y,k; % 绘制加噪波形图 6 g$ T/ Q4 b! k- c" { l, B+ n
hold on;
w/ ^, w3 c* S y# K plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
8 J: }8 k9 z# A2 ^4 a# L xlabel(t); % 为X轴加标签 $ `1 O$ G" u! F' F& i3 S2 {' F
ylabel(lowess); % 为Y轴加标签
9 c9 Z7 F1 L+ C0 c3 T legend(加噪波形,平滑后波形); S6 F; T4 k. f) @9 I
# Y2 R) U' W) a
【方法三】
: _+ r) D, z* ` h- N 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 $ W" [+ ^3 a' y! t( h$ K" s
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 / b% [( y% f5 k
figure; % 新建一个图形窗口 ; B6 q6 k9 I( ~& @8 _) A9 T, H$ d
plot(t,y,k; % 绘制加噪波形图
2 U$ L4 w r) W( y hold on; 8 _! H& B( a( C4 |5 e y4 f
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
3 w' P( ~, P8 d) |$ i2 \, k xlabel(t); % 为X轴加标签 # N6 @( w# T; Q* S1 {& s
ylabel(rlowess); % 为Y轴加标签
1 F1 S4 }! j: H9 s0 [, u3 y: z legend(加噪波形,平滑后波形); 2 X, `: O9 K7 ^0 C
X8 v% y6 w% ~" [9 N
【方法4】
0 R4 q: c4 N0 m, z$ b 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
1 z- ~5 \$ [' `6 u$ I& v yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 * \0 C; `8 J1 w" N2 O
figure; % 新建一个图形窗口 ' X" C; B* V6 b4 W8 r
plot(t,y,k; % 绘制加噪波形图 $ I* b9 L1 C% _* y" K! n
hold on;
6 j6 E. w2 T9 y$ @ plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
( U5 j- n1 d1 w. m8 d7 y3 I8 l J xlabel(t); % 为X轴加标签
+ v7 Z4 p6 B2 V! y1 f* q) Y0 o# ` ylabel(loess); % 为Y轴加标签 1 g: \- T& F! Q+ D( s( ] K
legend(加噪波形,平滑后波形); % v4 g9 \( D1 L4 u
" ?$ R. C- |) d, O
【方法五】
: h4 D/ n8 Y$ K) I7 k) e 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
& G/ i2 a3 g8 }( V' Y3 Z& [ yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 $ L* W" `/ F+ r0 ?5 m
figure; % 新建一个图形窗口
; c* _- T2 @1 |' I" g- ]5 c4 ~ plot(t,y,k; % 绘制加噪波形图 : Z7 _0 a0 s$ P8 b5 z7 H6 D7 A" y# C
hold on; 4 x: l u! z2 Y0 t0 q2 p4 E! w: w
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 # D L2 u/ L8 g7 K1 V: n5 k
xlabel(t); % 为X轴加标签 - Z: h% l; J' l' x' v% V9 I0 Q/ K
ylabel(sgolay); % 为Y轴加标签
" S K7 @7 }; r legend(加噪波形,平滑后波形); 9 ], `2 g% p+ d, P& h- B& t
# h$ j! D6 r: g! R6 u2 o( [
8 o4 a) u) O4 g, E0 ]' Z# N- N4 q: H* J8 s6 e/ d0 o
" D& W5 t" m7 @& \; Q8 y& Q7 I4 C! ^6 K8 @# b0 ?
|