2.数据的预处理

     数据导入MATLAB之后,通常需要对数据进行一些预处理,例如平滑处理(去噪)、标准化变换和极差归一化变换等。

更多MATLAB数据分析视频请点击,或者在网易云课堂上搜索《MATLAB数据分析与统计》 http://study.163.com/course/courseMain.htm?courseId=1003615016

   1.数据的平滑处理

   MATLAB曲线拟合工具箱中提供了smooth函数

   MATLAB金融工具箱中提供了smoothts函数

   MATLAB信号处理工具箱中提供了medfilt1函数

   1.1 smooth函数平滑处理

    MATLAB曲线拟合工具箱中提供了smooth函数,用来对数据进行平滑处理,调用格式如下:

  (1)yy=smooth(y)

           利用移动平均滤波器对列向量y进行平滑处理,返回与y等长的列向量yy。移动平均滤波器的默认窗宽为5,yy中元素的计算方法如下:

             yy(1)=y(1)

              yy(2)=(y(1)+y(2)+y(3))/3

            yy(3)=(y(1)+y(2)+y(3)+y(4)+y(5))/5

          yy(4)=(y(2)+y(3)+y(4)+y(5)+y(6))/5

           ......

 (2) yy=smooth(y,span)

          用span参数指定移动平均滤波器的窗宽,函数内部会强制将span变为奇数。

 (3)yy=smooth(y,method)

       method参数指定平滑数据的方法,method是字符串变量,可用的字符串如下表:

       method参数值                             说明

       moving                     移动平均法(默认情况)

       lowess                    局部回归(加权线性最小二乘和一个一阶多项式模型)

       loess                       局部回归(加权线性最小二乘和一个二阶多项式模型)

       sgolay                    Sacitzky-Golay滤波,一种广义移动平均滤波法

       rlowess                 lowess方法的稳健形式

      rloess                     loess方法的稳健形式

 (4)yy=smooth(y,span,method)

     method指定平滑方法,span指定窗宽。

例:产生一正弦信号,加入噪声信号,调用smooth函数对加入噪声的正弦波进行平滑处理


 t=linspace(0,2*pi,500);%产生一个从0到2*pi的向量,长度为500,(t=0:2*pi/500:2*pi)
y=100*sin(t);           %产生正弦波信号
noise=normrnd(0,15,1,500); %产生1行500列的服从N(0,15^2)分布的随机数,作为噪声信号
y=y+noise;                 %将正弦信号加入噪声信号
figure;                     %新建一个窗口
plot(t,y);                %绘制加噪声波形    
xlabel('t');
ylabel('y=sin(t)+噪声');
title('原始信号');

%-----移动平均法-----
yy1=smooth(y,30);       %利用移动平均法对y进行平滑处理
figure;
plot(t,y,'k:');            %画出原始信号,类型为黑色点线化出
hold on;
plot(t,yy1,'k','linewidth',3); %绘制平滑后波形图,颜色为黑色,宽度为3
xlabel('t');
ylabel('moving');
legend('原始信号','平滑后波形');
title('移动平均法平滑处理');

%----lowess法-----
yy2=smooth(y,30,'lowess');   %利用lowess方法对y进行平滑处理
figure;                      %新建一个图形窗口
plot(t,y,'k:');              %绘制原始信号
hold on;
plot(t,yy2,'k','linewidth',3); %绘制平滑后波形图
xlabel('t');
ylabel('rlowrss');
legend('原始信号','平滑后波形');
title('lowess方法平滑处理');

%-----rlowess方法平滑处理
yy3=smooth(y,30,'rlowess');   %利用rlowess方法对y进行平滑处理
figure;                        %新建一个图形窗口
plot(t,y,'k:');                 %绘制原始信号
hold on;
plot(t,yy3,'k','linewidth',3);
xlabel('t');
ylabel('rlowess');
legend('原始信号','平滑后波形');
title('rlowess方法平滑处理');

%----loess方法平滑处理
yy4=smooth(y,30,'loess');   %用loess方法对y进行平滑处理
figure;
plot(t,y,'k:');              %原始信号
hold on;
plot(t,yy4,'k','linewidth',3); %绘制平滑后波形图
xlabel('t');
ylabel('loess');
legend('原始信号','平滑后波形');
title('loess方法平滑处理');

%---sgolay方法平滑处理
yy5=smooth(y,30,'sgolay',3);  %利用sgolay方法对y进行平滑处理
figure;
plot(t,y,'k:');
hold on;
plot(t,yy5,'k','linewidth',3); %绘制平滑后的波形图
xlabel('t');
ylabel('sgolay');
legend('原始信号','平滑后波形');
title('sgolay方法平滑处理');

调用smooth函数,设置相同的窗宽,用5中方法对加噪声后信号进行平滑处理,可以发现,这5种方法平滑效果,都比较好的滤除了噪声,反映了数据的总体规律。实际上随着窗宽的增大,平滑后的曲线也会越来越平滑,但过于光滑也可能造成失真。


1.2 smoothts函数平滑处理

MATLAB金融工具箱中提供了smoothts函数,也可用来对数据进行平滑处理,调用格式如下:

 output=smoothts(input)

 output=smoothts(input,‘b’,wsize)

 output=smoothts(input,‘g’,wsize,stdev)

 output=smoothts(input,‘e’,wsize)

输入参数input是输入数据,‘b’,‘g’,‘e’表示不同的数据平滑方法,‘b’表示盒子法(默认情况),'g'表示高斯窗方法,‘e’表示指数法。wsize指定各种数据平滑方法的窗宽,默认窗宽为5。stdev用来指定高斯方法的标准差,默认为0.65.

例:现有上海股市开盘价、最高价,最低价,收盘价,收益率等数据,共有510组数据,试调用smoothts函数对日收盘价数据进行平滑处理

 数据如图所示:


x=xlsread('C:\Users\Administrator\Desktop\MATLAB\MATLAB数据分析与统计\chapter2\1.xls');%读取数据
price=x(:,4)';  %提取矩阵x中的第4列数据,即收盘价数据, 并转置,装换为行向量
plot(price,'k','LineWidth',2);  %绘制收盘价的曲线,绘制类型:黑色实线,线宽为2
xlabel('观测序号');
ylabel('日收盘价');
title('原始数据');

%---盒子法平滑数据
output1=smoothts(price,'b',30);  %用盒子法平滑数据,窗宽为30
output2=smoothts(price,'b',100);  %盒子法平滑数据,窗宽为100
figure;                          %新建一个图形窗口
plot(price,'.');                %绘制原始数据
hold on;
plot(output1,'k','LineWidth',2);  %绘制平滑后的曲线,曲线类型:黑色实线,宽度2
plot(output2,'k-.','LineWidth',2); %绘制平滑后的曲线,曲线类型:黑色点画线,线宽为2
xlabel('观测信号');
ylabel('Box method');
legend('原始散点数据','平滑后曲线(窗宽30)','平滑后数据(窗宽100)');
title('盒子法平滑数据');

%-----高斯窗方法平滑数据
output3=smoothts(price,'g',30);  %窗宽为30,标准差为默认值0.65
output4=smoothts(price,'g',100,100);  %窗宽为100,标准差为100
figure;                           %新建一个图形窗口
plot(price,'.');                  %绘制元素数据
hold on;
plot(output3,'k','LineWidth',2);   %绘制平滑后的曲线,类型:黑色实线,线宽为2
plot(output4,'k-.','LineWidth',2); %绘制平滑后的曲线,类型:黑色点画线,线宽为2
xlabel('观测信号');
ylabel('Gaussian method');
legend('原始散点','平滑曲线(窗宽30,标准差0.65)','平滑曲线(窗宽100,标准差100)');
title('高斯窗方法平滑');

%----指数法平滑数据
output5=smoothts(price,'e',30);       %用指数法平滑数据,窗宽为30
output6=smoothts(price,'e',100);      %用指数法平滑数据,窗宽为100
figure;                               %新建一个图形窗口
plot(price,'.');                      %绘制元素数据散点图
hold on;
plot(output5,'k','LineWidth',2);      %绘制平滑后曲线图,曲线类型:黑色实线,线宽2
plot(output6,'k-.','LineWidth',2);    %绘制平滑后曲线图,线型:黑色点画线,线宽2
xlabel('观测序号');
ylabel('Exponential method');
legend('原始散点数据','平滑曲线(线宽30)','平滑曲线(线宽100)');
title('指数法平滑数据')


例中,调用smoothts函数,用3种不同的方法(盒子法,高斯窗法,指数法),每种方法设定两种不同的窗宽,对收盘价数据进行了平滑处理,并做出平滑曲线,原始收盘价曲线比较曲折,不够光滑,从图中可以看出,前两种方法在端点处的平滑效果不是很好,最后一种方法在右尾部的处理有些失真。但在数据的中段,这三种方法的平滑效果比较好,并且随着窗宽的增大,平滑后的曲线的光滑性也在增强,但光滑度增强的同时也造成了失真。

1.3 medfilt1函数平滑处理

MATLAB信号处理工具箱中提供了medfilt1函数,用来对信号数据进行一维中值滤波,其调用格式如下:

 (1)y=medfilt1(x,n);

 对向量x进行一维中值滤波,返回与x等长的向量y。这里的n是窗宽参数,当n是奇数时,y的第k个元素等于x的第k-(n-1)/2个元素至k+(n-1)/2个元素的中位数;当n是偶是,y的第k个元素等于x的第k-n/2个元素至第k+n/2-1个元素的中位数。n的默认值为3

(2) y=medfilt1(x,n,blksz)

 默认情况下,blksz=length(x)。当x是一个矩阵时,通过循环对x的各列进行一维中值滤波,返回对x的各列进行一维中值滤波,返回与x具有相同行数和列数的矩阵y

 (3)y=medfilt1(x,n,blksz,dim)

 用dim参数指定沿x的哪个维进行滤波

例:产生一正弦信号,加入噪声,然后调用medfilt1函数对加入噪声的正弦波进行平滑处理(滤波)

t=linspace(0,2*pi,500);       %产生一个从0到2*pi的向量,长度为500
y=100*sin(t);          
noise=normrnd(0,15,1,500);    %产生1行500列的服从N(0,15^2)分布的随机数,作为噪声信号
y=y+noise;                    %将正弦波信号加入噪声信号
figure;                      %新建一个图形窗口
plot(t,y);                   %绘制加入噪声后的波形图
xlabel('t');
ylabel('y=sin(t)+noise');
title('原始信号');

%调用medfilt1对加噪声正弦信号y进行中值滤波,并绘制波形图
yy=medfilt1(y,30);            %指定窗口为30,对y进行中值滤波
figure;                        %新建一个图形窗口
plot(t,y,'k:');                 %绘制加噪声波形图
hold on;
plot(t,yy,'k','LineWidth',3);    %绘制平滑后曲线图,线型:黑色实线,线宽为3
xlabel('t');
ylabel('中值滤波');
legend('加噪波形','平滑后波形');
title('medfilt1平滑');


 2. 数据的标准化变换

 对于多元数据,当各变量的量纲和数量级不一致时,往往需要对数据进行变换处理,以消除量纲和数量级的限制,以便进行后续的统计分析。常见的数据变换方法有两种:标准化变换和极差归一化变换

   2.1 标准化变换公式

       设p维向量X=(X1,X2,.......,Xp)的观测值矩阵为

                   

  标准变换后的观测值矩阵为

         

其中

     

其中,   为变量 Xj 的观测值的平均值;sij  为变量 Xj 的观测值的方差;为标准差。经过变换后,矩阵的各列的均值为0,标准差为1。


 2.2  标准化变换的MATLAB实现

  MATLAB统计工具箱中提供了zscore函数,用来作数据的标准化变换,其调用格式如下:

 (1)Z=zscore(X)

       对X进行标准化变换

 (2)[Z,mu,sigma]=zscore(X)

          返回X的均值mu=mean(X)和标准差sigma=std(X)

 (3)[.....]=zscore(X,1)

          计算标准差时初一样本容量n而不是n-1,即:

 

zscore(X,0)等价于zscore(X)。

(4)[......]=zscore(X,flag,dim)

  用flag参数指定标准差的计算公公式,若flag=0,;若flag=1,

参数dim指定沿X的哪个维度进行标准化变换,例如dim=1,表示对X的各列进行标准化变换(默认情况);dim=2,表示对X的各行进行标准化变换。


例:用rand函数产生一个随机矩阵,调用zscore函数对其按列进行标准化变换。

rand('seed',1);    %设置随机数生成器的初始种子为1
%调用rand函数参数一个5行4列的随机矩阵,每列服从不同的随机分布
x=[rand(5,1),5*rand(5,1),10*rand(5,1),500*rand(5,1)]

%调用zscore函数对x进行标准化变换(按列标准化)
%返回变换后矩阵xz,以及矩阵x各列的均值构成的向量mu,和各列的标准差构成的向量sigma
[xz,mu,sigma]=zscore(x)
xzmean=mean(xz)    %求标准化后矩阵xz的各列的均值
xzstd=std(xz)      %求标准化后矩阵xz的各列的标准差

% ---对x的各行进行标准化变换
% 调用zscore函数对x进行标准化变换(按行标准化)
% 返回变换后矩阵xz,以及矩阵x各行的均值构成的向量mu,和各行的标准差构成的向量sigma
% [xz,mu,sigma]=zscore(x,0,2)
% [xz,mu,sigma]=zscore(x,0,2)
% xzmean=mean(xz,2)    %求标准化后矩阵xz的各行的均值
% xzstd=std(xz,0,2)    %求标准化后矩阵xz的各列的标准差


x =

    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390


xz =

    0.8641    1.5868   -0.9347   -1.1208
    0.5460   -0.5145    0.1286   -0.8787
   -0.1220   -0.6487   -1.1146    0.1862
   -1.6714    0.3826    1.0672    0.5239
    0.3833   -0.8062    0.8535    1.2895


mu =

    0.3705    1.3062    4.3760  248.7203


sigma =

    0.1648    1.4116    2.6259   29.2518


xzmean =

   1.0e-15 *

    0.0222   -0.0666    0.0666   -0.5773


xzstd =

    1.0000    1.0000    1.0000    1.0000


3. 数据的极差归一化变换

对于观测值矩阵X

极差归一化变换后的矩阵为

其中:

这里,min为变量 Xj 的观测值的最小值,max-min为变量 Xj 的观测值的极差。通过极差归一化变换后,矩阵的每个元素的取值都在0-1之间。

3.2 极差归一化变换的MATLAB实现

   MATLAB神经网络工具箱中提供了mapminmax函数,用来做数据的映射变换,其常用的调用格式如下:

  [Y,PS]=mapminmax(X,YMIN,YMAX)    %对矩阵X按行左映射变换

       X  =manminmax('reverse',Y,PS)     %对矩阵Y按行进行逆映射变换

 mapminmax函数能将矩阵X中的每行数据均映射到区间[YMIN,YMAX]内,每行最小值映射为YMIN,最大值映射为YMAX。mapminmax函数还能对变换后矩阵Y作逆映射变换,恢复为原始数据矩阵X。

例:调用rand函数产生一个随机矩阵,调用mapminmax函数对其按列进行极差归一化变换,然后做你变换

  rand('seed',1);   %设置随机数生成器的初始种子为1
%调用rand函数产生一个5行4列的随机矩阵,每列服从不同的均匀分布
x=[rand(5,1),5*rand(5,1),10*rand(5,1),500*rand(5,1)]
%调用mapminmax函数对装置后的x按行进行极差归一化变换
[y,ps]=mapminmax(x',0,1)
% ps.xmax  %查看ps
y'   %变换后的矩阵
x0=mapminmax('reverse',y,ps)
x0'


x =

    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390


y =

    1.0000    0.8745    0.6111         0    0.8104
    1.0000    0.1219    0.0658    0.4968         0
    0.0824    0.5698         0    1.0000    0.9020
         0    0.1005    0.5422    0.6824    1.0000


ps =

         name: 'mapminmax'
        xrows: 4
         xmax: [4x1 double]
         xmin: [4x1 double]
       xrange: [4x1 double]
        yrows: 4
         ymax: 1
         ymin: 0
       yrange: 1
    no_change: 0
         gain: [4x1 double]
      xoffset: [4x1 double]


ans =

    1.0000    1.0000    0.0824         0
    0.8745    0.1219    0.5698    0.1005
    0.6111    0.0658         0    0.5422
         0    0.4968    1.0000    0.6824
    0.8104         0    0.9020    1.0000


x0 =

    0.5129    0.4605    0.3504    0.0950    0.4337
    3.5462    0.5798    0.3904    1.8463    0.1681
    1.9215    4.7136    1.4492    7.1784    6.6171
  215.9352  223.0174  254.1658  264.0439  286.4390


ans =

    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390


更多MATLAB数据分析视频请点击,或者在网易云课堂上搜索《MATLAB数据分析与统计》 http://study.163.com/course/courseMain.htm?courseId=1003615016

原创文章 100 获赞 339 访问量 56万+

猜你喜欢

转载自blog.csdn.net/MATLAB_matlab/article/details/54834733