首页 > 代码库 > 再议Matlab归一化函数

再议Matlab归一化函数

在最新版的matlab里面共有两个归一化函数:mapminmax()和mapstd()。

mapminmax()函数将数据归一化到[-1 1](默认也可自己调参数)。

mapstd()函数将数据归一化成零均值和单位方差。

技术分享

(1)

a =
   -0.9200    0.7300   -0.4700    0.7400    0.2900

[y,ps] = mapminmax(a)

y =
   -1.0000    0.9880   -0.4578    1.0000    0.4578
ps = 
         name: ‘mapminmax‘
        xrows: 1
         xmax: 0.7400
         xmin: -0.9200
       xrange: 1.6600
        yrows: 1
         ymax: 1
         ymin: -1
       yrange: 2
    no_change: 0

转换函数:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;(x为转化前的数y为转化后的数)

xrange=xmax-xmin, yrange=ymax-ymin

(2)

默认归一化到[-1 1]也可以自己设置归一化范围例如:

[y,ps] = mapminmax(a);

ps.ymin = 0;

 [y,ps] = mapminmax(a,ps)

y =
         0    0.9940    0.2711    1.0000    0.7289
ps = 
         name: ‘mapminmax‘
        xrows: 1
         xmax: 0.7400
         xmin: -0.9200
       xrange: 1.6600
        yrows: 1
         ymax: 1
         ymin: 0
       yrange: 1
    no_change: 0

则a被归一化到[0 1]。

(3)

b = [1 2 2 4 9]

如果我对a采用了某种规范化的方式, 现在我要对b采用同样的规范化方式[同样的映射],如下可办到:

[y,ps] = mapminmax(a);

y2 = mapminmax(‘apply‘,b,ps)

y2 =
    1.3133    2.5181    2.5181    4.9277   10.9518

注意:用a的归一化方程归一化b此时b归一化后的范围不一定和a一样。及如果b中的最大值(最小值)大于(小于)a中的最大值(最小值)时那么b归一化后的范围不等于a([-1 1]),此例即是这种情况。如果b属于a那么用a的归一化函数去归一化b后,得到的b的归一化范围也属于a归一化后的范围([-1 1])。

为什么要归一化?

归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。(在一般的神经网络中归一化就是应该先把训练样本归一化,然后使用训练样本的最大值、最小值等信息对测试样本进行归一化。

归一化(归一化+中心化即为标准化)的作用那就是将每一变数的重要性都在同等条件下进行比较。在主成分、聚类分析等多变数分析中,分析结果将完全依赖于各变数的变异度,或各变数对分析结果的相对重要性完全取决于该变数的变异度。而实际数据的变异度由于量纲的关系会有不同的数据尺度,比如个体重这样一个变数,可以以克为单位,也可以以公斤(吨)为单位,但它们的方差相差1M(1e12)倍,而不同的变数有不同的单位(量纲),因此它们数值的变异与它们的重要性不一定相称。进行标准化即把各变数作等重要性处理。但如前所述,这种方法在有些时候也不一定合理。

为什么要用归一化呢?首先先说一个概念,叫做奇异样本数据,所谓奇异样本数据数据指的是相对于其他输入样本特别大或特别小的样本矢量。
下面举例:
m=[0.11 0.15 0.32 0.45 30;
      0.13 0.24 0.27 0.25 45];
其中的第五列数据相对于其他4列数据就可以成为奇异样本数据(下面所说的网络均值bp)。奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,所以对于训练样本存在奇异样本数据的数据集在训练之前,最好先进形归一化,若不存在奇异样本数据,则不需要事先归一化。


概括起来就是:主要原因是消除不同维度数据之间的差异,还以加快训练算法的收敛速度

需要说明的事并不是任何问题都必须事先把原始数据进行规范化,也就是数据规范化这一步并不是必须要做的,要具体问题具体看待,测试表明有时候规范化后的预测准确率比没有规范化的预测准确率低很多.就最大最小值法而言,当你用这种方式将原始数据规范化后,事实上意味着你承认了一个假设就是测试数据集的每一模式的所有特征分量的最大值(最小值)不会大于(小于)训练数据集的每一模式的所有特征分量的最大值(最小值),但这条假设显然过于强,实际情况并不一定会这样.使用平均数方差法也会有同样类似的问题.故数据规范化这一步并不是必须要做的,要具体问题具体看待. 

(引用:http://www.ilovematlab.cn/thread-27021-1-1.html)

使用[Y,PS]=mapminmax(x1)函数对训练样本x1归一化之后,再利用mapminmax(‘apply‘,x2,PS)对测试样本x2进行归一化,但是测试样本归一化的结果不一定在[-1,1]之间,测试样本的最大最小值有可能比训练样本的大或小。如果测试样本归一化的结果不在[-1,1]之间则说明:前后数据的变异度不一致,即归一化不到相同的范围内,则不归一化是比较明智的选择。


我们可以用reverse参数对归一化后的数据进行逆操作,得到归一化前的数据,例:

a =
   -0.9200    0.7300   -0.4700    0.7400    0.2900


[y,ps] = mapminmax(a)

y =
   -1.0000    0.9880   -0.4578    1.0000    0.4578


a2 = mapminmax(‘reverse‘,y,ps)

a2 =
   -0.9200    0.7300   -0.4700    0.7400    0.2900


类似的有mapstd()函数,唯一的不同就是使用的归一化函数规则不同

a =
   -0.9200    0.7300   -0.4700    0.7400    0.2900


[pn,ps] = mapstd(a)

pn =
   -1.3389    0.8836   -0.7328    0.8971    0.2910
ps = 
         name: ‘mapstd‘
        xrows: 1
        yrows: 1
        xmean: 0.0740
         xstd: 0.7424
        ymean: 0
         ystd: 1
    no_change: 0

xmean为转换前a向量的均值(mean(a)),xstd为转化前a向量的样本标准差(std(a)注:分母为样本数-1)。ymean为转换后pn向量的均值((-1.3389+0.8836-0.7328+0.8971+0.2910)/5=0),ystd为转换后pn的标准差(std(pn)=1)

y2 = mapstd(‘apply‘,b,ps)

y2 =
    1.2473    2.5944    2.5944    5.2884   12.0235

 

a2 = mapstd(‘reverse‘,pn,ps)

a2 =
   -0.9200    0.7300   -0.4700    0.7400    0.2900



再议Matlab归一化函数