|
9 F( z5 d, h! d8 ~ 如何使用Matlab对数据进行预处理 ; d7 Q( ? B* X1 m. v4 o
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
* _* }- U _, v5 V9 k) h 1.1 smooth函数 8 p! A+ {; |/ { T" b1 O5 I$ q' ^
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
p( ~! n7 z+ v; d% c2 @7 q 1)xx = smooth(x) 9 S) E7 i1 C: D
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
, h/ `) x R8 [# b xx(1) = x(1) 3 G" G# v1 R2 D9 K* C; m# z8 _2 P
xx(2) = (x(1)+x(2)+x(3))/3
- u, ~% ?: Q" X2 e- T, A; Z xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 * t( p4 V: f# Z j' y' s
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
9 \4 _3 x& N% B4 r, n# R0 T" O/ l xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
) W6 `8 `' Z- n 2)xx = smooth(x,span) . e5 f+ f7 O# U+ t+ h
用span参数指定移动平均滤波器的宽度,span为奇数。 5 A; z3 p) A/ n# d' X
3)xx = smooth(x,method) & w4 O3 h; E8 _1 C4 c8 E
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: ( q: A+ i# j) O& L; e$ ]; A
表1 smooth参数支持的method参数值列表
: O8 F' Q, d1 _: h* P7 K0 K  " |5 `9 I: [+ A) t4 I
4)xx = smooth(x,span,method)
J* t" s: A7 H7 C" S& g) E$ w+ E* J 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 - n! A8 Y* q2 y# Z% T0 f5 E
5)xx = smooth(x,sgolay, degree)
2 g/ l' t" I- Z1 j# k 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
. _2 L4 K$ O, G Q 6)xx = smooth(x, span, sgolay , degree) % a# s; r4 z+ @- x& A+ ]3 D) y# J* \
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
" v& f6 [9 H% c+ j7 y 7) xx = smooth(x,y, ..) : u1 P( t+ r9 {8 \0 G$ H
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
/ D- _* }, S- m6 u- v7 u& ` 【例题1】 9 m. ~; m0 l1 D/ o. k' W
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 + b) T9 U4 O! h6 W
思路: " G9 l4 s2 E! e) @4 |
1. 调用smooth函数进行加噪数据的平滑处理; ; @; o, ^* C3 I; ?
2. 产生加噪正弦波信号;
3 |+ ?7 O0 ~3 I H9 N 3. 绘制加噪波形图。 % z" Q# K. d- j: C) J$ L- t* O/ Y
解题步骤: : m4 b- r# l2 E+ u9 C9 w
1)构建数据
! A# C/ C% _2 w+ }4 z9 ? Q/ E t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
8 `) N1 C1 t; H7 W9 M- v% k y = 100*sin(t); % 产生正弦波信号 0 d* C. O0 l1 \$ g9 w( j- I1 f
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 8 a0 M* j. f8 |1 P, j6 ]! D5 \( U
noise = normrnd(0,15,500,1);
0 {7 d2 }" Q5 } C$ P/ L. H y = y + noise; % 将正弦波信号加入噪声信号
$ x# O( b: t+ y) e1 c 2)制作基础图 ' a/ j9 h2 l: |! c F0 C
figure; % 新建一个图形窗口 & c- d4 ?( v' x; w1 B
plot(t,y); % 绘制加噪波形图
, C3 }% ^' x9 Z xlabel(t); % 为X轴加标签
% e7 u) ~! L9 x _1 l+ S7 a; Z, X ylabel(y = sin(t) + 噪声); % 为Y轴加标签 ! _) ^ r( e# v8 m9 s; K- _
 $ z* h! }+ ^8 k7 W8 k
3)制作平滑波形图 1 A8 {' f- n/ D. G8 I! b) b3 n! }
【方法一】
6 H$ J' [6 O5 N! c; \9 d 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
* [- w5 f" S: d3 j7 J5 `7 V- ?. f yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
) F# F/ Q K8 X. V, G" T+ h3 d" v) Z figure; % 新建一个图形窗口
* @6 \5 h# B9 j plot(t,y,k ; % 绘制加噪波形图
z0 @ O* A6 l, Y H. E hold on; ; E2 F: F/ \& T! J5 `
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 7 y3 m1 h( S6 `' y" f
xlabel(t); % 为X轴加标签
2 w7 L. e; \9 s; k- n3 m ylabel(moving); % 为Y轴加标签
/ G8 M( \( K# N! h% d# B9 Y. V" @5 b legend(加噪波形,平滑后波形);
# S# J8 z* E( r* S2 c# F# ^  . l* X2 n% Y0 ?2 @, F
【方法二】
! L, S. w8 [' A; w. X6 G! p v; _ 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 ) }, ]6 B- g1 l
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 9 g9 v' g' z0 S% X% a/ P
figure; % 新建一个图形窗口
% M) F1 L! o7 `6 U plot(t,y,k ; % 绘制加噪波形图 5 f! b* J0 S, k C2 u' e- `' c
hold on; : {6 `. W" K9 l2 E4 U m& l1 ^
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
, V9 r3 }$ Z) ~2 X xlabel(t); % 为X轴加标签
% w. B1 P7 S$ G ylabel(lowess); % 为Y轴加标签 / P) s4 K7 n5 E: B, q, S4 l; |
legend(加噪波形,平滑后波形); ! k" ~" ?5 \0 G+ f- {# ~; f- N

: U* L- q) x( T 【方法三】
$ R% S( X- Z1 E2 I 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 9 _! h" e( Q# z- ]* R+ W
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
: O; h5 z' t% p5 _# D figure; % 新建一个图形窗口
! Q6 ~: H4 r9 h: n) b# \ plot(t,y,k ; % 绘制加噪波形图 6 W: n5 T* i$ f% u: S% b4 N2 r
hold on;
9 l% g3 `0 ]% [% i' Q" ~ plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 S' k$ c( Q; F. S% M3 A8 d
xlabel(t); % 为X轴加标签
/ ?3 F! W, I8 ], M1 ^9 ^ ylabel(rlowess); % 为Y轴加标签
. F3 M( x! {/ j6 r+ c& | legend(加噪波形,平滑后波形);
' i. M4 Q c7 r" ^2 O, S m( w  7 Z1 x8 I% a4 Z% b1 `
【方法4】
! b4 O/ d+ ~# Y, q2 e; m 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 / c0 I$ z1 j' `/ |: y
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
* `, Y- S( { v: T6 D o" N6 B figure; % 新建一个图形窗口 / b$ ^1 I% K) k( z* X
plot(t,y,k ; % 绘制加噪波形图
# x6 F# k- Z9 \! J hold on; / N: X, A8 {% ?) _9 n
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
4 H; b2 ~& `1 H1 Q8 w5 F, R xlabel(t); % 为X轴加标签 ( u2 L( ^% `# @4 M3 X/ A
ylabel(loess); % 为Y轴加标签
2 Q. L8 e5 i6 L- u7 q( k legend(加噪波形,平滑后波形);
4 c0 P: B0 ~. U) g9 F# P  . h) n7 I& U; U0 J% j* _
【方法五】
$ P8 ?) D5 l7 g# K5 a 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
; q9 F( A- X9 r; G. C% n: `8 _ yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 % n: C& d7 ~9 m9 r3 s- O
figure; % 新建一个图形窗口
+ w7 f# {9 ^+ D7 y plot(t,y,k ; % 绘制加噪波形图
; U+ y9 o# Z) N; o: A hold on; $ T b+ T/ b" q, |# g
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
% y6 G" |4 g+ X( \# {+ | xlabel(t); % 为X轴加标签
2 ]# Q$ o. T2 k3 u$ s$ i ylabel(sgolay); % 为Y轴加标签
) Q$ Z6 y0 Z, V legend(加噪波形,平滑后波形); {( Y. U# N. {8 x, o

! e0 V. k+ P9 y2 A: F7 }: F
; I4 O( T3 w# X
! }9 _- u2 D0 S: Z. R1 x" w% C2 @
# t o8 o+ ^2 H" n: j
|