2 s* ?7 f. d* P: ^ 如何使用Matlab对数据进行预处理 . T2 }# o1 D2 B6 i% L, E' f
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
: l9 A: Y, O1 D2 ]6 i2 F5 G: l 1.1 smooth函数
8 G' ]. d/ P9 g Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: 5 Y, B" q- X. W) o1 `, R
1)xx = smooth(x)
) O2 E; W2 `% [' u4 \" o/ t 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下:
2 E: y, y2 S" f8 w9 i xx(1) = x(1) - h1 @( v$ k! V5 `' O/ I
xx(2) = (x(1)+x(2)+x(3))/3 + Q2 t( Q d, G% r
xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
" Q7 q: }3 K. u9 b xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5 0 \4 j8 j9 r6 l/ ?! d
xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
2 ^6 E4 V: {( } 2)xx = smooth(x,span) - B& e0 l# w. t5 D5 i6 R, j
用span参数指定移动平均滤波器的宽度,span为奇数。
4 v* h- D2 H; l, ^- M5 q3 m 3)xx = smooth(x,method)
/ R! X* q& L+ N1 @, t8 o/ @2 h 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: ( c: {4 R' ^9 b0 B+ d4 Q
表1 smooth参数支持的method参数值列表 ' L/ B& U* N3 ^9 q' i
9 R1 X2 z( j9 V
4)xx = smooth(x,span,method)
$ t4 M" H% V6 Q9 X 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
/ O4 v) U1 q2 S* H! o# { 5)xx = smooth(x,sgolay, degree) 7 M: w8 y/ M' N+ Z
利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
# t5 c3 s: G8 v9 f' | 6)xx = smooth(x, span, sgolay , degree)
' O# V9 ^% {3 n2 N/ z# X3 ^ 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。
: H! h/ i: Q2 {& v2 S# K 7) xx = smooth(x,y, ..)
% ]( _' ^+ E0 T0 J/ ~3 ]: A' w 同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。 . h: ~6 R- b, w% z
【例题1】 5 E [0 X( @: ~! b. U
产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
2 y& F/ ~$ l" j3 i 思路:
8 z- d. Z1 } q) b# j- F9 M 1. 调用smooth函数进行加噪数据的平滑处理;
' {* z7 N8 F {# ~ L o 2. 产生加噪正弦波信号;
! |0 h+ Y3 y6 N T7 g) G) f 3. 绘制加噪波形图。 - G- t4 ~2 x7 P) h: E, \
解题步骤: 8 K9 R/ s7 q( g: j6 u/ o
1)构建数据
x l* e9 p' t% b3 f0 i( m t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500 ( \) {/ G, I, z7 _
y = 100*sin(t); % 产生正弦波信号
; c. b' b) G% r: E5 L % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 , L: f- {+ D, j: s! l) A
noise = normrnd(0,15,500,1); 0 ~" V% T9 d" T9 h) W
y = y + noise; % 将正弦波信号加入噪声信号 . H* x" {3 Y) g
2)制作基础图
: M+ j3 P. C l figure; % 新建一个图形窗口
; H3 t! i @+ m5 p9 q6 }4 W plot(t,y); % 绘制加噪波形图
$ O6 o( ~$ y/ v. X% V8 F! Q xlabel(t); % 为X轴加标签
" P/ \& u; ]; ?4 B/ ^ ylabel(y = sin(t) + 噪声); % 为Y轴加标签
3 ^5 m% p; ~- j! }$ x! E6 z9 A 0 l7 r. a# Y0 L9 `5 c& F- C- U4 h
3)制作平滑波形图
( T: J _( _% y1 D 【方法一】
: t7 M5 x! b' b, J8 } 利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 # a5 ~7 Q1 d g+ Z2 V$ T W
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
6 H0 y, P1 {, h& P/ x6 `9 m figure; % 新建一个图形窗口
, G; q8 m) T: k4 M" g plot(t,y,k; % 绘制加噪波形图
& ~. [8 l& J0 f7 q. t5 N4 } hold on;
: n: h F. Y9 d5 n plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图
& r: A* b _' B8 }1 ]; [' t! I xlabel(t); % 为X轴加标签 * N' p5 h3 }. O% q" z. j
ylabel(moving); % 为Y轴加标签
, r5 K3 l, a$ {7 c4 J legend(加噪波形,平滑后波形); " p6 `1 |( E: g; q ]2 ^
6 L6 t3 F1 ]: L
【方法二】
4 [. E/ A* b- c$ y# L 利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图 6 v q! }: ]" \ z$ k1 P9 D; f, `
yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 5 E$ N6 F4 \: i5 H8 ]5 i
figure; % 新建一个图形窗口
7 \" j& n2 W3 }% U plot(t,y,k; % 绘制加噪波形图 4 a- {- g8 v8 ~. r
hold on; # j! P |1 e. `
plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图 ( P: x# \) B6 w5 L5 a5 S
xlabel(t); % 为X轴加标签 ' {) _6 o' C! e0 L1 C$ M( C
ylabel(lowess); % 为Y轴加标签
8 _6 E9 C/ y/ c% w {' } legend(加噪波形,平滑后波形);
M1 {7 Y. o; A# s, G
( x) Q, {8 |) @; e 【方法三】 ' \! r8 ^: I: w* ?2 G& n
利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图 8 A' w1 ~9 G$ u% P; J5 Z; u0 t
yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 3 c2 k; h9 K' {$ E8 I/ i$ w2 X
figure; % 新建一个图形窗口 ' a2 |; V$ C% g! l8 h
plot(t,y,k; % 绘制加噪波形图 6 j ]' [; B8 ^$ n8 K; d9 R
hold on; ( F' b! E% a7 N0 w4 R1 L6 C
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
9 K/ u$ J0 c- B7 ?: g% }! I xlabel(t); % 为X轴加标签
7 }) Z! a2 m2 I ylabel(rlowess); % 为Y轴加标签
; v! v: @4 s e5 v; h/ [8 N5 F1 W legend(加噪波形,平滑后波形);
1 G. s# j7 o2 s! H; W5 O 6 M' e5 v+ q3 j! B
【方法4】 7 l0 Q% c4 P7 L- v% S. m* i
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 " x. I; }( f, e: _9 C5 F
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 4 O; l- Q4 a( L$ F7 D
figure; % 新建一个图形窗口
$ U5 @: N6 z* f: N1 X; o i plot(t,y,k; % 绘制加噪波形图
: O9 m2 [1 r8 R; W hold on; 1 k& T2 Z- n a) a# f
plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图
; S0 D2 t: \4 t, d& Y7 b xlabel(t); % 为X轴加标签 / T/ e# G! I: k6 Q' s, j8 j! R
ylabel(loess); % 为Y轴加标签
4 O2 H0 U, l4 H n legend(加噪波形,平滑后波形); * \8 \3 W6 @6 Q, a5 P2 A- G
, \, }6 s' ]# G& B9 y 【方法五】
& g" z, D" r/ A& A+ M4 d 利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 X8 z" Q6 V( b* k- X' m1 r2 U
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
- B$ P0 t, ~7 E$ d" ~ figure; % 新建一个图形窗口 ( Y) |- \0 c, W7 s2 c0 w
plot(t,y,k; % 绘制加噪波形图 9 T6 y7 J5 {& e4 P8 L: k
hold on;
. n8 m, i2 n1 W" _) C plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 8 @" f7 ~. M& e9 q
xlabel(t); % 为X轴加标签
e9 S$ F! q) J' I" {3 M ylabel(sgolay); % 为Y轴加标签
1 h( ?* D8 P' [+ {0 |8 l$ P1 N legend(加噪波形,平滑后波形);
- y" R; ]7 o _* P/ H5 H$ r: N
& A1 `4 e2 L% g% r/ n$ Q* U3 j: S- c% h" k+ }
. Y1 b5 U3 M% X1 T; I. y g- j% K% T" a* f
E" `2 v G; }4 S! F
|