|
% x9 Q/ S5 p3 b6 M6 X. _+ t; q& M 如何使用Matlab对数据进行预处理 0 @; L* J! h1 l0 I2 r
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
4 p$ M+ B: I& I% C' ^: } 1.1 smooth函数
, ^- c0 J$ |, |9 m' c% Q) `+ b Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下:
* g7 R9 l$ J( ^0 S 1)xx = smooth(x) " A1 ~$ B: l1 Y5 \
利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: + M! b' U) T# ]: h6 g$ M
xx(1) = x(1)
- S& j( u1 G' _ G0 O# V5 n xx(2) = (x(1)+x(2)+x(3))/3 , }" J3 E1 T* f8 x5 d9 z! \0 P2 B; O
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
6 V% u* ?& {! P* Q9 V @ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 7 ^& \ ~* f g
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
( J: W6 ?5 J" C* V 2)xx = smooth(x,span) : t$ r+ t# D! X
用span参数指定移动平均滤波器的宽度,span为奇数。
4 W* f4 U* C( R3 K# V# _ 3)xx = smooth(x,method) ; a3 l7 G8 I4 H
用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 8 [7 E. U0 a$ g
表1 smooth参数支持的method参数值列表 3 c" Z5 d. f7 |+ U% _2 i# P. g. i; W

9 G$ _) H2 m3 @! @3 C0 t0 J5 p 4)xx = smooth(x,span,method) % j9 Y4 Q. Y- U5 s9 Q& i
对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
% O9 s) F3 g }# y0 }1 U+ {3 n. J0 G 5)xx = smooth(x,sgolay, degree) 1 M; K" n3 J0 i3 B& ~3 M0 H: W2 A
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。 ; ], P6 H) b1 t6 x" k
6)xx = smooth(x, span, sgolay , degree)
8 X# {( x) ]* Z" G9 A4 r, j# w8 q& P 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 K% O% o1 R7 u* f3 F
7) xx = smooth(x,y, ..) , c, Q& M& c& M) B
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
- x; e4 I9 P# H1 `8 p; o. W 【例题1】
! t" F: Y# [( ~( r9 W; b* `2 d 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
f. S1 B6 J7 j& j# H! s, f 思路: . L. t3 ~$ I9 m
1. 调用smooth函数进行加噪数据的平滑处理;
6 R, i* H$ Y! Z 2. 产生加噪正弦波信号; 2 T9 d4 ] W; T: U
3. 绘制加噪波形图。 + ^5 |# K$ L. T) X$ ~
解题步骤: ) \' \. f' n* r1 j
1)构建数据
" g: o2 K) b9 h: ?" j t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 6 K# l) ^! a' i+ D( h
y = 100*sin(t); % 产生正弦波信号
+ s* q8 }% {& I8 ]5 k$ i % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 % S& K( k1 Q7 Y2 v3 ]3 B* X
noise = normrnd(0,15,500,1);
[$ _7 N& A f" F* Y% ~ y = y + noise; % 将正弦波信号加入噪声信号
, Y. a4 t2 S9 W* M% f7 n 2)制作基础图
: u* K# O- L1 |7 j L- T figure; % 新建一个图形窗口
: F- T' j5 f' E; y# Z6 L; @ plot(t,y); % 绘制加噪波形图 6 Q) d* Q& i1 Q
xlabel(t); % 为X轴加标签
5 o! v( B/ `5 m: l# x, o& \( ? ylabel(y = sin(t) + 噪声); % 为Y轴加标签 ; K$ R) q4 g, l8 J. m2 _" ^9 U

) n' |! [ g+ h6 s1 [3 N& Q1 o9 W 3)制作平滑波形图
$ y L1 v8 ?9 T% y% e0 C! j2 t 【方法一】 % w9 @5 z/ g3 L- @- m! ]
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 5 h! T" r, k v8 B0 |9 O5 o9 y
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理 . K) p7 O) t* M
figure; % 新建一个图形窗口 ! T+ u9 t5 f! V6 v/ q
plot(t,y,k ; % 绘制加噪波形图
4 g. `8 c; G7 f7 d6 Z hold on;
9 O- A' O3 e W! ]: V9 R( |8 F7 e% M plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 4 N, [7 n; u3 n4 @! C, G9 y
xlabel(t); % 为X轴加标签
* `6 A6 j0 g/ h" I$ j ylabel(moving); % 为Y轴加标签 # ~' E* R6 G9 W8 r9 ?
legend(加噪波形,平滑后波形); " l. r" Q1 _6 R! `2 S* y
 @, Z$ @1 [9 R! L4 V
【方法二】
9 [( ^' F, I$ |2 {+ |% K$ V& S 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 0 A! O/ ~# t# `+ }- W& ~+ C* t5 e0 M
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 + L" t. d# o7 L1 C n
figure; % 新建一个图形窗口 0 T" Q2 @ ^. W7 }! _
plot(t,y,k ; % 绘制加噪波形图 8 H0 x0 T! u: D: X5 p1 j$ A6 ~
hold on;
5 Z H- `- W7 d; Z7 ~* @ { plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
% W, x. T3 o5 Y# o5 Z xlabel(t); % 为X轴加标签 - ^8 M+ \- j2 u
ylabel(lowess); % 为Y轴加标签 . a* x" O& c# y
legend(加噪波形,平滑后波形); 3 Y& _* p7 _4 c9 g* T
 $ U1 L8 _6 Q) g) ?" @
【方法三】 4 s" q# d; T' u: X' \1 x* _: o/ u) B
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 " v: W! h* o( G4 c; v, N. ^2 @
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 0 m2 V& ^! c0 |; R; `% W- s
figure; % 新建一个图形窗口
; I1 f2 L, c e7 e+ ~( p plot(t,y,k ; % 绘制加噪波形图 / b6 S/ t- M( a1 v. d
hold on; ; ?$ o$ Q U7 k+ T
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图 + Q: @, {! U" X$ X) r$ J& B9 r
xlabel(t); % 为X轴加标签 # C1 X9 }3 ?. i: a
ylabel(rlowess); % 为Y轴加标签 - P% _( m$ d8 ?) r h K3 S. z
legend(加噪波形,平滑后波形); 2 u3 ?: Z# x, d8 L. X9 `! |7 g! P

2 ]1 U+ d3 |$ L" o5 s" t 【方法4】
. l( F1 |! s' u: O 利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 9 \+ r" M+ ]5 I9 f9 {
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理
; k" ~; O/ D# |# h6 g figure; % 新建一个图形窗口
! B: t$ N# l, k+ R. k5 c plot(t,y,k ; % 绘制加噪波形图
' G5 G9 f* F' h p ] hold on;
& D+ Y: S! A. m/ N; c9 ]2 Q h plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 ; z; O+ P1 o8 q8 D
xlabel(t); % 为X轴加标签
n2 z, ~- e) P' N K: {5 P ylabel(loess); % 为Y轴加标签 ' P0 u1 I9 {- e7 F# J1 T
legend(加噪波形,平滑后波形);
9 |& {* @- Z" x6 e: P+ O# M 
3 G) b) k) D* o; K 【方法五】 . N# l/ r# v* w- f1 b
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图
4 D/ Z+ F$ {+ e. I" C3 } yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
- \, ]& x. e( z( V5 X figure; % 新建一个图形窗口
; H2 A2 k* q; P$ c2 f5 U- O plot(t,y,k ; % 绘制加噪波形图 " ?+ q( r) s& U" R2 o8 |$ U5 q
hold on;
* g! @0 ]; A1 B' X; I plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 * }, q6 C% X* s9 B, x
xlabel(t); % 为X轴加标签
# B) B4 W% a# u& m* U4 k* [ ylabel(sgolay); % 为Y轴加标签 ( y. y7 U( B% L0 u$ @. q: M) E% {
legend(加噪波形,平滑后波形);
: A+ l4 k7 `! c9 C6 p) A  9 e/ E2 \, w V/ O; _3 ^$ o
7 a: ?! [, q; \% `
; u* w5 \- g/ \7 X1 x
# o7 c+ c/ P. O' d* c' o
/ E c a1 o# h/ H |