; s7 X4 R+ E4 h7 k; ]
如何使用Matlab对数据进行预处理
: S$ f5 e9 d- U( { 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 . w2 G' w% V! w4 V7 q1 D- f( W! `
1.1 smooth函数 3 m: n: Q* l4 g
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: , \9 e7 d- m! q5 _
1)xx = smooth(x) 6 a% G, Q, F; F
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: - l( j4 X& {; w3 Z8 p" s2 O
xx(1) = x(1) 2 K6 k, G3 W, r8 a: q5 u% q/ t! [
xx(2) = (x(1)+x(2)+x(3))/3 1 v l/ g# F6 w+ z
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 , `/ a8 j6 ] ` j/ {& g5 ~
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 + j3 E7 q5 X8 ^ H
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ) q! E1 p2 h7 f, b
2)xx = smooth(x,span)
$ F! _+ ~' b: C' ? 用span参数指定移动平均滤波器的宽度,span为奇数。 ! s, Q7 P, U4 x% n1 v! x; X8 V$ m
3)xx = smooth(x,method) + {# I+ H* |5 z+ P+ W
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
, d/ W, D5 _# {3 K3 Q3 c/ X; e 表1 smooth参数支持的method参数值列表 . u. I3 o8 b! V# }$ {
* s/ X+ m a k( w7 K g. m
4)xx = smooth(x,span,method) - ~; y `: r% R2 T1 j: |, g
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
+ `* J, @ J! Z7 Q5 ]2 }/ e 5)xx = smooth(x,sgolay, degree) , O0 F' z0 R" ^, g! B3 e, x ?) Z
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
& h3 ~6 S& D8 U$ P 6)xx = smooth(x, span, sgolay , degree)
; z7 X$ a( c( R1 e# N# ^ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 5 k. a# Y2 X) u5 W: W
7) xx = smooth(x,y, ..)
8 G6 B( N/ s6 O1 X 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
) g: e; V" e( ], R 【例题1】 ; U* C) J* b& S3 [ |- y! c
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
4 ]6 I5 G. y. C 思路:
+ p2 q4 v: b, B, h# E) k 1. 调用smooth函数进行加噪数据的平滑处理;
4 a, C( T( k% m; q" M9 q u 2. 产生加噪正弦波信号; ; I3 R% N- W' @: l+ `3 X
3. 绘制加噪波形图。
% O) n3 } [( O/ u6 b 解题步骤:
; P5 v0 i) j/ t1 M6 j 1)构建数据 + l* ~! J8 y) i) b
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
% Y3 J4 w# r2 `- x& G$ _ y = 100*sin(t); % 产生正弦波信号
, V7 o# Q, ^( v0 u- E/ e9 y; u! b % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 6 D* {9 o) K/ t
noise = normrnd(0,15,500,1); ! ]* T: v3 i0 J
y = y + noise; % 将正弦波信号加入噪声信号 3 g4 d Y* T4 q" v
2)制作基础图
5 n* D* B/ T! L, ]1 L figure; % 新建一个图形窗口
% _2 J; T/ r" J8 I& o8 k plot(t,y); % 绘制加噪波形图 ; n/ M D3 u0 S+ \
xlabel(t); % 为X轴加标签
0 r9 k+ e" J4 l4 B8 r- h0 D ylabel(y = sin(t) + 噪声); % 为Y轴加标签 8 @ t, D& R+ h* G; Q& h9 J
" N0 k0 _$ @% b+ K& ]% W8 q 3)制作平滑波形图 7 |1 J: Q- s" @* d
【方法一】
& Z1 P% P1 O P* R: A 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 4 B3 T% Y1 R& ~( _/ J+ L
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 , \$ a/ D( V3 n7 N
figure; % 新建一个图形窗口 - ~ N/ _4 w( h
plot(t,y,k; % 绘制加噪波形图
2 Q' @% E7 C. J1 C5 ` hold on;
8 w( [7 E4 l8 s: R5 f plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 1 T6 [ s( }+ R( z& k+ K
xlabel(t); % 为X轴加标签 ( y% _/ y8 i- V0 ^
ylabel(moving); % 为Y轴加标签
0 R* O) t: C! D6 ], P- N; K legend(加噪波形,平滑后波形);
- L/ m$ r: v) ~( d8 e
3 P, P: O# l. @ 【方法二】
1 M' z# n( D, N6 T2 A2 R1 p3 } 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 2 ~/ k1 X2 g9 p W6 I& G b
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 0 t4 `, S+ }6 V; _9 O a- V
figure; % 新建一个图形窗口
% t5 N# X( Q+ d) M) }/ k+ s plot(t,y,k; % 绘制加噪波形图 % t/ ]6 r, N( f" |% R
hold on; , F1 z, J8 J5 g: R+ b* K0 l
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 % c) _" U, s$ f% d! v. O' G
xlabel(t); % 为X轴加标签
( V0 ]0 R- o, U7 {, `% @1 p- F! s ylabel(lowess); % 为Y轴加标签 4 P1 f1 ~8 e/ x
legend(加噪波形,平滑后波形);
3 N$ _ X3 B; t6 } 5 @. @* O8 ^, X4 E
【方法三】
( j! K0 T: ]* {: T. |* \: i 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 % W6 R! ?) G4 H3 s( e3 R1 _
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 / c7 V2 S, ^4 F+ T& m) l
figure; % 新建一个图形窗口 2 ?" _' {9 X1 p# K. N0 X/ ~8 P
plot(t,y,k; % 绘制加噪波形图 6 R/ [& x' h) _% J
hold on;
# S0 g! c& f2 m/ S$ g: b# F plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 2 B1 m e) o* B/ S
xlabel(t); % 为X轴加标签
i1 X2 Q K, z. X3 M' t2 ` ylabel(rlowess); % 为Y轴加标签
Y3 c9 Z) y; U. W/ N legend(加噪波形,平滑后波形);
6 Z' _# V! A* i1 M& f! K: P
1 o7 g9 J. x! M 【方法4】 u1 b" q# @3 @6 `
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 3 r2 ^0 S7 g2 q" M x0 Q( l' i" ~
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
' B( ^* c! b4 M" j, | figure; % 新建一个图形窗口 @& K: u- i- H; y( s) ~) M
plot(t,y,k; % 绘制加噪波形图 ' I# u+ s/ D& ^3 M" n8 Z# s
hold on;
3 C2 ^" h/ i' \/ c/ ]; e$ j0 a- O plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
8 H! L+ Z4 n b+ ` xlabel(t); % 为X轴加标签 ! {1 \" d, V7 f3 S0 V5 t
ylabel(loess); % 为Y轴加标签
, C. A( S, y% N/ `9 k legend(加噪波形,平滑后波形); 1 y# H: q* p) i/ o* o" m; K4 p
% E6 V) Y0 V; D5 `* \8 c, e
【方法五】 - Y6 G6 e T" s t+ S6 Q1 H; U
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 ; k5 ^0 J3 i( E/ y( B3 K
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 , S! d) A- {- Q$ W' g& J: S
figure; % 新建一个图形窗口 ' q/ D' Z+ G) [3 H5 F/ S* L, l
plot(t,y,k; % 绘制加噪波形图 ' ?- [: f7 b# R, j; z* o
hold on;
, @: Z: o) m) \2 \, \ plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
1 k% `- I3 u1 w+ a& ~ xlabel(t); % 为X轴加标签
! e$ l5 s/ `) }0 e. A- `! e ylabel(sgolay); % 为Y轴加标签 + ?( \$ A7 Q+ q7 v) y# U8 Y: u
legend(加噪波形,平滑后波形); " w: M' s# t# b* A& W2 K
8 J5 Z1 m4 h: j; R& e! e! C! ]/ _% ^ r9 b7 k
5 X/ ?, C# g% E5 y( S! N9 k! [3 n; C3 V) Q
7 O. u" s2 B, Z3 i |