7 J( Q9 l. u0 z7 E8 U3 M1 |* r# o8 C 如何使用Matlab对数据进行预处理 L. S! a$ e8 H: Y" X7 N8 c: H) N, V
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 / o; X7 H3 K2 ]: e, ?8 i' q
1.1 smooth函数
m, a$ L V; o( B# {6 B) W$ r Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
& Y( G- ^/ \7 y' @2 K% {) c) O 1)xx = smooth(x)
U+ B4 e* X2 |; H. @ 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
1 Y1 a& |( f% Q% [" \ xx(1) = x(1) 8 {5 A8 d! r* b
xx(2) = (x(1)+x(2)+x(3))/3
9 k0 S+ `0 P+ _( f5 P, Y xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 ?% |$ l7 @$ s) ]( ~1 H
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 ! L8 Y' y; L2 m) w' g
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ( X. u3 ]! Z9 Z
2)xx = smooth(x,span) - J# T1 N* Z8 w; M
用span参数指定移动平均滤波器的宽度,span为奇数。 # c4 \( z* }1 y, V7 O
3)xx = smooth(x,method) 8 ]/ w7 y2 [1 `8 }5 S; ?
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: * ^& |) S2 k0 E. `1 }! K/ g
表1 smooth参数支持的method参数值列表 3 ~! Z6 ?7 B7 T% d& H/ V
 # Z- r1 X( H" C' p, K: `7 T
4)xx = smooth(x,span,method)
; n* R* l6 A0 Q7 R* W; V. _ 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。 - o$ K& h! v/ c
5)xx = smooth(x,sgolay, degree)
$ N5 W! c2 l. x& H5 T$ \+ j& ` 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
9 f( r3 m; ?3 {2 p% @* f; | 6)xx = smooth(x, span, sgolay , degree)
" J2 A2 n5 z! O8 ~, U0 q 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 # P4 \/ P: X: E* J
7) xx = smooth(x,y, ..) + C) g' E3 c6 {" w9 B
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 7 r9 ~0 n) R. G" G6 b
【例题1】 5 ~# y' T8 C; a- d6 e
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 2 o& M p! p2 A( d0 O
思路:
' |# U: R/ U! m$ l8 m 1. 调用smooth函数进行加噪数据的平滑处理;
; }# I0 G; \! C' O1 X) X* I) g2 R 2. 产生加噪正弦波信号;
7 c3 }& E D# N* [ 3. 绘制加噪波形图。 * H0 A2 b( e/ k
解题步骤:
( R* h% Q+ o8 a 1)构建数据 / r/ K. C4 L* D& ~. @, p- F- r
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 8 G$ U R8 t p0 ?
y = 100*sin(t); % 产生正弦波信号 0 f( U, X. Q2 I( M& A
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
3 z. W+ l# v7 B$ i7 K noise = normrnd(0,15,500,1); " [9 B6 L$ Y$ G
y = y + noise; % 将正弦波信号加入噪声信号 : W2 T& t4 ~+ R1 F3 f0 A- p
2)制作基础图 ; w+ [$ g# m# M3 v
figure; % 新建一个图形窗口 - p) }: K" ~( T7 J+ a: X
plot(t,y); % 绘制加噪波形图 4 I0 _, i) e% @; V8 Y
xlabel(t); % 为X轴加标签 ) V" P0 A7 Y( p. a
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 . Q7 P: J: S1 r: ], j

+ N) }" l0 o- u A+ q, d 3)制作平滑波形图
# M. I: d+ ?' X; T- H* h 【方法一】
& [' w; M0 I7 G8 ]7 H' v$ y 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
( Q% @+ D+ J/ \ yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 & I" L* \1 g M9 I0 S% E
figure; % 新建一个图形窗口
" u3 j& ~* \$ e plot(t,y,k ; % 绘制加噪波形图
4 u3 l% j, `8 x" W* Q, n& M- t hold on;
3 F1 L, [1 u2 q, E2 R, Y plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 $ {5 L0 `: N2 p6 V1 s# z
xlabel(t); % 为X轴加标签
: `3 L) Z% Y% O6 s% L3 X ylabel(moving); % 为Y轴加标签
( g* T( r' E$ l% h6 i- h1 X legend(加噪波形,平滑后波形); + K7 ?# e1 ~& Q- x3 O6 h( {
 ; l- v* @- |$ R/ r8 ?
【方法二】 ; Z1 ~% V* ~' C* _9 c: b
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 : n2 U) R% c) O0 f5 |% V1 v- @* q: A
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
4 u! k/ O [! N1 W$ P figure; % 新建一个图形窗口
2 k' c: P3 M$ v+ T3 n" A* A3 [: p plot(t,y,k ; % 绘制加噪波形图 : l! q3 F* R, L+ d5 o+ h8 p: b+ d
hold on; % A# D K$ ^: `5 n" W/ [
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
5 f9 R7 Z% t4 k4 D; Y' ~ xlabel(t); % 为X轴加标签
( S8 U* m" c9 K8 R) v ylabel(lowess); % 为Y轴加标签
( ]8 R5 @! z) H6 a legend(加噪波形,平滑后波形); ; S1 W. o* Y' \; y7 C6 I [5 [

+ Q3 j: X( S2 R; ?6 w 【方法三】
6 U! j" v9 ~$ X3 y) x) V! Q 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 * R0 f+ r: \' F" t: K% b8 u0 P9 `
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ) P& k4 G W* w$ Z0 e, j0 S
figure; % 新建一个图形窗口 2 a% _+ G) [5 V% A y/ C- ^ c
plot(t,y,k ; % 绘制加噪波形图
A' y% m8 b' R hold on; + ~7 T4 F8 I- i$ w+ q$ S: T% |
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 & K4 N9 q$ u3 V9 ]
xlabel(t); % 为X轴加标签 * e1 G4 u2 k: n# r, V2 K
ylabel(rlowess); % 为Y轴加标签 & U1 q6 s( {; `5 h/ f. `
legend(加噪波形,平滑后波形);
8 K d* b+ I8 L, {6 Y, c  5 \, o8 |( @2 m# E- O ]
【方法4】 . w" f% n3 O- V7 o/ M
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
" k7 a6 f% K% g yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ' a: j- h4 z+ J6 {5 b+ Z5 O
figure; % 新建一个图形窗口
# M$ A* m7 {% C* M* x. H+ i7 Y; a plot(t,y,k ; % 绘制加噪波形图
" L: H1 e, F) C f% v hold on;
: f/ C. d4 v7 m+ V; g9 m: c plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 # w$ o! w2 B3 S+ y2 n) A3 V' c4 L4 Y
xlabel(t); % 为X轴加标签
/ U2 F D2 u7 y% Z. z ylabel(loess); % 为Y轴加标签
% n' p9 J4 Z% E' \) M# y# b; T: ?) Z$ k4 H legend(加噪波形,平滑后波形); " n5 |5 r0 ^- y7 J6 A* `( s
 7 w) {4 ^1 d2 K/ {% P
【方法五】 8 M' D) B; g1 Y" `0 |, B2 [2 D
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 3 Z5 ?/ i# B: e' ?$ L4 Z, K# O D, E
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 % _: A J7 d& b0 T) o) o' z& X5 c$ W$ h" F
figure; % 新建一个图形窗口
( s7 X( j' j( @: N4 [& N! V; c plot(t,y,k ; % 绘制加噪波形图 , t! A; {. g2 }# x
hold on; % w3 G) @. T7 v6 r& S2 }
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
( P i- _: E* E4 {4 t" H xlabel(t); % 为X轴加标签 6 p) S5 h1 B4 N2 P& \1 U
ylabel(sgolay); % 为Y轴加标签
5 ^9 y8 \% F' K legend(加噪波形,平滑后波形); % }/ O/ H3 n3 Z/ U

3 O- w7 p6 B! m0 c2 A
, t3 Y- i6 k; y, l6 N* I0 K, i' r2 _+ M# H2 ?
$ H! L; M' R; T* o3 E. a
6 ?# n6 O/ B6 S# P3 q( [ |