! h- x2 F9 K( ^* `. W# s' U8 r
如何使用Matlab对数据进行预处理
, K9 \ q% c5 L; v 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
3 N' _1 M N% \+ {7 b } 1.1 smooth函数 ( s @8 Q3 [4 R5 G4 v0 u
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: " Q" m% j! j" o P" y
1)xx = smooth(x) 6 v; Z! F& _! t7 l
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: " G$ ]* M$ {0 y; v
xx(1) = x(1)
$ C: g0 P0 k! m" K5 y3 D! k xx(2) = (x(1)+x(2)+x(3))/3
( c" ~/ Z! C/ Z( Q xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 8 t: y p8 j# X0 e0 u- i$ C
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 0 T( P* Z7 j, H [
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
( q. \0 W7 D' n8 d 2)xx = smooth(x,span)
m/ Y9 H% D% K- w- ^ 用span参数指定移动平均滤波器的宽度,span为奇数。
+ D3 V% T) Y( ]- _ 3)xx = smooth(x,method)
' x5 Z" }0 }' D. Y P& c 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 0 q2 o; `% U) [, D7 o! B0 E- A
表1 smooth参数支持的method参数值列表
+ i' w0 d# ]! ?* l  ( c# ^2 q5 ]" q3 e- C
4)xx = smooth(x,span,method)
, { D5 o3 z- n2 h ^2 v$ C+ x! v6 K 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
: K: ^' ?# D$ N0 G8 `$ B 5)xx = smooth(x,sgolay, degree)
& }4 l" }; r O: n' m: o4 V Q 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
/ m* S0 q. N( M3 Y' N" x8 d 6)xx = smooth(x, span, sgolay , degree)
2 U6 [! s# U# Q& S7 o4 a8 d; F 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
. X6 O* \3 \$ e$ k. A 7) xx = smooth(x,y, ..)
# N6 S8 U) T7 E( [ 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
$ h) G: q4 I1 T. d 【例题1】
5 d& Q* U+ X0 l7 z+ E% V 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
: T9 D0 `+ B) S. `5 o5 i9 W 思路:
( X; l" }( }6 R. b& j 1. 调用smooth函数进行加噪数据的平滑处理; * L1 G, N1 G) g4 N. C/ a
2. 产生加噪正弦波信号;
9 K6 }2 b$ j7 h. p( `) Z6 ?% H 3. 绘制加噪波形图。 & L/ v9 ^- \ I
解题步骤:
% D) [1 R4 E3 _* ^5 m1 d ^ 1)构建数据 ; Z1 A' L1 C3 b. a3 B
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
( Z/ @. u; W% t( A1 M3 s& y7 R y = 100*sin(t); % 产生正弦波信号
! q" e; | y* [: ~ % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 4 h" L3 z# t6 w1 O
noise = normrnd(0,15,500,1);
2 m7 }- n% w: _7 z) l y = y + noise; % 将正弦波信号加入噪声信号 * b; h% B! ^% M
2)制作基础图 & d" q8 g, D, t% k. X. v& M8 h. V
figure; % 新建一个图形窗口 % u) g) Q: n7 x5 a# \1 |8 M4 h
plot(t,y); % 绘制加噪波形图
- O( S0 W, l, G; [8 K xlabel(t); % 为X轴加标签 1 \) _, s& d. t @9 R5 _
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 8 q/ z/ z$ j K, E3 k4 j0 Z0 ~+ c
 ( e5 z2 h/ g" N F
3)制作平滑波形图
w7 g* Z+ G, P# y Q. W 【方法一】 0 r' Q! p$ y4 H8 ^" R; A `, [0 F
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 ( W, Y3 T1 f4 n C4 t* t
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 + y- j b' A0 R5 I
figure; % 新建一个图形窗口
1 ^* j' S2 L' ?# Z- d plot(t,y,k ; % 绘制加噪波形图
' O) C4 w1 B( w6 ?' K$ w hold on;
1 ~1 D. t- Y. `" S plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
: Y, J$ S7 i# z' A. A xlabel(t); % 为X轴加标签
9 g9 T5 W% E" b9 Q ylabel(moving); % 为Y轴加标签 . J$ ], J# W" P* F
legend(加噪波形,平滑后波形); ' R" U" g* r1 X8 T0 t: ?9 e$ v5 O$ o# P

9 d6 h4 }3 k' u+ k3 ]$ i 【方法二】
7 t3 W, M7 B3 ]8 i% I: h 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
; z( ~. o% a; q/ G& X2 d( Q' d yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
1 K) n C' j/ s3 U$ g- x figure; % 新建一个图形窗口 1 h' s) S" ~: q s0 Z# G
plot(t,y,k ; % 绘制加噪波形图
& ~* ^. U- z8 V3 M hold on;
+ E, }) K+ V: g* M) Q, ` plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
* |% B2 m4 Q O3 ?5 N* \+ w, c4 T$ | xlabel(t); % 为X轴加标签
- H( B1 Q# V( T7 w6 O: p ylabel(lowess); % 为Y轴加标签
2 n. E' Z( T+ Y$ A& ~ legend(加噪波形,平滑后波形); 2 t8 \! }6 s! f! t
 + j; X# H4 L1 q$ O$ r$ R2 M
【方法三】 6 K3 U9 M I3 ~
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
; |( W% k j6 U5 w/ K, }8 a yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
, q* q. a7 u8 ]; m7 q6 I' z figure; % 新建一个图形窗口
2 `- w2 H( Z. ~" y& W plot(t,y,k ; % 绘制加噪波形图 - D" Y! f/ v' x. e2 @
hold on; & I8 `. E; B4 t" x4 a
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 6 D# U% l( ]% L. t& b. g
xlabel(t); % 为X轴加标签
* b8 a4 i% }0 e4 s4 {: w. J" A' P ylabel(rlowess); % 为Y轴加标签
6 Z- Z' h$ |5 ^3 s legend(加噪波形,平滑后波形); j" k" D7 u. L" o, C

7 k* D% b$ R1 M& x+ K* _' Z 【方法4】
& A3 Z' O9 h( e1 u" Q# D; T3 A 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 6 ?8 Z* O& @& h; l
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 ! B" ]2 R! o0 F) Y' R
figure; % 新建一个图形窗口 ' U. e p6 Z8 t! c0 I2 R
plot(t,y,k ; % 绘制加噪波形图
- [: @- C8 N7 ^' T9 q/ O hold on;
9 s) B- d0 E2 T8 L; V plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 6 P. s, V2 b; _
xlabel(t); % 为X轴加标签
( E/ ^7 @+ ]7 X- [ ylabel(loess); % 为Y轴加标签
* K3 Z8 g9 Y0 K. r! D legend(加噪波形,平滑后波形); . U# X3 R J2 V7 g) V3 L

' ~$ y. i6 w) D6 E' p* v 【方法五】 ( V/ X! v, { k: D6 P; x5 _
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
# q7 w& E; F7 q1 T5 q2 V$ @ yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
- [# h+ C9 \2 w0 b' @ figure; % 新建一个图形窗口
7 M1 F6 z7 R: Q, m( ~+ D plot(t,y,k ; % 绘制加噪波形图 ' [- M$ P. `+ X, _, T" y
hold on; 2 f8 y9 E% Z7 o% F1 T, q1 @
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 / A1 U. @( r. }( l
xlabel(t); % 为X轴加标签
* U1 [$ [. b5 q, J ylabel(sgolay); % 为Y轴加标签 " R& s1 d" s+ [
legend(加噪波形,平滑后波形);
4 W1 Y. K+ J% y7 J' b) m6 E" A2 i 
" h5 D& u! g: ]
. S4 ?4 A* m! B( g" A" l: }* L5 \( D/ Y9 K* e1 A4 b
4 Z N `- h" l' b6 x
% s- D# Z# x/ y |