|
! P! s% v! H1 ?/ \8 U+ a F
如何使用Matlab对数据进行预处理
5 |3 z$ y2 h4 e# R3 \ 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 ' j" h; b- W8 A+ D% `+ U
1.1 smooth函数
6 S/ H% `. j& g* m Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
J* ^; u0 P( Y2 a* G: L+ Y. y# T& Y; `% g 1)xx = smooth(x)
! V: v7 t/ d& r# n* d 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: " f3 d2 e# s Z2 O$ x% _* n" h
xx(1) = x(1)
$ w2 F. b) O' i xx(2) = (x(1)+x(2)+x(3))/3 : X. Y6 x' C" m+ D
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 ' s9 D8 A7 T% h: d8 ~
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 & Z5 E7 Z/ B: L/ m. x$ S
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 9 o1 H! I5 K5 k* l* l
2)xx = smooth(x,span)
P. K5 M5 a3 ]/ M 用span参数指定移动平均滤波器的宽度,span为奇数。
) z/ n: N. K5 f3 u6 L- u3 [, T$ n 3)xx = smooth(x,method) I4 Z/ @' y- G5 S8 K3 B9 ^
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
# n, Y O% `& W- m! n! y; h7 T s 表1 smooth参数支持的method参数值列表 7 O; k o0 j1 r' T7 u

6 O, x7 Q5 y4 Y4 X 4)xx = smooth(x,span,method) . o5 {+ W. Y8 ~; S, x1 j. @2 ?% P# B% v; N
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
7 q) a6 O2 j f$ ^ 5)xx = smooth(x,sgolay, degree) 7 @1 j' X* J8 z G" w1 ~
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
$ a8 ~9 s7 Z _! O! j& _: A 6)xx = smooth(x, span, sgolay , degree)
9 u: i8 g1 E/ _$ R" S' Z9 m 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
& Q) ?! ~+ }( D7 ^& `5 i H2 A$ D# s' L 7) xx = smooth(x,y, ..) 9 J8 e. ?% Q% i( V8 R
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
$ _% O1 K. r6 f, L: ^: a- _ 【例题1】
* @5 X8 j& H- |& W, c" ] 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 / `* _- T0 {7 x4 }" ?
思路:
( Y( ?7 N! F, S7 l( ]: y 1. 调用smooth函数进行加噪数据的平滑处理; . `/ b3 {' p7 r4 X1 T ]* N7 `
2. 产生加噪正弦波信号; % ~/ ^! v# B) O$ h) s- N, I
3. 绘制加噪波形图。
- n1 A( t: { c m% m 解题步骤:
) ^/ C9 q: S4 `3 q! f 1)构建数据
8 R2 S* Z1 g( O: Q2 i2 G8 l0 {3 X t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
* f6 |! W0 ?, ^- h) n' c y = 100*sin(t); % 产生正弦波信号
6 Z/ a! C, s: U- Y* X+ ^% o % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 & h. K* Q3 n+ K# a! f# K- {
noise = normrnd(0,15,500,1);
- f) ^2 F) c/ i( d* O. U9 b y = y + noise; % 将正弦波信号加入噪声信号
8 g* p, r, \$ N* y 2)制作基础图 2 s; u) t. U0 r$ Y" L- J# v. w
figure; % 新建一个图形窗口
1 g1 y- I" J: P' W* o7 c3 h plot(t,y); % 绘制加噪波形图 - w8 i% Q( c3 Y5 e. j5 E
xlabel(t); % 为X轴加标签
: I( \- @, Y; ^5 B5 @% M1 d! u ylabel(y = sin(t) + 噪声); % 为Y轴加标签
) g$ b5 z; m; X F1 P" n. x 
, l" Q2 |( }6 J5 X4 Z 3)制作平滑波形图 6 c' g* j5 o0 ?6 z
【方法一】 4 l# y- e) Q" X; V4 X1 B
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
4 R0 u) t! k6 a7 J. H7 h# t% o yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
, V6 C. W* ]" U$ s0 u7 | figure; % 新建一个图形窗口
$ }; v4 n3 ^! f0 ]; ]2 P plot(t,y,k ; % 绘制加噪波形图
. H$ y6 Z6 f, k( u! e+ _) K; N hold on; . k+ `8 Y! _* T
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
) ?$ a3 b/ u p: o) e8 R xlabel(t); % 为X轴加标签 5 T& z& O" p0 s7 N/ n
ylabel(moving); % 为Y轴加标签
: C' w7 y. b$ e0 [" @8 q5 b legend(加噪波形,平滑后波形);
/ U# \$ y- ^% X9 |5 G  5 s x$ @- `" v0 ]& I1 l9 s& M
【方法二】
. M" |3 ?0 x+ T& [& O8 J- k 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 4 {. B: Q9 D8 v y
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
( B/ ?! Y: c v1 |+ d+ x/ o figure; % 新建一个图形窗口
0 r, p( ]" m! A7 q* `/ U plot(t,y,k ; % 绘制加噪波形图
% R& w3 Z! C% g! q, ]4 u hold on;
. i$ E& v% R) o" k0 X8 E plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 8 {# n. j; n) u$ C0 v0 X# E( R: ] b
xlabel(t); % 为X轴加标签 , f; Q+ {% H8 h1 ]
ylabel(lowess); % 为Y轴加标签
7 o' w" S, |* B c, E9 `5 U* z' D, _ legend(加噪波形,平滑后波形);
( }; n; l8 T4 k. Z2 b9 f 
$ M W4 z8 W% B 【方法三】 2 B, R6 R- o/ Y9 c, g
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
/ l6 N7 P' r4 [ z6 b yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
1 ^: O e5 X) C1 m* P: ? w7 s figure; % 新建一个图形窗口
& W G4 q7 t/ T7 J: k$ a0 s plot(t,y,k ; % 绘制加噪波形图
+ |# R4 E6 I6 f' P, o4 h hold on;
% K5 Z Q2 V) o8 T' y) z plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 0 S* |) t, l6 J, u
xlabel(t); % 为X轴加标签 6 {- o! T, {* _
ylabel(rlowess); % 为Y轴加标签 ' }# {- V9 t* r! ^+ p" b
legend(加噪波形,平滑后波形);
6 F4 v- E& C$ Y- S! Y6 t  , q& [) e9 Z) u: {1 R- ^9 M$ s# q. |
【方法4】
5 C G. }- `( u 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 0 Y' l( @7 W4 j* m2 l
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 K5 n( C1 Q+ \) }( R+ p/ U
figure; % 新建一个图形窗口 ' E6 U' I! ]3 z) _( U( A
plot(t,y,k ; % 绘制加噪波形图
! i% y& Q+ f+ ]" k w; y$ K x hold on;
7 I; m1 a5 e- x/ a G plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 * o; M1 C4 t3 p4 G
xlabel(t); % 为X轴加标签 : l' Q1 Z$ Y4 J- A& x: ?
ylabel(loess); % 为Y轴加标签 . u. o0 _6 a3 |. j1 x9 g4 D
legend(加噪波形,平滑后波形); a# b) t0 m3 h% p1 s* j

" m Q3 t" B/ \9 d# T 【方法五】 4 ]/ a; v9 g3 k1 w+ ]1 d+ A9 Q
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 5 @" a# [2 h" b
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 & g- s( ?! O$ Y6 K" v
figure; % 新建一个图形窗口 * D: y+ h3 G$ p9 W! Q8 d; y) Q
plot(t,y,k ; % 绘制加噪波形图 # Z, k$ X1 _% U2 p' _
hold on; 9 v% W2 ^+ r6 [( c1 Y
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 * e1 E" J5 s6 X1 }9 n* r8 C0 L
xlabel(t); % 为X轴加标签
5 I6 n h+ E+ @& \1 I' f ylabel(sgolay); % 为Y轴加标签 * D g; }/ z0 D% S$ Z
legend(加噪波形,平滑后波形);
: p. p0 h- s9 R% X! ?8 m5 |6 J 
' `$ ]0 M& p0 T6 i8 Q) x- V1 F8 O% w1 q5 E" ]" h- X7 W
$ J8 H/ [; U8 e( _4 Z
) q6 n! @: S) E7 e# w& B! c \# j
; q# y7 C! z; L& M
|