|
" j6 @" d* W: L1 h
如何使用Matlab对数据进行预处理
8 L; c; s% m7 W8 t 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
" f/ c3 a9 V& D- G5 H5 j L& w 1.1 smooth函数
/ ^1 a% q$ M0 m" R- g Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: % B% ^$ m$ O1 A, L7 N
1)xx = smooth(x)
$ E; K6 Q+ F7 {' J# s* I 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
, _9 o# [0 X# D9 j xx(1) = x(1) $ m% R2 Z3 W( Z
xx(2) = (x(1)+x(2)+x(3))/3 & Y$ t' I5 c3 j& `0 O( j
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
% m6 Z. m% P8 G# C: y7 C0 N( R xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 , g( H/ Y8 {/ T- U" p) ]9 A
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ! ~7 M, r- Q! x7 o4 n5 E! D% H
2)xx = smooth(x,span)
2 q! l- x- |2 h) O) X 用span参数指定移动平均滤波器的宽度,span为奇数。
7 @) {, j8 ?8 Q' E/ n9 j% \- q% x& q# b 3)xx = smooth(x,method) $ t# ? k/ G1 V2 O
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: - T2 Q8 f. p, r; M1 G9 l7 _' j
表1 smooth参数支持的method参数值列表 8 g( t3 t5 [/ a; U B5 ~# ]

2 r% w9 W$ `' E. l1 M( u. ~( [ 4)xx = smooth(x,span,method)
& a7 \! j* P# g$ F 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
( n7 j! P1 i/ w h% h+ X 5)xx = smooth(x,sgolay, degree)
2 A* D1 _' T. G6 ^& Y 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ( W2 _2 {8 j( z& i
6)xx = smooth(x, span, sgolay , degree)
' N: K: X8 Z& d& P 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
% o& ]2 ~* J& v5 o; Q 7) xx = smooth(x,y, ..) % q* J$ F* _9 x0 G$ e6 u; D5 n
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
$ M9 {3 B( u. _# ~, w1 q 【例题1】 ! K, v8 ?3 I4 `8 H
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 ) d) r6 j* j, d U v& k
思路:
! [. G. q* g* u& T# D 1. 调用smooth函数进行加噪数据的平滑处理;
7 C7 ]' b+ f1 e5 e. \0 u0 y 2. 产生加噪正弦波信号; 5 N+ v/ B' R0 s, |
3. 绘制加噪波形图。 ; A3 v/ \7 ^' v/ _6 ]. o# Z
解题步骤: % ]$ {( ^% k) X
1)构建数据 4 c% [2 D8 k" W! R+ C0 w
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 I$ {7 n7 Z& K
y = 100*sin(t); % 产生正弦波信号
% e. Q% t2 l8 m6 o0 B5 b% [ % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 0 ?! X9 ]9 [0 ^
noise = normrnd(0,15,500,1); 1 I# g1 v* i7 G) t. B) v5 U- Z- B' W
y = y + noise; % 将正弦波信号加入噪声信号
1 |1 k3 _7 j* c 2)制作基础图 8 t; t# B* s) J: M* i
figure; % 新建一个图形窗口 & \1 H' ?8 Y2 ~6 H; I8 x! }
plot(t,y); % 绘制加噪波形图 % p9 d3 X. A. z/ X; C% @; _ j
xlabel(t); % 为X轴加标签 2 f( m G( @6 ?" y& n# K/ B
ylabel(y = sin(t) + 噪声); % 为Y轴加标签
7 O* S# ~0 W! k1 l+ u+ Z% D  7 S* I( F% z9 w0 w) M
3)制作平滑波形图
, j5 `, Z- Q* W1 O* N! B 【方法一】 9 H9 c! ~8 r0 |
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图
: m8 c% ]7 e d- s( z! c; k yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 5 {8 ~- F7 v2 {$ F& D
figure; % 新建一个图形窗口
0 D: N' M4 R! d! B" V8 w0 j2 s plot(t,y,k ; % 绘制加噪波形图
2 H2 z$ \ p* x5 W hold on; ; g! I/ Q/ F* B! \& m
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
1 w/ J9 A3 }3 C9 I, y xlabel(t); % 为X轴加标签 . q" J$ V7 e4 d, w9 l/ [
ylabel(moving); % 为Y轴加标签 3 D& R. T9 u& o$ R0 B& j
legend(加噪波形,平滑后波形);
" ]; Y D9 h! u5 C, X$ x- r @, |) D! N  - d! _8 `/ I9 M' l7 l" [
【方法二】 & ]# c! F" c B* N' m
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
3 [4 u% P! P6 B- b8 l+ ?4 t% n yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 J- S) c [) l, |# Z& `
figure; % 新建一个图形窗口 2 L- Z, x" x2 q7 O
plot(t,y,k ; % 绘制加噪波形图 " E$ p1 h7 W4 o# C8 {
hold on;
7 ?: A' e: Z" h9 C* X plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
) X7 e# r/ Z* Y: N* q# K xlabel(t); % 为X轴加标签 ! U7 D4 C4 p2 t; t3 `8 s
ylabel(lowess); % 为Y轴加标签
$ Z$ n1 c) Z8 Y. s3 t legend(加噪波形,平滑后波形); 8 |$ {. O( i$ H2 j
 ( f0 u9 i/ z' C( f; ]: j, F: h
【方法三】 / B- R' O* ]0 h; o: w+ O$ l. L' n8 ]
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
2 n1 b# o% K# T$ }3 \& s; v yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 ' g' X) n5 x. P4 B4 e, l9 l/ W
figure; % 新建一个图形窗口 " x5 z0 B+ g/ P& e& j
plot(t,y,k ; % 绘制加噪波形图 3 M* k7 Q' i) ?8 c
hold on;
8 |. ^2 Q' E* d, S plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
2 ?: u) b. N ^" }- K3 ] xlabel(t); % 为X轴加标签 " P" |2 {1 |& W6 f' t9 [
ylabel(rlowess); % 为Y轴加标签 0 i( c: z+ i7 C) U8 b
legend(加噪波形,平滑后波形); ( }5 f2 p- |7 R' p

3 W. q! K- X7 t8 @$ H& L 【方法4】
7 s( Q2 }2 R# H/ e- e! R# m } 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 ) h% \$ v% i2 g% l
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
3 j, u7 q% l& b( ? E figure; % 新建一个图形窗口
7 `0 `6 L) N: K3 r& ^ plot(t,y,k ; % 绘制加噪波形图
8 ^3 K6 w2 s Q. Y hold on;
N5 a- p6 b5 M plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
8 l1 K5 i# f1 B G0 i( J xlabel(t); % 为X轴加标签 " _7 r: S0 |+ F4 m/ c. F
ylabel(loess); % 为Y轴加标签 8 D) n5 n3 X7 s5 E. X/ R
legend(加噪波形,平滑后波形);
3 _1 m* [4 R6 {5 q, b 
* S. C7 Z" {; \1 j( \ 【方法五】
) o6 b% n2 Q8 K 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
* b' F6 n; c* Y' X$ Y* Q# u$ d yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
' a1 y$ t- S8 X" E figure; % 新建一个图形窗口 ( `7 Q3 Y6 n" V7 U* v1 Y
plot(t,y,k ; % 绘制加噪波形图
- v/ I9 v% h0 h+ V. S hold on;
0 V& _% b9 s( D9 I5 s plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 : J# r: F" e" c$ g8 a$ {7 {
xlabel(t); % 为X轴加标签 Q% g- J7 ]; b% @" @, J6 J* f8 H
ylabel(sgolay); % 为Y轴加标签 + Y7 U! Q- T, I) K# L
legend(加噪波形,平滑后波形);
. C f# B" X4 E9 L& Y 
, _5 N: u5 e* d5 R5 u+ Z" Z, P
) k3 S" F( ^6 U. \& O2 Y' Q# Z$ Q& c; _( f
' b' H8 N- f/ h) r
/ W# E2 `: P+ H' ^7 L3 S$ W |