|
) t% s- v% v$ o7 J
如何使用Matlab对数据进行预处理 + {* P: q, k3 V2 Y- _. X) f
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
# ^3 V5 e7 m6 W# V m 1.1 smooth函数
3 d: e- ]' b$ ^: P5 H) Q- }6 F Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 4 W% M: G, z; K* \3 p, l
1)xx = smooth(x)
' V0 ^5 [3 J( r$ K t$ ~ 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 8 X% F- G Z% A: I9 \. \3 N! `
xx(1) = x(1)
$ d' v1 l3 c: \; j } xx(2) = (x(1)+x(2)+x(3))/3
3 O, l* s% \* W; ] xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 + t5 |* R) W, G
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 3 A! `( n# L! t8 d) I. |: D4 @
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
, \$ y7 ~8 y& \ ^ 2)xx = smooth(x,span)
6 |& [2 L2 t, D5 O 用span参数指定移动平均滤波器的宽度,span为奇数。 y" N' s" k$ N% }! L/ u
3)xx = smooth(x,method)
0 ~$ }/ |! K8 S+ t! d* t7 O7 w 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 5 Z: }, Q. P' Y# R! ^
表1 smooth参数支持的method参数值列表 6 x* L1 ?3 U' f ~, k9 K

% r7 e% o8 I7 M; [* w 4)xx = smooth(x,span,method)
# P [6 O/ j% T1 w0 j$ ~3 @! k 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
3 [* U8 l! R: d! \ 5)xx = smooth(x,sgolay, degree) 4 r5 N1 r- f, e' ~
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
& V S- W5 }% _. H$ t$ @6 Z 6)xx = smooth(x, span, sgolay , degree)
- k( }2 {" Y, n9 F# E1 \ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
( C7 C. w( [% ]0 n9 k* T2 V 7) xx = smooth(x,y, ..) & V8 x6 J& A+ r- w
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
' q7 W1 ]7 a% E% A6 V4 S2 D0 { 【例题1】
' B% d7 R2 L3 B/ [+ E 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 & B9 E ~* U+ |5 I$ l1 S) z: T+ J
思路: 3 Y! I5 g* A, z$ f/ G
1. 调用smooth函数进行加噪数据的平滑处理; ; [, |! H$ V. J5 i+ I2 E9 ?% |+ i H
2. 产生加噪正弦波信号; [0 e/ H$ R$ ]$ ^% r/ H
3. 绘制加噪波形图。 2 {4 M8 g/ y. M1 B4 s% D
解题步骤:
5 \- J6 u7 t2 u/ u- d 1)构建数据
3 F/ P; d) T( A t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
' L) ?% ~( \; `8 w$ Y8 b y = 100*sin(t); % 产生正弦波信号
9 q# x6 y# b/ Q) K; G % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ! |* D# M& b! y# |) {; d F
noise = normrnd(0,15,500,1); 6 w, g8 ]+ g/ l
y = y + noise; % 将正弦波信号加入噪声信号 a, Q' V4 b2 z* v4 d1 a
2)制作基础图
I4 J1 C. R) ^ U/ Q% s1 k9 N* J figure; % 新建一个图形窗口
' w8 a" B l# Z, c' w8 E plot(t,y); % 绘制加噪波形图
7 Z& a* K; r! j6 |% [2 V xlabel(t); % 为X轴加标签 ( R5 E- r& u; j4 r
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 1 ^% C8 a; _1 k$ C3 W
 ! x& r( F$ }6 q( p- _
3)制作平滑波形图 4 R8 e9 a7 {( H$ L$ R* \
【方法一】 . I" m c$ }/ [8 z
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 # O- I I5 g/ |+ Q/ K: y% B
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 % F9 W9 I, Q! C. `
figure; % 新建一个图形窗口 5 M: T8 O: G2 l" G
plot(t,y,k ; % 绘制加噪波形图
. w) D. u+ {9 | Z! a' l5 m hold on; . \8 w4 ~7 q7 Y
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
, A s8 A/ H# K7 Z( S xlabel(t); % 为X轴加标签
; t9 ~8 _' }6 G% ?' ^ ylabel(moving); % 为Y轴加标签
P& F* X+ V, | legend(加噪波形,平滑后波形);
4 E( p3 _5 ~1 u8 F; I2 F w8 \4 \ 
4 g8 ?9 z$ j9 x/ N. i6 T. v 【方法二】
4 Y$ D# P8 b% C l, }5 x0 A 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
( [' H" @4 S5 R0 ?1 j4 p4 q9 O" z yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 ! \2 H( } G2 a- r1 Z y8 {
figure; % 新建一个图形窗口
! L, K, _# a U7 H! t1 D plot(t,y,k ; % 绘制加噪波形图 $ H. o9 m" I8 x$ x' e
hold on;
_7 n' K& {1 j plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
/ R0 Y8 x* {- h4 ?- @' Y; z* t xlabel(t); % 为X轴加标签 . x) x' q( T2 A, L9 D& E
ylabel(lowess); % 为Y轴加标签 N1 Z2 } P9 f, k+ ?( o- m0 u
legend(加噪波形,平滑后波形);
) r6 T1 o# M- [" y& } 
; N0 t6 i, q9 A8 _8 E 【方法三】 3 Z# U0 A9 I% t$ D0 X
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
) Z$ v+ a9 n2 s- N1 ]9 h! R+ |1 |8 Y yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 1 l. [) K3 S$ H4 T: i& e# \$ u$ A ]
figure; % 新建一个图形窗口
2 a0 Z5 w1 L$ f plot(t,y,k ; % 绘制加噪波形图 & k2 U' K5 v' n7 |2 a) G( j
hold on; 9 [! B& C7 A" y( Z8 V
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 " M9 {% |/ a- |4 F5 {& k8 ]/ I
xlabel(t); % 为X轴加标签 $ v" V4 U0 `4 z3 D
ylabel(rlowess); % 为Y轴加标签 8 [5 G$ y! y2 X) k
legend(加噪波形,平滑后波形);
4 u; j2 ?6 J0 G! l& J 
9 h* l( c8 G) f 【方法4】
) H' N; S! n7 v4 }/ Q 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
, A3 H2 ~' ]* O& u5 g. t5 l yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 & P+ G Q9 x+ f& V$ E5 i
figure; % 新建一个图形窗口 " n& X+ |: {& f6 T+ L+ \
plot(t,y,k ; % 绘制加噪波形图 & A# M. K$ e( S6 m4 A' L
hold on; 7 z) {4 R0 u+ p2 L
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 / f" E3 r) a8 f4 _6 N+ z
xlabel(t); % 为X轴加标签 : Q, o9 U& Q+ `" K
ylabel(loess); % 为Y轴加标签
5 \% f& Y! f. b, p. e legend(加噪波形,平滑后波形); . m1 B5 J- U, A7 {/ L/ B' h& P
 ; C* q$ f5 O& U/ T' C9 ?* }
【方法五】 # Z: J6 |6 `8 h3 H# A
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 O9 w/ H6 i7 B2 Z% c3 k
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
) y2 |: P: `9 g- \& A/ C7 | figure; % 新建一个图形窗口
. ^! l. G- U1 u0 y2 C- \! U4 m plot(t,y,k ; % 绘制加噪波形图 + G3 ]. U# \0 B6 t# U, D& p
hold on; * P6 X# L d9 h+ w$ n
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 : x5 m2 i7 k1 g& _; d, C; b! D
xlabel(t); % 为X轴加标签 ( _1 @. p# O8 J5 q
ylabel(sgolay); % 为Y轴加标签 7 R& Y+ x' f3 l
legend(加噪波形,平滑后波形); + R7 x, g1 A- C; Q1 P- w

/ j2 O+ r, N- R2 S- A. N4 p9 a8 C X7 ^4 f! m V* r
9 n) q6 M- ^2 s8 h5 Z, I$ b; f$ \
, Y: `: [5 L/ M. ^; `# v1 u& t7 G
|