|
H L/ w; d, \+ [ 如何使用Matlab对数据进行预处理
2 l9 k9 c& U5 \ 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 2 w9 V4 g! f1 r: t J0 a
1.1 smooth函数 ) B, M) k2 y% q% [
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
# E/ B/ m6 z# a0 X. _ 1)xx = smooth(x) & h6 m# H3 A8 }2 C& K3 R
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: ! p. G6 a4 _8 P9 C2 |; {
xx(1) = x(1)
k, X8 M8 p( }5 O$ n/ ? xx(2) = (x(1)+x(2)+x(3))/3
" r2 H6 B0 f6 P3 U6 T' D xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
) X; {3 i# t8 h# a- _ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
8 w# X% J9 L, M1 d: l( p+ G xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 $ c; i7 ?! c1 q: a8 y4 [( a. L
2)xx = smooth(x,span)
4 i' p9 m& R1 Y, e' J2 J, G 用span参数指定移动平均滤波器的宽度,span为奇数。
]8 Y: @$ ~( D4 [ 3)xx = smooth(x,method) : `2 Y2 h# {1 ?. _
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 8 ~- Z. Z5 C8 H/ u9 W9 j N/ {
表1 smooth参数支持的method参数值列表
, o! g: d, D, S) @$ d# ]0 u: Q 
4 H9 g% w4 }+ W 4)xx = smooth(x,span,method)
# \. L- R; V/ n2 X" @ 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 / e: @2 W2 }8 Y3 Z( h6 J( j
5)xx = smooth(x,sgolay, degree) + M: Q2 T2 n9 _1 v7 M4 b9 t
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
6 H7 x! I& d$ B 6)xx = smooth(x, span, sgolay , degree)
9 |$ [9 Q% k+ X& t) R) ^5 Y% A 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
+ r% {. X- M5 O, L" W: K 7) xx = smooth(x,y, ..) , Q* `6 l8 u( }/ z y: t; N( n
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
) \$ c7 N% h5 z+ W- U% l* I 【例题1】 4 Z- q+ N+ K$ m* A0 z
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
# C, ~9 }0 c8 I0 P 思路: \. j1 [ e( o# y
1. 调用smooth函数进行加噪数据的平滑处理;
8 I& F# ^! x! D) E* T& c 2. 产生加噪正弦波信号;
" K. ^0 H5 K' e5 ^ 3. 绘制加噪波形图。
2 E9 X7 s( N' R8 V& R$ r 解题步骤: - f$ r8 ] U2 Y# e/ k, G0 f* s; `% v
1)构建数据 ) H: m8 ^/ b, ^6 W1 O1 |
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
+ l/ f% p j) \- Y( w y = 100*sin(t); % 产生正弦波信号
2 q. N6 h) l: L6 \( a6 t0 s! [& K % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 $ z1 v% D6 w2 U
noise = normrnd(0,15,500,1);
. ]1 w0 M3 G$ V% ] C8 c: N; N# j y = y + noise; % 将正弦波信号加入噪声信号
" B- b: X# Y! n8 ] 2)制作基础图
4 W0 e- w- d2 F" L V* j- y, S4 Q figure; % 新建一个图形窗口 * B# c. w5 x( h4 x; Z( I8 K: F
plot(t,y); % 绘制加噪波形图
9 U8 H2 d6 Y5 M$ w0 x* z xlabel(t); % 为X轴加标签
) _6 F. J8 O$ B ylabel(y = sin(t) + 噪声); % 为Y轴加标签
( P2 q0 V: z* Q5 K9 ~  4 d+ I9 S) ]9 {% W1 R
3)制作平滑波形图 " G1 r, g: Y6 j4 A, E3 z: c
【方法一】
3 y) |: o" V n a y& y, `; d+ K 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 * E; ?' h( `8 t) y# J! M
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
( D" K! `, ]( k: m figure; % 新建一个图形窗口 , y1 N# k# j! @; @! ~% F
plot(t,y,k ; % 绘制加噪波形图 1 o! s2 U# h" N* s. O
hold on;
$ ~8 J/ V! X) t plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
% @5 f5 H' _# I% y7 @: J4 e: ~ xlabel(t); % 为X轴加标签
( K9 ?8 [# u' [" b: P, m) k ylabel(moving); % 为Y轴加标签
) O3 Z0 \* G( W) V8 e3 W8 I! o legend(加噪波形,平滑后波形); " r/ I6 j2 A4 p8 u. m* y) B2 U

/ t0 ?$ r" p, @ 【方法二】
$ b( h3 X8 b0 q* v 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
( m2 z0 c' u- D. _+ C. t1 A yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 N Q( P+ N$ p: T1 T' Q" `
figure; % 新建一个图形窗口
& J- K0 L N( {+ _ plot(t,y,k ; % 绘制加噪波形图 * [: l2 U& h, J- D7 _
hold on;
0 x: P1 b; I% ^/ { plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 4 Z- W7 ~" R8 ]5 m3 y9 p+ |
xlabel(t); % 为X轴加标签 . c! `) F% [. l& i5 Z
ylabel(lowess); % 为Y轴加标签
& h% a" K0 R1 t, d9 h legend(加噪波形,平滑后波形);
4 s7 K+ D! \' ]7 Q8 l8 z8 H  9 ^6 t/ O; e0 `- ~5 R1 @
【方法三】
, w3 O# d5 h ^/ M- b3 h 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 7 ]! J% d% \) p2 s2 u( D) C
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ) f5 E. r, C/ E$ d
figure; % 新建一个图形窗口
3 v& U8 A/ B) `( Z# L# [# y plot(t,y,k ; % 绘制加噪波形图 6 v2 |4 [7 C. Q0 K$ S2 E
hold on;
1 o% j2 U4 o9 }9 G plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 3 f% F0 B- Q! z% [7 Q
xlabel(t); % 为X轴加标签 0 p, j5 X3 D* A+ K
ylabel(rlowess); % 为Y轴加标签 6 [& O' s! y9 T: T8 O6 n
legend(加噪波形,平滑后波形);
% H9 V& n* \, `% E  ' T: d$ G' R- `: _/ N2 K
【方法4】 $ z7 ]+ u8 n+ l3 h( N% p% C F
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 3 F( S/ k( V" h- e
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 `; V* U' _3 J- \8 w# [8 t
figure; % 新建一个图形窗口 $ s# @! F8 z+ j5 |8 R
plot(t,y,k ; % 绘制加噪波形图 6 I/ @. ?5 T: a3 `" S
hold on;
' S: O$ d) P; L: ]2 p. v0 | plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
6 E' U5 u) W/ }& O+ f7 \ xlabel(t); % 为X轴加标签 , @5 `" m% ], j: l4 b
ylabel(loess); % 为Y轴加标签
' I# p3 e+ s+ p! a' _ legend(加噪波形,平滑后波形); 5 g, h) Q; | p0 w- s9 e# G

5 y$ P/ z$ i3 b2 n( M0 `# @ 【方法五】 . V, X' z Y7 `# T$ J
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
$ h; _5 ^' i0 f yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 / [$ d+ a9 v0 l9 W8 S: @' a
figure; % 新建一个图形窗口 ' L+ P v+ e$ u4 u5 c) O
plot(t,y,k ; % 绘制加噪波形图
. K+ x5 L0 M2 s0 ^' { hold on; - m0 Y! A* X T# M
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
" i6 t( f( q+ A8 V5 ] xlabel(t); % 为X轴加标签 ' f6 A% G' J% \ |3 Z+ @& q& D7 l
ylabel(sgolay); % 为Y轴加标签
4 x7 |; ~( f5 x, W) z$ g, M legend(加噪波形,平滑后波形); & |$ N, Z; k% v
 - t; u3 z) A- x) O) P
2 @' p) I. q+ p1 Y
: v. X3 ]6 Y# [* o6 }( O V1 n n! w
8 Z+ n" \2 r! \% J" ~3 W z0 e/ p! W/ v' q3 {2 T3 G0 H
|