加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数据预处理-归一化

(2016-03-01 18:12:37)
标签:

数据预处理-归一化

分类: 数据分析

(1)数值归一化法

     当数据包含不同量纲的多种变量时,数值间的差别可能很大,例如有些有机酸的离解常数(pKa)数值大约为个位数或为负数,沸点数据则约为几十摄氏度或数百摄氏度。再如所采用的单位不同,数据的大小也会有很大的差别,如毫摩尔浓度与摩尔浓度相差1000倍。如果将这种不同种类、不同量纲、数值大小差别很大的数据组合在一起进行模式识别,势必会影响到正确的分类。常用的解决方法就是对数据进行数值归一化。数值归一化就是把各个变量的数据都线性地变换到一个新的标尺上,在新标尺上,每个变量的最大值都为1。第i个变量数值归一化公式为

http://s2/mw690/002EBwmJzy6ZM9qwSyd21&690

式中xi,old为原始数据;xi,new为变换后的新数据;xmax为原始数据中的最大值;n为数据中变量个数。该变换保证了各变量的数据都≤1。有时为了将数据规范为01之间的数值,即变换后数据的最小值为0,最大值为1,也常用下述公式进行预处理:

http://s1/mw690/002EBwmJzy6ZM9reveg90&690

式中,xmin为原始数据中的最小值。数值归一化可以保证各变量的变化幅度处于同一水平上,从而消除了数据本身差别带来的影响。但其缺点是,若数值集合中有一个数值很大,则其余各值都会相差不大。

(2)方差归一化法

    方差可以用来描述变量的变化幅度,而在处理化学数据时,有时我们更关注数据的变化幅度,因此从方差这个角度进行数据归一化就是方差归一化方法,常用下面的公式进行变换,

http://s11/mw690/002EBwmJzy6ZM9s7V7Yba&690

    式中,m为变量i的均值;Vj为该变量的方差。经变换后的数据方差为1,它保证了各变量的方差一致,各变量在分类过程中影响程度相同。

案例.matlab  mapminmax函数实现极差归一化 

对数据{xn},归一化为{xn}落到区间[Ymin, Ymax](默认是[-1, 1]公式:

x=(Ymax-Ymin)* (xn-Xmin)/(Xmax-Xmin) Ymin

调用格式:[Y, PS] mapminmax(X,Ymin,Ymax) PS记录该变换过程mapminmax('apply',Z,PS)    对矩阵Z实施PS变换过程mapminmax('reverse',Y,PS)   Y变换回X 

注:(1) Matlab7.1之前版本没有mapminmax函数,可以用premnmx函数。Matlab 2012版本之前mapminmax函数有bug,按标准格式调用得到的结果是错误的,需要特殊处理一下;(2) 若矩阵中有缺省数据,需要用fixunknowns函数。

 

 Matlab极差归一化测试程序。

代码:

x=[1 4; 1; 2; 0];

[y,ps]=mapminmax(x)  

直接调用函数对矩阵的每一行数据做归一化

注意:Matlab2012之前的版本有bug

使用mapminmax(X,Ymin,Ymax)得不到正确结果

归一到区间[0,1]可以如下处理:

ps.ymin=0;  %归一化后的最小值

ps.ymax=1;  %归一化后的最大值

ps.yrange=1; 

%归一化后的极差,值为ps.ymax-ps.ymin。若未调整该值,则逆运算会出错

[y1,ps]=mapminmax(x,ps)

x1=mapminmax('reverse',y2,ps) 变换回来,回到原来的矩阵

x2=[5 3; 1; 3; 0];

y2=mapminmax('apply',x1,ps) 

对矩阵x2实施同样的归一化变换,也有bug,结果错误

直接编程计算对矩阵的每一列数据做归一化

[r,l]=size(x);

y3=(x-repmat(min(x),r,1))./(repmat(max(x),r,1)…

-repmat(min(x),r,1))

运行结果:    

        4

             1

             2

             0

 

=

 

   -1.0000   -0.3333    1.0000

    1.0000    1.0000    1.0000

    1.0000   -1.0000   -1.0000

                         0

 

ps 

 

         name: 'mapminmax'

        xrows: 4

         xmax: [4x1 double]

         xmin: [4x1 double]

       xrange: [4x1 double]

        yrows: 4

         ymax: 1

         ymin: -1

       yrange: 2

    no_change: 0

 

y1 =

 

            0.3333    1.0000

    1.0000    1.0000    1.0000

    1.0000                 0

                         0

 

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

 

x1 =

 

             4

             1

             2

             0

 

x2 =

 

             3

             1

             3

             0

 

y2 =

 

    1.3333    0.3333    0.6667

    1.0000    1.0000    1.0000

    4.0000    5.0000    1.0000

                         0

 

y3 =

 

    0.3333    1.0000    1.0000

    0.3333    0.5000    0.2500

    1.0000    1.0000    0.5000

                         0

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有