|
3 _8 y9 `: |) k, i
如何使用Matlab对数据进行预处理
- O2 M' n; J4 k+ b' l* g# { 在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法 & X0 w ?7 O ^& C) L
1.1 smooth函数
2 t3 \; K( }" m0 Y* ?# E; P$ k Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: - z8 n$ S2 m7 p) X9 U# x
1)xx = smooth(x)
( w( ]# T/ l+ d# T 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: 9 ?7 i: T, O8 n0 T5 ^
xx(1) = x(1) ( ?( Q3 P1 @+ i3 _) x
xx(2) = (x(1)+x(2)+x(3))/3
2 \, y+ `: N1 x( @" j& s xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5 * C# T# O8 ?+ m$ C* y5 M/ J( c
xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
+ p' l- ~' j/ Q+ @& F H xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5 6 x3 N& ]2 g9 ~6 l/ X
2)xx = smooth(x,span)
0 A# H* s% w. f- h9 t 用span参数指定移动平均滤波器的宽度,span为奇数。 ( [" j. Z2 x4 G: N& n9 ^
3)xx = smooth(x,method) / L e- `4 i5 Z" u, @" S, z4 _
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 5 w! W. V8 H. K/ g5 x8 e
表1 smooth参数支持的method参数值列表
& ^ l( v% ^. G* v% c 
9 G- x0 U2 R z$ U- s2 o 4)xx = smooth(x,span,method)
8 L4 m- [& t" [% i- y) _9 y 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
1 h4 R3 z* C W# K 5)xx = smooth(x,sgolay, degree)
- D. n' U/ B: ]" C9 G 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
f' D: m/ H( h2 I! ~& v4 a! N 6)xx = smooth(x, span, sgolay , degree)
' L/ [- l4 y5 ~; p 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 $ ~# T0 I# F3 X
7) xx = smooth(x,y, ..)
; h9 I0 R% a0 M7 H' o 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
8 c# t( N$ V! F. y4 j- X' k& R 【例题1】
: ~- n$ D. i5 L; a3 D 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。 $ q6 o& w4 I" j0 A
思路: ( `- R# Y! [0 \/ q
1. 调用smooth函数进行加噪数据的平滑处理; & N4 \ Y; N% {2 a3 H
2. 产生加噪正弦波信号; 3 h- s7 ` o# ]: J( X
3. 绘制加噪波形图。 + `9 l. x; ^5 W( \; g" [
解题步骤:
8 |# X- G U' S S8 Q 1)构建数据 ! T+ a' g0 B9 j3 v) w3 [6 w% D; h
t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
9 S5 V% C5 W; ? y = 100*sin(t); % 产生正弦波信号 4 s- ?. X1 T" P
% 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号
' d- T0 L) @$ j, C9 j4 L noise = normrnd(0,15,500,1);
' L- S' ^) E5 l1 q2 t7 U+ \4 x5 z2 t y = y + noise; % 将正弦波信号加入噪声信号
3 A& z& \; \5 Y' c+ x" ^- x 2)制作基础图 . U5 G2 ? T$ Y! n
figure; % 新建一个图形窗口 : ~+ X7 t: u5 v6 P1 P
plot(t,y); % 绘制加噪波形图 ; X) y! M5 x: ~4 K& x0 @7 S& t, ~5 S
xlabel(t); % 为X轴加标签 ( X, w5 ~6 {1 @8 J: W7 H
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 ) u) A# d- Q$ \+ {' |; j

' @5 s; H1 z ^; w- f) A0 w 3)制作平滑波形图 4 @8 z X0 G6 `1 W6 f! {
【方法一】 - J3 R4 E+ m1 Q4 d2 d4 N& {$ e
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 , h* J6 ]8 P1 X; g" u! k8 h
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
3 o% J% C) M( {+ C" ^ figure; % 新建一个图形窗口 j; `$ H1 ~( W1 C) P; u
plot(t,y,k ; % 绘制加噪波形图
6 Y' V* [& k' @/ | hold on;
5 c6 ^ q) R! Q. } plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
& O# i. c* J2 L# K# @1 t. Y xlabel(t); % 为X轴加标签
+ j: q9 M- A- w2 L ylabel(moving); % 为Y轴加标签
, q/ K b( D; r legend(加噪波形,平滑后波形);
& U! |# {* G _' `* @% a+ _1 E 
8 w4 ~" }/ |* H% z; V8 n% ] C 【方法二】
. u6 y5 M; `$ u0 o$ n& R 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 " H3 t k6 C5 s
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理
6 t/ U3 q) d, ?2 Y) Y4 m figure; % 新建一个图形窗口 0 u6 S* t5 z1 d2 I G( K: L
plot(t,y,k ; % 绘制加噪波形图 ! Q! k- q9 e* A
hold on; 0 T% e8 g0 j# f6 U2 C# R6 x' J
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 ( d$ `1 T: T1 T: m
xlabel(t); % 为X轴加标签
" w/ s# ~' p! G) {/ f ylabel(lowess); % 为Y轴加标签 . d$ F7 t( n# \4 E
legend(加噪波形,平滑后波形);
J; O& S7 E/ k2 J7 m( ] ` 
) u! a2 X$ q% p4 ?; T) N$ i$ L% h7 n 【方法三】
" M- K8 V; {% D7 t* M/ p* w 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
; n+ S! ]7 { Q6 R% } yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理
9 k- O( b) U6 P- y6 H, T6 ? figure; % 新建一个图形窗口 7 O K8 Y- @$ X/ J1 p1 O" H
plot(t,y,k ; % 绘制加噪波形图 7 {9 q( }* X" m# N; @+ H: L
hold on;
- w% k7 A. E9 f+ d" U plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 1 s- W& P+ q3 u+ H; k
xlabel(t); % 为X轴加标签
; r1 s1 W6 t, P0 d3 |1 z- h8 I7 @; y. J ylabel(rlowess); % 为Y轴加标签 3 v' ?4 f$ V0 K2 E( p3 S
legend(加噪波形,平滑后波形);
8 N" V& e1 x$ F4 W  % K% z) d) i9 D9 E$ `5 ~
【方法4】 " x& i. M$ N, [) `: W
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 . U- Y3 ?( ?# P/ E G7 R, w
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
3 X _ E! \$ }. Z0 i* d# g: Q! X figure; % 新建一个图形窗口 , T% t! ^$ A- _; ~6 T% k p
plot(t,y,k ; % 绘制加噪波形图
2 d4 e" p' d6 p8 I/ W, ~( u: w4 P. Y' s hold on;
2 ~3 y* l0 S, k6 F# a. [- S plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
7 x# n3 z2 U* t" G xlabel(t); % 为X轴加标签 , K2 d* z* \; E) `# m8 U
ylabel(loess); % 为Y轴加标签 6 Q. F: `$ h! u5 x
legend(加噪波形,平滑后波形);
7 y& }+ i' }. Q( n 
9 i9 A4 J1 f, b 【方法五】 % v: Q* [7 e5 i1 t* b
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 4 s+ J6 z: p, {. p# e" h0 \ q& I
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
3 @7 C1 o w2 B figure; % 新建一个图形窗口 ; X' A6 X( j3 O: Z# k
plot(t,y,k ; % 绘制加噪波形图
3 o, b/ U+ u/ s' a/ B hold on;
2 l0 d" ^2 h! z7 g- a plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图
2 b8 l! o4 Z& D: z6 I1 `- c. W xlabel(t); % 为X轴加标签 9 d3 m) P. c( D' \: L- E
ylabel(sgolay); % 为Y轴加标签
- e- h& j0 t9 L4 i1 L4 X% ?: n legend(加噪波形,平滑后波形); 7 v2 |! W, u' c- n1 G/ ^2 Q
 , O; |8 x+ k' m" z8 b
; S: @* H$ L+ \* B$ o
& i+ e- m" h* Z& g* K) S- |0 J) u3 }, s7 `9 b
9 J& U; i8 O3 O& t. x+ O
|