归一化函数mapminmax的讨论

原文:https://blog.csdn.net/ckzhb/article/details/72871140 

一、基本用法

[y,ps] = mapminmax(x,ymin,ymax)       % 这里如果不指定 ymin,ymax,则ymin默认为-1,ymax默认为1。
       mapminmax(data)                默认归一化范围为[-1,1],且对每一行做归一化。一定记住是对行进行归一化!!!
   

二、归一化的讨论

参考:http://www.ilovematlab.cn/thread-63766-1-1.html

[train_scale,test_scale,ps] = scaleForSVM(train_data,test_data,ymin,ymax)

输入:
train_data:训练集
test_data:测试集
ymin:归一化范围下限(可不输入,默认为0)
ymax:归一化范围上限(可不输入,默认为1)

输出:
train_scale:归一化后的训练集
test_scale:归一化后的测试集
ps:归一化映射

测试代码:
train_data = [1 12;3 4;7 8]
test_data = [9 10;6 2]

[train_scale,test_scale,ps] = scaleForSVM(train_data,test_data,0,1)
运行结果:

  1. train_data =
  2.      1    12
  3.      3     4
  4.      7     8
  5. test_data =
  6.      9    10
  7.      6     2
  8. train_scale =
  9.          0    1.0000
  10.     0.2500    0.2000
  11.     0.7500    0.6000
  12. test_scale =
  13.     1.0000    0.8000
  14.     0.6250         0
  15. ps =
  16.       name: 'mapminmax'
  17.      xrows: 2
  18.       xmax: [2x1 double]
  19.       xmin: [2x1 double]
  20.     xrange: [2x1 double]
  21.      yrows: 2
  22.       ymax: 1
  23.       ymin: 0
  24. yrange: 1
  25. 说明:归一化并不是必须采用的预处理方法。但一旦采用了,这个步骤就十分重要,因为这是使用SVM的第一步骤,原始数据从这里将会被变化,若处理不当会使后面的分类或回归效果不佳
  26.   原始数据到底该怎么进行归一化,我想到的是以下的几个问题:
    (1)是对每一个样本进行进行归一化(按行归一化)还是对每一个维度进行归一化(按列归一化)?
    (2)是将训练集和测试集分别归一化还是放在一起形成一个大矩阵一起进行归一化?


    对于上面的我个人的理解和给出的解决办法是:
    (1)对每一个维度进行归一化
    理由:对于每个样本,由于它的每一个维度的量纲不同,若对每一个样本进行归一化且在量纲数量级差别悬殊时会使样本中较低数量级的属性变为0,会使原始信息过多丧失。比如:
    sample =
        1    2    0.5    100000
        5    7    0.4    200000
    若按行对每一个样本进行[0,1]归一化(按行归一化),则结果为:

        sample_scale =
          0.0000    0.0000         0    1.0000
         0.0000    0.0000         0    1.0000
你会看到由于数量级的差别,对于每一样本的前三维的数据都被归一化为0,这样其实是不合理,会使原始数据的信息过多丢失。但若采用对每一维度进行归一化,就不会大范围发生这种情况,因为对于同一维度,量纲级别是相同的。对每一维度进行[0,1]归一化(按列归一化),结果为:

 sample_scale =
     0     0     1     0
     1     1     0     1

(2)将训练集和测试集放在一起,一起进行归一化。
理由:用测试代码中的例子

train_data =
     1    12
     3     4
     7     8
test_data =
     9    10
     6     2
若先将训练集进行归一化(按每一维度进行),然后把这个归一化映射记录下来,当有测试集时再用这个归一化映射对测试集进行归一化,对训练集进行归一化时对于第一维度归一化映射记录的最大值是7,这就接受一个假设是所有数据的第一维度的最大值不能超过7,但我们看到新的测试集拿来的时候它的第一维度的值不一定非得小于7,测试数据中的测试集的第一维度的最大值为9>7。即若分别归一化会产生这种不合理的现象。将训练集和测试集放在一起归一化就可以避免这种情况,统一归一化时每一维度的最大值和最小值是从训练集和测试集中寻找。

问题一:
在智能算法程序实现中中,原始数据应当对每一个属性(维度进行归一化)即应当使数据集data中行代表属性,列代表样本数据个数。而数据读取函数textread、xlsread均根据数据集进行按列读取,因此,我们必须在归一化时注意是否需要转置。
 
问题二:
常用形式:
[inputtrain,setting] = mapminmax(input_train');
inputtest = mapminmax('apply',input_test',setting);
 
这两句命令代表将Input_text按input_train的归一化规则进行归一化,但是前提必须是input_test中的数据必须在inout_train数据的最小值和最大值之间
两种观点:
一种是将数据集与测试集放在一起进行归一化;另一种是不用在意测试集的最值,因为实际中测试数据本身就是不确定的,正好可以检测模型的诊断/预测能力。个人倾向于后者。具体情况还要具体对待
note:

BP神经网络中,newff函数使用的数据m行n列,行代表数据属性值,列代表数据样本的个数。
libSVM中,各函数使用的矩阵m行n列比如880X6,行代表数据样本的个数,列代表数据的属性值。两者正好相反。
--------------------- 



 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值