|
$ v1 v. v A+ t
如何使用Matlab对数据进行预处理
0 w5 d, C& \. U 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
& {1 ^& r% {! h* m( b/ Z3 S2 C* X/ B 1.1 smooth函数 6 E9 t; |! R! y( x6 i0 H
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
9 P+ g: b! a" Y3 J7 R& f) g 1)xx = smooth(x) / F9 N0 h6 B+ B5 l F
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 8 u& s. ^" c8 ?4 ?" v i
xx(1) = x(1)
- L' f. O; N9 }. | R8 _! T0 Q xx(2) = (x(1)+x(2)+x(3))/3
1 x9 u; I- Z, h1 g9 R- P xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 * h) T9 b" @' o- a7 e
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
% B& x- _% t6 R, C! V* }9 ^% z xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 ( C- E, c9 u5 G4 L+ M$ y
2)xx = smooth(x,span)
( k0 D( ^, v; k1 A0 n$ V 用span参数指定移动平均滤波器的宽度,span为奇数。 : {7 ^, z& B" m( W6 S
3)xx = smooth(x,method)
- ^: y+ i/ p' |2 Z& b 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1:
5 Z- \5 d$ ^, F* j8 {4 _ 表1 smooth参数支持的method参数值列表
2 u/ L2 ^# G+ @+ _* k o  $ t6 q% [( {" t$ t p2 N
4)xx = smooth(x,span,method)
' t6 Q% ?! j; h 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
1 ?5 @7 q- t1 M/ l 5)xx = smooth(x,sgolay, degree) 1 C% F [$ g: U4 Z* S
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
/ k' E. V4 y% v# ^& M3 U0 N' _ 6)xx = smooth(x, span, sgolay , degree)
- Z+ Y4 G# C# G: a ^ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
/ v8 M$ e$ J9 Q, m& _- r2 J 7) xx = smooth(x,y, ..)
, n* E: ?# W4 y i, { 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 % Z- n& Q0 V' t* w
【例题1】
+ W9 V& I/ U; U 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 # C3 N6 ^3 ^) ]7 Z7 @
思路: $ E/ z, R; p+ D) w7 B
1. 调用smooth函数进行加噪数据的平滑处理;
7 v% U7 E" L$ x) U' S' f8 A 2. 产生加噪正弦波信号; % u4 L; V6 `3 t7 y- L6 j0 ?; U
3. 绘制加噪波形图。 * y) u' b T" n+ E$ E& M
解题步骤: ( F* Q7 l8 [6 r4 R6 Y2 x+ c; M- _* q
1)构建数据
" N, M/ u$ P$ n t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 7 P& a+ R% r- }# O' d* u5 c
y = 100*sin(t); % 产生正弦波信号
( d6 b" ^) Q7 n' M % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
& v5 U3 M& q) ]; k noise = normrnd(0,15,500,1);
5 y! y1 f8 p5 R v; q! i y = y + noise; % 将正弦波信号加入噪声信号
' O0 F, H: _5 ~, q 2)制作基础图
% t! j( |8 ] a& f2 s W figure; % 新建一个图形窗口 5 _0 ^3 w9 n% x2 ]7 ]8 W' W; }
plot(t,y); % 绘制加噪波形图 9 q |$ w: S1 a3 n
xlabel(t); % 为X轴加标签 " f% U' L: V; ~. F
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 , R' ~% O' w3 `
 3 d0 y5 n6 b6 l. A! N7 {* m. W
3)制作平滑波形图
3 \" U. Q, o- ~" ]( r$ g 【方法一】 * L" F( |) D/ B+ P, F7 f
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 0 z5 ^! O' e* }, V+ B9 ~. e
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 ' ^" J1 F X. ?5 i4 H2 b: p
figure; % 新建一个图形窗口 C3 q) }1 I* a) h+ ^6 S
plot(t,y,k ; % 绘制加噪波形图
7 @$ Y% p. \$ B7 l. s hold on; + D: c, T U# w, }9 h: x* S6 P* G
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 & C1 Q1 M- a6 y
xlabel(t); % 为X轴加标签
% U+ A5 E1 z* y5 l7 [; k. H ylabel(moving); % 为Y轴加标签
( `1 S9 M* e% V; H legend(加噪波形,平滑后波形); 1 {; a9 G4 y8 r, h0 x

- N) T& V- W- w% L# D8 p" F" u 【方法二】
1 r( j5 _! E) V! f; a 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 5 W9 v* G! k, ^' K+ h& s* C: B
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
# G' A& [9 c8 O2 ?) h figure; % 新建一个图形窗口 , L3 M, S8 i9 M, q8 }. _" b
plot(t,y,k ; % 绘制加噪波形图 # K3 N0 }+ O% f; R# l0 ?4 w
hold on; 7 e* H/ p6 j' ]7 X
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
# o- `' H+ s, x xlabel(t); % 为X轴加标签 # g& R# a$ {+ [" u
ylabel(lowess); % 为Y轴加标签 + b1 i3 ?# C$ D/ P
legend(加噪波形,平滑后波形); % A( E$ y6 p) i5 n' s8 |
 $ R& C4 Z' h& I6 ?( Y) w, h
【方法三】
( ]9 [; z& g; A" E 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 @) b0 }, c/ d( }. B% V
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 - O$ ^# p4 A0 ^ W
figure; % 新建一个图形窗口
% m7 r3 Q( D6 U& E plot(t,y,k ; % 绘制加噪波形图 - w- [* [7 h, ~7 c! @, O/ C
hold on;
6 r2 S% h+ e1 v0 Q9 J' u plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 3 s1 u# y5 V, ^# a% @
xlabel(t); % 为X轴加标签
; R e; P7 g) R4 n; E a ylabel(rlowess); % 为Y轴加标签
* q) u, T$ _% I3 c' S' d legend(加噪波形,平滑后波形);
8 ~ k$ X2 i1 ?1 }7 D  . J5 C, Y( N8 ^# E; q* O t
【方法4】
) ~0 S; F( l0 v. f3 t4 Y 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 & P; P7 w+ {$ E1 M+ ~
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
1 i( C1 d& e5 P) L" P+ F figure; % 新建一个图形窗口
$ R7 g' t X3 o z8 Q9 u plot(t,y,k ; % 绘制加噪波形图
) R) d$ S+ V" i/ ~! T' m) U0 s hold on; i( j" j3 y! Y# y7 ]/ Y8 z6 m
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
5 O: E/ m7 \; u4 \; ]1 A% Q& J! h xlabel(t); % 为X轴加标签 4 ^, `/ x& [$ \2 R7 _* s$ r5 g! ~
ylabel(loess); % 为Y轴加标签
9 }+ n7 ?$ d# k0 _: C& E legend(加噪波形,平滑后波形); 9 t% V# u- n/ x n1 Y
 2 S2 q" H2 S8 k( a/ ]. T: _) F
【方法五】 ' ~, q, d# I( ?% { a2 d
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
7 G% A/ W/ `3 h) N# C1 k# P yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
+ |5 v" p# V: T+ q# Q0 u figure; % 新建一个图形窗口 9 r4 k0 [$ T; D3 Q) m( } ?5 D+ d8 D
plot(t,y,k ; % 绘制加噪波形图
2 Z6 |. u/ i0 l+ [ hold on;
6 l8 G: r; `. Y& r1 c7 N4 l& T plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
. `' i% p6 X4 L. |7 R xlabel(t); % 为X轴加标签
0 n8 `9 D9 Z" H% z; y% g ylabel(sgolay); % 为Y轴加标签
# D9 L4 D, ~. Q* I! J+ a legend(加噪波形,平滑后波形); " h" c$ g5 _' a. ]- N& F0 d
 , t* V7 I: d6 {; v/ o# ?
9 r T) q. R' r/ o
: R t" r" c9 |' A% b( _
2 z1 s6 {8 o+ @# k) n6 ?4 |
4 ?6 A3 x1 l% [5 R |