|
2 K3 I1 I9 Y/ S; `2 n" Z, y 如何使用Matlab对数据进行预处理 x6 ~6 @9 m8 n. M" K; ?, j2 h
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
- x' G4 x4 F, i$ H: Y 1.1 smooth函数 3 D( i" `: _" G# M
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
+ S8 \" C3 U6 D 1)xx = smooth(x)
# A& m( g! I$ R7 j9 z 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
1 L; e/ c7 r% A: t xx(1) = x(1) . g4 d: X2 D5 F- C1 b
xx(2) = (x(1)+x(2)+x(3))/3 . r) t. I2 D+ g5 i2 P/ Y* V
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
! s& @7 T3 l, P+ y+ c9 A$ F xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 1 Z! j+ Q+ D* B
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
, r* _1 S+ m% \8 H( v* p# Q 2)xx = smooth(x,span) 5 h: d, f( y0 W
用span参数指定移动平均滤波器的宽度,span为奇数。
' R# r1 G- V$ \$ k! C: ?( I6 w+ W 3)xx = smooth(x,method)
y3 j, o: ~$ s/ w9 y& \3 h 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 4 b0 |' o0 H2 s# u6 I; t
表1 smooth参数支持的method参数值列表 & B r0 K* {* {

% x6 q+ |3 ~' e: r0 X 4)xx = smooth(x,span,method)
8 }5 k ~2 n) A9 y2 Y0 L& M0 Z8 s 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
& [6 U! J w$ z+ _7 B" W/ b 5)xx = smooth(x,sgolay, degree)
+ [4 Y" A8 m* I/ S 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ; [- R1 x# `; n' o$ w; \
6)xx = smooth(x, span, sgolay , degree)
8 Z. [; Z% W* w4 k 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
9 q5 r9 l' B- n! ?( [8 D+ p U- T 7) xx = smooth(x,y, ..) 9 |, A8 Y+ r. p o, `4 D4 W8 |
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
( {0 ^9 ~2 ~. [7 }6 d' x; i 【例题1】 . `: N& }. p: m+ z8 e' ?1 I
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
* L, Q& R* n3 J/ U: T 思路: % }" O- @9 O- n' T" w0 X
1. 调用smooth函数进行加噪数据的平滑处理;
7 C& o- m$ h% Z6 f+ d4 Y/ B 2. 产生加噪正弦波信号;
) m- d7 @" B7 c$ _) A6 V9 m 3. 绘制加噪波形图。 1 S. K5 `' q' y1 z/ j
解题步骤:
1 ?6 _* a! \% g! U' d 1)构建数据
4 M' a: f0 c- X2 v t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 . J) M% L' V( V: n. L4 e
y = 100*sin(t); % 产生正弦波信号 0 I7 N& r5 u5 q" D# c5 f1 j
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 ( w( Q$ l% F. p' V& o, J0 u
noise = normrnd(0,15,500,1);
1 @) W* l1 X5 v) a y = y + noise; % 将正弦波信号加入噪声信号
/ k# {1 |9 `% e9 M 2)制作基础图 : T# ~9 l0 Z3 R7 a+ |
figure; % 新建一个图形窗口 " d- _0 h4 r. y/ w9 w
plot(t,y); % 绘制加噪波形图 8 K6 n6 l1 [, R2 M. E* n
xlabel(t); % 为X轴加标签 7 T( n' N% n5 X. i" C7 f8 _
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 3 `8 i4 | |- g; y# `( `. d

M0 r# L7 L$ E) g0 S0 g 3)制作平滑波形图
5 v. k; c( e. O 【方法一】 + _5 [8 W$ M t) g, H1 S6 C
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
" Q9 A2 t3 N e* y5 J yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 , ~, m; P& _9 e* L" ~) @
figure; % 新建一个图形窗口
1 d% @6 p; [# c8 U. \9 @" x/ N plot(t,y,k ; % 绘制加噪波形图 / A! z8 ^/ |0 h% c. u
hold on;
9 D+ N$ q9 `# P* Y- R3 m plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
* U- c0 F. Z% z8 P! L- ] xlabel(t); % 为X轴加标签 2 R. a( d6 c A
ylabel(moving); % 为Y轴加标签 $ F( u1 S7 c2 s# K) t
legend(加噪波形,平滑后波形);
3 N2 z9 Y) g4 [3 @9 T 
/ R; {4 T7 C) |5 c2 O/ D7 Y* q 【方法二】 3 E# G0 @% E' q2 I# z0 ?
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
1 Q8 u# w4 P6 |% f yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
$ x' M0 I0 j: }) p4 Y( C+ t* v% c figure; % 新建一个图形窗口
. s2 v- O' j/ P+ Q" L plot(t,y,k ; % 绘制加噪波形图
, s# ]/ D& W6 L& k( A hold on; / H1 }6 y" g+ k0 r. x N( ~* Z
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 5 Z& T: |( O% _ T
xlabel(t); % 为X轴加标签 ; T8 a1 @( d/ l0 i; d/ i9 d, l7 s: h
ylabel(lowess); % 为Y轴加标签
4 H0 |4 l+ f$ H( W# ^ legend(加噪波形,平滑后波形); 2 s: _, J, p! b U3 U; c

7 I1 n5 d6 x; V* D 【方法三】 8 L2 K: [ D1 K) g- Y# j/ z) b
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 - c! S; J1 j( O4 r1 M3 [, n) Q
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 J$ ^1 U8 G5 d2 t9 f
figure; % 新建一个图形窗口
. W0 D4 a( S! ?8 \7 E plot(t,y,k ; % 绘制加噪波形图
+ f' u# s! A+ G: J hold on; 4 m; a2 d2 k: n
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
0 i* c! S: [2 y/ n- ~4 G8 m' X xlabel(t); % 为X轴加标签 # G4 C; C ?, a6 g
ylabel(rlowess); % 为Y轴加标签 ) F' Q2 r( ?3 v- T
legend(加噪波形,平滑后波形); 5 {9 r6 V$ N% e D
 5 T% x8 ]8 w5 F
【方法4】
1 L6 P# M: ?1 L 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图
' N$ Q2 H' f; V4 j6 L yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
5 ~- e* P, Q7 E k: w, b figure; % 新建一个图形窗口 8 ?1 d0 w4 ~! W
plot(t,y,k ; % 绘制加噪波形图
1 g1 [/ N/ U9 x* X: q hold on;
- Q+ w* W1 E: f# T plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 . C! G e. W6 @, d0 m! p& H
xlabel(t); % 为X轴加标签 , `2 Q% V) P' k, V, A8 i7 A. S. c- E! L
ylabel(loess); % 为Y轴加标签 * s D5 c( V2 T) s. n5 y
legend(加噪波形,平滑后波形);
4 d/ ]: M) d$ Y& X4 v# w" C  8 h, m+ l1 s) Q
【方法五】
t5 M" q; W4 m 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 , h2 W0 [( y5 \1 c4 [2 {& w+ W
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
# Y$ V1 ~4 w9 n+ U4 ~4 v$ } figure; % 新建一个图形窗口
T- `0 A+ V; H" D- b( t0 S9 B plot(t,y,k ; % 绘制加噪波形图 1 l! ^" x" |* O* l# Z6 T
hold on; # F$ Y; `& q5 [3 o+ N0 f% y" o, ^
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 . E* S3 x3 @* _; h( A
xlabel(t); % 为X轴加标签
$ S/ X+ c$ P6 p) e ylabel(sgolay); % 为Y轴加标签 , x1 ?' j+ M' u0 ~% V
legend(加噪波形,平滑后波形);
9 \/ Q# v: o+ T. ^/ V' x$ C  * N: ?, B7 x$ c! z' H+ K8 [) J
8 ~" j L" s' P8 g! K
# L: p0 Z4 }% p) A6 |4 E# Q7 }& x: _" I* G) ~) q
, m7 _$ n3 P. k5 e( r" ]2 `7 o6 T |