|
$ \8 N ^. M3 O) C" \5 Y% _ 如何使用Matlab对数据进行预处理 ; C3 e6 u4 @( T4 [/ }7 T, c% i
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ! |$ @1 ]: M: h' x
1.1 smooth函数 / B2 m" v: a9 Y5 d' `6 X/ T
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
! x# W( _7 b8 a2 S" {# t! _ 1)xx = smooth(x) 6 B5 w: u+ X! {6 T% x
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
$ V( R' G) x1 c0 A; j xx(1) = x(1)
+ y" Q" U w( Q% F xx(2) = (x(1)+x(2)+x(3))/3 ' P: `. s* C h" L' G
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 9 l6 e, r: d+ w9 v, t
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
* u! I/ W0 F, ] xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 - B8 |, {* C# j* X
2)xx = smooth(x,span) $ q! d d S2 F+ y
用span参数指定移动平均滤波器的宽度,span为奇数。
" k J4 g" \9 I x( y 3)xx = smooth(x,method)
& d8 p1 M, y2 M5 j! s& k$ u 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: : c$ R9 A# h; H/ l v* D) g8 I
表1 smooth参数支持的method参数值列表 ) J0 u$ q' ]3 O! k3 K4 F
 2 }+ K8 s! l- p4 P/ ~, f$ U
4)xx = smooth(x,span,method) % w* M2 L" o* s) {# `2 t; J' f" E
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 m- J7 s: O) w3 y" u: Z! T
5)xx = smooth(x,sgolay, degree) 6 {' U# |' N9 s; W
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 3 a- W! ?( |6 B9 v) k: v9 o4 U8 w: n
6)xx = smooth(x, span, sgolay , degree) 7 f0 m- F- m* Q/ _/ h' s3 z+ i; N) o
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
, ]# L' u4 w* Z0 l- Q 7) xx = smooth(x,y, ..) - R! Q! |: G" I% |% f
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 . L4 a! c" i0 k/ X7 D
【例题1】 4 _, P$ V5 W- r/ i& H
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 , i% m5 D; ]* t6 g, R P. s& ?
思路:
& x; F2 L* u9 b: N 1. 调用smooth函数进行加噪数据的平滑处理;
; {- ~0 |* E* g- Z* A U! `% k1 e 2. 产生加噪正弦波信号; 2 M' {8 U3 w2 ~* L. A9 j0 \
3. 绘制加噪波形图。 v p% e9 v5 W$ q6 c
解题步骤: 2 G2 |) T: e8 g$ D- T
1)构建数据 . T3 l% r9 p8 a. L2 t6 U: X
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 # `3 h6 Q1 X, B
y = 100*sin(t); % 产生正弦波信号 8 w9 \$ k$ L/ D' G) q
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
4 E$ l( }6 f7 Q2 W noise = normrnd(0,15,500,1); ! Y2 Z- H8 Y2 ~; O- x
y = y + noise; % 将正弦波信号加入噪声信号
) t! \* M* A9 O) m 2)制作基础图 / e" ?) y( S6 T2 n# u. E4 F* K* i
figure; % 新建一个图形窗口 3 o9 H6 I0 ^3 Q* }: @3 D
plot(t,y); % 绘制加噪波形图 7 p2 h/ E$ w! [( M2 s2 l
xlabel(t); % 为X轴加标签 # l' X" V4 Y) r# B( U
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 , u. Y' i8 M: T3 G8 Z

D/ o; g( c( X9 `' [ 3)制作平滑波形图
+ _. i- {9 [7 D: y 【方法一】 6 t: g9 Y( L1 O$ R2 C( q/ _ `
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
1 _2 |8 `) Y4 D* l( ]- u yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
. b+ w. }# J: I: F5 Z2 q; P figure; % 新建一个图形窗口
2 y: t# }% x* c' n6 f/ ?2 @) ? plot(t,y,k ; % 绘制加噪波形图
3 V; r, Y! p( J& h: R hold on;
8 S4 P8 }4 y+ }! M& z2 d0 M plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 9 a2 i0 H' d. c& g5 M: i6 k
xlabel(t); % 为X轴加标签
: l7 b5 u3 Q7 G1 T ylabel(moving); % 为Y轴加标签
2 w/ S+ K$ h8 K3 ~' h! ~ legend(加噪波形,平滑后波形); 9 S. h" m7 `+ @9 g, W: r: E

0 ~% ?% ]- }1 @+ m% e 【方法二】
/ g/ j) m/ L# ~5 p$ C 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
, D! B4 c# p/ x: z( y yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 + s& k9 X1 w/ `" A3 D" z
figure; % 新建一个图形窗口 0 \/ g+ O! x3 a9 H7 r
plot(t,y,k ; % 绘制加噪波形图 " X( A* U* h/ j. f3 f$ }' t
hold on; & G1 b: `7 p6 R* n1 y' R. k
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
) |+ R9 A9 z- D" Y% ? xlabel(t); % 为X轴加标签
4 {# E7 _7 z- t C7 \( e, W ylabel(lowess); % 为Y轴加标签
( D" Z* C4 d1 S$ P+ C9 e; K& {1 C legend(加噪波形,平滑后波形);
: [6 i0 X5 X; D4 x 
! P+ d/ d5 t% Z+ H1 z 【方法三】
0 z; Q; t: I( W; S8 P+ k 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
" Q. N- d- J; I" Z8 G/ }& r% C- E' t yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
' J3 k: N8 d$ v H- G figure; % 新建一个图形窗口
: v$ h& X5 D# r' v# T V3 N, y plot(t,y,k ; % 绘制加噪波形图
0 l) S% z5 I9 z, [ hold on; . Y3 x. |) s& H$ P- m1 i$ l* g
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 ) Q% g" T: v5 f
xlabel(t); % 为X轴加标签 , p8 ^5 _# m# H
ylabel(rlowess); % 为Y轴加标签
' i7 [8 c* E8 B legend(加噪波形,平滑后波形); 3 N4 i) X$ b. o6 E. u

! x }. y: }6 G+ O5 s4 P' f 【方法4】 # O2 J$ Z# T! Q* x N
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 ) v# W' L3 Y$ l' G& Q% S/ D! h
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 h9 ^+ D/ J3 c+ D; j! [
figure; % 新建一个图形窗口
5 L7 [0 P, N1 R/ o. G9 y/ k plot(t,y,k ; % 绘制加噪波形图
2 B% e. |$ \& `1 J1 O% w" @& f8 C: ]0 W hold on;
: |, h4 I; e$ f( u9 W" ?/ n plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 $ [7 ~/ w, y7 G. ~- t/ H- I/ f. f7 `: o
xlabel(t); % 为X轴加标签
- E/ j2 V9 [7 O) x% ~ ylabel(loess); % 为Y轴加标签
% y* @( Y. h4 p$ d$ g: p) y2 ? legend(加噪波形,平滑后波形);
( m' N) t# [7 f7 d" }! U  $ o0 {7 W- a" x: d% c* U' {) @
【方法五】
X) A7 ^0 K$ T9 p$ }5 y p& \! f 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 9 V. o5 I, j8 N1 r
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
: u0 m; u P' X" z4 `5 x figure; % 新建一个图形窗口 5 i3 |( H7 O" Z# z
plot(t,y,k ; % 绘制加噪波形图 0 R' C2 U& `1 Q x
hold on; 6 M# W( ]' s0 D# m& ?
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 3 }0 F5 g; N; v% Q3 N/ y/ `) ?
xlabel(t); % 为X轴加标签
) O: P Y! A0 G( T! Q. ^/ z! m0 v# x ylabel(sgolay); % 为Y轴加标签
9 w6 h" x2 x$ O4 j" f( ^& f2 ] legend(加噪波形,平滑后波形); : m3 [, a" h7 ?: F* _3 \% f

- Z/ ]' {3 @6 z9 f; l+ R/ i6 H7 g
5 Y( |. s" n2 S! x' `
) z y! t: r* M( y- K0 Z% [1 L3 L) h+ D5 {9 Y# D: d1 b" d$ u
, C: ?6 z$ {; p9 n
|