|
7 ]) Y. w1 K; y: P6 ~
如何使用Matlab对数据进行预处理 5 N# M1 d9 f8 P8 e: `9 a3 H$ V/ J+ O; @
在对于时间序列数据(例如股票价格等)进行统计分析,往往需要对数据进行平滑处理,我们介绍基于MATLAB的数据处理方法,本次我们主要讲解smooth函数的用法
3 \" Z7 G- O2 c8 ]6 G7 J5 ^) h 1.1 smooth函数 . O9 }4 [ Y- Z
Matlab曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,其调用格式如下: ' h8 u6 a+ T. ~9 x! F6 f
1)xx = smooth(x)
, C- |3 _8 m2 ^" n8 ` 利用移动平均滤波器对列向量x进行平滑处理,并返回与x等长的列向量xx。移动平均滤波器的默认窗口为5,xx中元素的计算方式如下: ; o M' C' a/ C# C t0 j
xx(1) = x(1)
- n3 W$ B3 H7 d8 o" H xx(2) = (x(1)+x(2)+x(3))/3
* n$ |2 k( \+ M# j/ i* A8 O: \. N% N xx(3) = (x(1)+x(2)+x(3)+x(4)+x(5))/5
- U7 k) c; p2 i0 _: p1 ^ xx(4) = (x(2)+x(3)+x(4)+x(5)+x(6))/5
; l$ l$ ^7 H$ ~% T xx(5) = (x(3)+x(4)+x(5)+x(6)+x(7))/5
$ Q3 V3 f! _* g6 Z) V 2)xx = smooth(x,span)
1 O! H i- t; S% @# v 用span参数指定移动平均滤波器的宽度,span为奇数。
1 G. `7 r; d) P$ [% U. j 3)xx = smooth(x,method)
' `) q3 Z/ D4 b$ H% M 用method参数指定平滑数据的方法,method是字符串变量,可用的字符串见下表1: 3 L' \* @, p6 G: O; T$ w" M
表1 smooth参数支持的method参数值列表 / [. n; L% T( f

4 A3 q- y# d; L! d5 Q0 P' \ 4)xx = smooth(x,span,method)
7 p# y3 j& d3 P- X6 d( W( k- T 对于由method参数指定的平滑方法,用span参数指定滤波器的窗宽。对loess和lowess方法,span是一个小于或等于1的数,表示占全体数据点总数的比例;对于移动平均法和Savitzky- Golay法,span必须是一个正的奇数,只要用户输人span是一个正数, smooth丽数内部会自动把span转为正的奇数。
, I9 G' L, v3 }* C; W 5)xx = smooth(x,sgolay, degree)
+ F9 R! w3 ]; j- l4 T- Q' D 利用Savitzky- Golay方法平滑数据,此时用degree参数指定多项式模型的阶数。degree是一个整数,取值介于0和span-1之间。
0 d/ n, f; ^& L6 r; p 6)xx = smooth(x, span, sgolay , degree)
; N8 D' O/ v- Q 用span参数指定Savitzky-Golay滤波器的窗宽。span必须是一个正的奇数,degree是一个 整数,取值介于0和span-1 之间。 % l+ i+ J3 W; x2 M: }! T$ A
7) xx = smooth(x,y, ..) - Z* t' ~; O+ m9 ^
同时指定x数据。如果没有指定x,smooth函数中自动令x=1:length(y)。当x是非.均匀数据或经过排序的数据时,用户应指定x数据。如果x是非均匀数据而用户没有指定method参数,smooth函数自动用lowess方法。如果数据平滑方法要求x是经过排序的数据,smooth函数自动对x进行排序。
. Z. U$ r9 x# l% {' H3 [0 z3 w 【例题1】
5 }* I* u! A, | 产生一列正弦波信号,加入噪声信号,调用smooth函数对加入噪声的正弦函数进行滤波(平滑处理)。
Y- |; n/ J' `+ @8 d! E 思路: $ }: j5 r2 ]8 V0 W
1. 调用smooth函数进行加噪数据的平滑处理; : s' I9 i/ t6 v- j! x0 N' k
2. 产生加噪正弦波信号; 6 b; ?8 I5 \4 `3 {# O- n
3. 绘制加噪波形图。 ' _8 {( J4 Z i- T1 l
解题步骤: / N: s Z; ?+ g
1)构建数据
2 {5 B: }, ^6 w2 Q" ` t = linspace(0,2*pi,500); % 产生一个从0到2*pi的向量,长度为500
6 m* L& s, t. ]2 n8 ~5 n9 Y. f, y y = 100*sin(t); % 产生正弦波信号
! H- X$ H! O8 \5 H9 L % 产生500行1列的服从N(0,152)分布的随机数,作为噪声信号 % F+ ~* o5 s, G: m0 {. a, H
noise = normrnd(0,15,500,1); , g& N" R- R2 B
y = y + noise; % 将正弦波信号加入噪声信号 1 e+ U+ V3 |5 Z. T" G: d
2)制作基础图
! @" L$ n" X' s) {) I+ g0 a figure; % 新建一个图形窗口
+ `4 t8 T0 {; I& @' E plot(t,y); % 绘制加噪波形图 6 P6 ?" P& V% L& m U/ s1 x$ v4 e
xlabel(t); % 为X轴加标签 ) V; H: K5 @+ [
ylabel(y = sin(t) + 噪声); % 为Y轴加标签 4 X5 w3 c4 R5 t
 * I8 a- {2 t$ ~( S, q
3)制作平滑波形图 8 h4 V4 m) H& p0 D; X0 n# m
【方法一】 ! [ o. P% O+ Y8 x3 P8 o
利用移动平均法对加噪信号进行平滑处理,绘制平滑波形图 F: F2 m8 ^7 c! f; j% E
yy1 = smooth(y,30); % 利用移动平均法对y进行平滑处理
; |: K$ R* t- s; U figure; % 新建一个图形窗口 / j; Y2 j0 s8 U/ P& E2 }$ T0 z8 i
plot(t,y,k ; % 绘制加噪波形图
; `6 L6 j- y0 V0 E hold on; * Z: ^' w5 R9 _/ f
plot(t,yy1,k,linewidth,3); % 绘制平滑后波形图 & F# x+ T+ E9 Q x7 u9 l, w% m
xlabel(t); % 为X轴加标签
4 T2 a# c* u9 Z6 s ylabel(moving); % 为Y轴加标签
- V/ Q' v5 b/ F3 m9 c" G' f legend(加噪波形,平滑后波形); # J2 x+ J5 J" Q

7 Q. J3 o# G( }# `' } 【方法二】 $ i2 {/ v/ E; h7 D& f( x
利用lowess方法对加噪信号进行平滑处理,绘制平滑波形图
- ?/ A# l2 y& `8 n yy2 = smooth(y,30,lowess); % 利用lowess方法对y进行平滑处理 + m& S5 \- i4 V# k( P0 w- h: m" q6 u7 }
figure; % 新建一个图形窗口
5 i+ M( X3 p1 |0 u0 T( [* D plot(t,y,k ; % 绘制加噪波形图
7 W3 s8 g; v1 ^) _% k, Z hold on;
1 F* R. I, W( ]2 \ plot(t,yy2,k,linewidth,3); % 绘制平滑后波形图
1 p x, ~) R( q9 a" J0 P0 o3 {- {- _3 J xlabel(t); % 为X轴加标签
, l6 \; s8 z# A3 T7 ]6 ^# S ylabel(lowess); % 为Y轴加标签 ! v; d5 d2 m! \+ L2 M. F
legend(加噪波形,平滑后波形);
" G! L4 C/ Y# f: F$ k8 j; M  - j. O) ~' |9 u$ _" c. h1 p) K
【方法三】
" k( F4 L' e2 I4 L! w 利用rlowess方法对加噪信号进行平滑处理,绘制平滑波形图
* ^/ [3 o# \& G' O2 D yy3 = smooth(y,30,rlowess); % 利用rlowess方法对y进行平滑处理 4 m2 R" R( T+ b- q# g/ g
figure; % 新建一个图形窗口 & N( ?0 ~3 ?6 C0 Z/ D
plot(t,y,k ; % 绘制加噪波形图 ; _% x/ g4 e: s8 P% U
hold on; ( W5 a8 k8 [3 C" m8 a. o2 G( M% t
plot(t,yy3,k,linewidth,3); % 绘制平滑后波形图
- l5 N; Y. ^0 o# D- F7 o7 V- x xlabel(t); % 为X轴加标签
, J+ \+ D# h4 f7 C ylabel(rlowess); % 为Y轴加标签
1 K) J, J- ]: | X) Y) ? legend(加噪波形,平滑后波形); ' ~" G) G' _9 q

0 e% j! |* j8 y3 |2 B T 【方法4】 ' s; w" H& k5 K% V' }
利用loess方法对加噪信号进行平滑处理,绘制平滑波形图 : c7 D$ O4 h/ k# h9 i6 {) }
yy4 = smooth(y,30,loess); % 利用loess方法对y进行平滑处理 9 N; V6 X- y; l* y
figure; % 新建一个图形窗口
) Y* J9 T/ {9 F& W9 s c; x plot(t,y,k ; % 绘制加噪波形图 / Z) c7 Q0 `" h0 H( K
hold on;
& ~ L4 K7 N- P2 r( X/ W9 M plot(t,yy4,k,linewidth,3); % 绘制平滑后波形图 1 _& Y& d4 B& l! k
xlabel(t); % 为X轴加标签 7 N6 e! {( h- D N8 L( @6 L
ylabel(loess); % 为Y轴加标签 K2 j( y& q/ U6 M' A. v
legend(加噪波形,平滑后波形); 6 ^# b5 y( |% ~2 c

. Y0 I+ W, e- X 【方法五】 / \, M9 y* Q- O
利用sgolay方法对加噪信号进行平滑处理,绘制平滑波形图 6 _: z3 u- a5 u6 z/ Z3 C
yy5 = smooth(y,30,sgolay,3); % 利用sgolay方法对y进行平滑处理
: B7 b; ], ?; E figure; % 新建一个图形窗口
7 _% W6 S& a# a' i plot(t,y,k ; % 绘制加噪波形图 0 C) v2 F( Z5 P" m7 @
hold on; . @* g$ w/ _+ D! G( W* P
plot(t,yy5,k,linewidth,3); % 绘制平滑后波形图 3 S! I3 [# `, o5 f' i
xlabel(t); % 为X轴加标签
+ p7 j; s& N- b& {3 f& Y ylabel(sgolay); % 为Y轴加标签
, A B2 U- g9 i, H9 t legend(加噪波形,平滑后波形); 6 [ A2 V( R1 Q
 : ]3 @" g! N+ k; E
) C k/ H/ m: X7 h/ _1 C. ~
8 l7 Q. K) D; i6 ?2 [; n, s9 @! |/ T
& `' k" b. X. v, } [% x- e" J9 t1 s# H
|