|
0 e9 [6 ?, ?) G5 Y 如何使用Matlab对数据进行预处理 ' I/ a, N; y5 {0 m" G
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 0 e, F5 F) p) N# p% f/ J9 U7 }) _
1.1 smooth函数
7 ~7 _ _, m6 ? Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
; \: P( d+ r; L; E/ [4 P. F- c0 Z 1)xx = smooth(x)
3 Q: i1 w! q8 v 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
T" W2 F& `& @ xx(1) = x(1)
7 M" z, u! T8 z. Q) k& p xx(2) = (x(1)+x(2)+x(3))/3 . U l! z: S, S1 J& W
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 . d- u8 D; h3 b
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 ! i$ H, U6 q1 R$ e& y
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 # a7 T' _% |( M6 J& W0 n3 @
2)xx = smooth(x,span) 1 f x1 G1 A6 H1 M4 t" Y Q
用span参数指定移动平均滤波器的宽度,span为奇数。 / ^$ z. m4 X4 e
3)xx = smooth(x,method)
$ p) Z3 p4 x- c. y. A* w1 o 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
a8 r4 W' q% p 表1 smooth参数支持的method参数值列表
) h$ [) ?, P) S- `" k, W) \  + U& f- T1 D) s# |6 t2 f8 k( B
4)xx = smooth(x,span,method) 3 w7 @& g! ]* @
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 ( c, h* g- K0 J. V( |4 A! {
5)xx = smooth(x,sgolay, degree)
" C$ c" U2 ^5 \/ d0 E, V/ X 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 " E. |$ V8 ^0 w
6)xx = smooth(x, span, sgolay , degree)
6 t( E' O8 _, a" r3 B, n" A+ N 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 w. u. r9 \6 H5 @( p
7) xx = smooth(x,y, ..) ) y/ J1 d4 Y- W" h
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
* }3 ?6 [6 b1 @7 [) F9 W9 E 【例题1】 + f+ Y3 U' @9 T1 }/ ^
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 $ c0 x7 b& \" q$ B! U V+ P$ g& d
思路:
) J) Q d5 v& ^8 b# k# {2 t: r2 t 1. 调用smooth函数进行加噪数据的平滑处理;
/ H) X9 {: n- k2 W$ a# O 2. 产生加噪正弦波信号;
" ?, {% J, V) }! ?8 d u 3. 绘制加噪波形图。
$ t& M, T; z. M2 i+ g- Q' P 解题步骤: % ^8 P6 N: \5 M0 ?
1)构建数据
f5 ]% r4 Q( \* E t9 m t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 " J- v! `! e4 \9 L( {$ r9 P' z3 M9 L( d
y = 100*sin(t); % 产生正弦波信号 . |, X" N$ l. S; h8 m
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ) X0 @4 u. U7 ?
noise = normrnd(0,15,500,1);
3 f# }* W" K3 n e6 }/ U y = y + noise; % 将正弦波信号加入噪声信号 7 D7 a8 v+ q0 S8 i# i! Y$ B
2)制作基础图 / V: x8 Y" O9 O# E
figure; % 新建一个图形窗口 8 _; k9 a3 T2 f% e- u: _
plot(t,y); % 绘制加噪波形图 % @/ f4 t. d% s/ H0 p
xlabel(t); % 为X轴加标签 ! Z. Q5 n; U7 Q# z" S4 h8 x
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
. T, }6 E! y8 f' w: T1 | 
# c" S4 ~7 c9 m9 V- b v 3)制作平滑波形图 0 W- N- ?# r4 E- F/ ~
【方法一】
]5 [+ R! `: D# T$ o) @3 f 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 2 z$ G0 {# X: b8 I$ D3 d
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
, q; U4 M1 O. W! E figure; % 新建一个图形窗口
Z8 h) J" h1 p E plot(t,y,k ; % 绘制加噪波形图
2 F7 b3 ]) C p* k hold on; $ N8 p2 C2 c( R. V
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
0 q# a) E: [/ G4 ^! B$ A xlabel(t); % 为X轴加标签 9 x6 s7 D/ h; D A- ]; P5 }' A& h( w6 T
ylabel(moving); % 为Y轴加标签
O7 \8 ~8 P- s( @' z: k: y legend(加噪波形,平滑后波形);
: V6 w. O; X' c& v4 X 
. }- F$ j' T9 c+ W; M% @ 【方法二】 ' E, q; E! @0 H( k9 j- J
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 5 M# H5 _ x- O1 C2 x
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
' s4 K5 S+ q! C. Z3 L figure; % 新建一个图形窗口
5 _/ v3 ?2 C( k2 P P: { plot(t,y,k ; % 绘制加噪波形图
# x9 o# z% l+ s. f( P( r hold on;
- B l a9 D7 c% Q$ r9 @ plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
! A' P$ h8 n+ n- B xlabel(t); % 为X轴加标签
. M4 c0 ?/ k+ C% g9 V) V0 @ ylabel(lowess); % 为Y轴加标签
: Q# U: g' ^/ ]: c8 x2 ~( L legend(加噪波形,平滑后波形);
2 j, V) J, I9 Z# h  `$ s9 c. u2 C- O, i
【方法三】
+ [; t! A1 s$ C9 W( q( D1 p 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
4 p- L! U% v7 t+ { yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
# ? l! H+ J. x: M X# q7 ^9 n figure; % 新建一个图形窗口
5 `) l& n* M, h plot(t,y,k ; % 绘制加噪波形图
2 S4 n3 a! s: S hold on; 0 h, N; G6 p U9 Z& R
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
; g ~( [6 S9 b0 o$ o9 r xlabel(t); % 为X轴加标签
9 r: b2 t, t+ L: d ylabel(rlowess); % 为Y轴加标签
" E% v! Z1 D& s legend(加噪波形,平滑后波形);
3 J5 H% G" ]7 y& E: u8 k 
1 H C: w! y. Q 【方法4】 $ H Y) y3 \/ m
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
& ^0 W+ n) w+ N+ i( F* r4 V) j6 x! Z yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 4 c# u8 x( @8 g% s# H# T
figure; % 新建一个图形窗口
6 r) U2 k7 B j: u, V' { plot(t,y,k ; % 绘制加噪波形图
' ?) _% R, D. a& q( g hold on; 5 g: C. I( y& U L9 E8 v
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
/ X+ M6 N% ^% N* s% [0 P* k. j xlabel(t); % 为X轴加标签
& C% J6 I" Y- y7 g ylabel(loess); % 为Y轴加标签
# }' g3 Q$ f, U# v+ s legend(加噪波形,平滑后波形);
Y( W; A- e% K1 a* N; F  " p- N5 T `! v$ }% {0 a ?
【方法五】 ( B# A+ ]! Z% i- |& t3 e2 c
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
* k2 b" O* E, [3 q yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 o5 j9 c( G5 ^* V" K, A
figure; % 新建一个图形窗口
' x: {5 U6 H% V i) ^: b plot(t,y,k ; % 绘制加噪波形图 # v8 t5 n, D7 C
hold on;
6 I* G, n: o* t' T$ h5 u- k. i plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 5 A% g6 U' Q& h' Y
xlabel(t); % 为X轴加标签 # N) [) x0 n1 {4 Y+ c$ ?- c
ylabel(sgolay); % 为Y轴加标签
; V* t4 F) Z* Q! o" G- A legend(加噪波形,平滑后波形); * {7 I2 D$ I9 O6 `9 T: y+ j6 S$ z

' J6 d. m& T+ X- L, |! e) ~: U- ^9 ~) Y8 {- M
, f; }# W% X% [6 f' O
- l3 u9 H( a1 r) I# l( a/ ^& r( J
|