|
& I% B, B3 W- Z0 `1 i! H" q8 O0 c 如何使用Matlab对数据进行预处理
9 ?& Q9 T2 b9 ]- v( F6 B8 x) R 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
& ^# N- m& T- ?2 r 1.1 smooth函数
$ ], t0 ?2 V, l/ ]8 e$ N Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: * V5 h- p, X6 n+ Y$ }
1)xx = smooth(x)
1 g' [1 i7 N' E% ~/ n 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: : N7 H3 j9 u# M5 Y0 ~
xx(1) = x(1) . x' b6 }4 l+ J; ^9 t
xx(2) = (x(1)+x(2)+x(3))/3
* `, ]+ Z0 g% u# ~0 f xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 0 n+ d$ |3 L* L$ S* ~) ]' i) q
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
0 I; q) D) S& ~% B xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
+ {; }# X9 |3 e/ U2 w2 B 2)xx = smooth(x,span)
- V# w" s5 v- C+ l 用span参数指定移动平均滤波器的宽度,span为奇数。 , B: [0 W2 K5 M- _
3)xx = smooth(x,method)
" q: Y( }7 C/ Q, n3 S( x 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: # B& ?9 N; c" M: _
表1 smooth参数支持的method参数值列表
0 g0 v9 C7 o) _+ W: ?* w9 g6 J  , P, \3 X8 t9 B6 Q+ ^3 x. V' {5 [
4)xx = smooth(x,span,method) 4 I1 |, W& y6 O+ i8 k" }
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
9 D& j" k8 P; Z 5)xx = smooth(x,sgolay, degree) 1 r) P" A$ z2 D3 t
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 . M. d Q3 R3 r W
6)xx = smooth(x, span, sgolay , degree) ~3 d/ Y/ I- B( s- D! t+ w
用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
$ q& s0 b6 i, j 7) xx = smooth(x,y, ..)
) ?# z9 O* T, h9 q" R# V1 d( \ 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 & ], E) g0 A+ z, F/ V6 e2 k# t
【例题1】 6 K# L8 i) x1 e" \4 O7 O% a5 D$ |1 ~
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
3 d" x4 u D! x; ` 思路: ' y! G( i, d- f7 B6 b
1. 调用smooth函数进行加噪数据的平滑处理;
' X3 s3 C$ e1 E+ z# s 2. 产生加噪正弦波信号; 9 D) I- ]2 G8 U( T9 m- _8 O
3. 绘制加噪波形图。
4 i/ ^3 F" S4 c* U 解题步骤:
, C6 _4 f" S& r3 E/ g5 ~ 1)构建数据
! g/ c0 p' E7 ]& l$ D3 `1 q* h t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
8 X- Z) B8 ]! g) q( h5 _" m y = 100*sin(t); % 产生正弦波信号 / }' v8 t$ ~; |2 A& U2 w4 B
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 1 S3 `! u4 [: `* f0 e3 I
noise = normrnd(0,15,500,1); 7 o% u1 Q S* H
y = y + noise; % 将正弦波信号加入噪声信号
7 Q; b6 Z0 N% ` 2)制作基础图 8 M! V3 o2 P" t# ?
figure; % 新建一个图形窗口 1 C5 |/ A. p% x' ^, v7 |
plot(t,y); % 绘制加噪波形图 % u0 T# A: E& b, o1 @* b( c$ E
xlabel(t); % 为X轴加标签
3 h4 J+ o9 z _' X9 i$ b' ] ylabel(y = sin(t) + 噪声); % 为Y轴加标签 4 b( H* ^" u% M6 C4 {9 q5 V

Q4 d8 v$ [0 o 3)制作平滑波形图 " Q6 w$ Q) ^7 n0 l
【方法一】 3 `) |- f/ v: i, }
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
7 ]! T& r. M. e7 y yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
; C) O6 U2 y/ [& y' n, Q Y4 K figure; % 新建一个图形窗口 : x; k3 |3 P& r
plot(t,y,k ; % 绘制加噪波形图
! V M5 d4 ^- R& }4 u# Z; r# C7 P hold on; / R2 I {- L+ J' G/ X% }$ K+ W" ^: [
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
* b5 C# q& h- | xlabel(t); % 为X轴加标签
/ t6 S: m+ s3 x* T ylabel(moving); % 为Y轴加标签 . `2 [! Z5 h: q0 X3 U( ]; v
legend(加噪波形,平滑后波形);
: P0 x/ i! ^/ ?5 B  ; K6 m, f3 `3 F. O- F# K
【方法二】 7 p7 ]# U. ]9 y1 U
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
, w, K# c9 D# W( D! ?1 f4 A yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 6 I* l! i: ]3 C( {$ S y* C
figure; % 新建一个图形窗口
$ Y9 ~ E5 {& c7 P: s plot(t,y,k ; % 绘制加噪波形图
' e6 {: X8 a# c# z, a hold on; " p. z7 `, _) b* v" l
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
4 L. t% n* g" j3 z* X xlabel(t); % 为X轴加标签 : `9 u) N# I+ a3 m/ o4 E# E
ylabel(lowess); % 为Y轴加标签 1 M( D6 o$ n2 c" z2 M: p
legend(加噪波形,平滑后波形); % U* @) I) n7 I. i: B4 Y
 8 @9 Y7 D) @! M
【方法三】
3 K# e: F+ W( k0 }. [ 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 8 f( o# x6 X% y4 q, k/ Q$ p& m3 [. R
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
+ V# T) b/ I/ e' t( D figure; % 新建一个图形窗口 : v$ X M5 r+ E
plot(t,y,k ; % 绘制加噪波形图
; Y- y1 B w& X0 c) C hold on; 7 e8 V; L, V! f
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 + x. \ ?3 n' G0 b5 _
xlabel(t); % 为X轴加标签
' L- f% j5 p0 R* o" X2 i F ylabel(rlowess); % 为Y轴加标签 4 x( i Y; H- O; w0 D) ]7 g
legend(加噪波形,平滑后波形);
( V# S$ r# i$ z! a4 B# }  , k3 c5 Q$ D+ ?" F) e) X! q, a
【方法4】 ' M; T9 I" G# L1 s' S$ [) k
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
; h4 {. P/ ]" m$ N& {& s7 p& F yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 P' M3 O$ G. }$ P
figure; % 新建一个图形窗口 0 O' P3 D) c. {/ V' Y T' T9 F
plot(t,y,k ; % 绘制加噪波形图 4 E3 {) q: W, k+ O1 O& w
hold on; 4 }" m/ C4 I3 j
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
* f3 S3 b% d! ~- c# x5 _2 k xlabel(t); % 为X轴加标签 $ U" v5 N# M' \- t
ylabel(loess); % 为Y轴加标签 - @7 r* ^8 w; I7 e# d
legend(加噪波形,平滑后波形); ! h) _' {5 W/ F4 n
 + n2 ?" }3 v/ d+ k- J8 H# C
【方法五】 ' N+ v5 n/ p+ S+ X3 V9 y% J; B
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 7 s. {6 S5 |. g* J
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理 ( o. I$ U/ i- m, G4 \! L+ ^
figure; % 新建一个图形窗口
0 f+ i$ n8 ^5 Z* g | plot(t,y,k ; % 绘制加噪波形图
) y# e! S/ C, ^( g hold on;
# O+ d7 q& R, Q' n1 P plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
, O6 H% ^7 ]( S xlabel(t); % 为X轴加标签 / e1 Q% P* K* q, c0 F
ylabel(sgolay); % 为Y轴加标签 . c: r! _0 [& c, l& S3 ?) \
legend(加噪波形,平滑后波形);
+ N! s8 T! [. J& I4 B  6 \4 P) h0 L- w5 S8 A
5 u9 M* {# D, o! V
% l5 b4 [' R/ G! b& i* c0 Z2 Z3 C9 c* z, M1 v4 h
' d# t9 P1 ]7 M
|