概述
原文: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)
运行结果:
- train_data =
- 1 12
- 3 4
- 7 8
- test_data =
- 9 10
- 6 2
- train_scale =
- 0 1.0000
- 0.2500 0.2000
- 0.7500 0.6000
- test_scale =
- 1.0000 0.8000
- 0.6250 0
- ps =
- name: 'mapminmax'
- xrows: 2
- xmax: [2x1 double]
- xmin: [2x1 double]
- xrange: [2x1 double]
- yrows: 2
- ymax: 1
- ymin: 0
- yrange: 1
- 说明:归一化并不是必须采用的预处理方法。但一旦采用了,这个步骤就十分重要,因为这是使用SVM的第一步骤,原始数据从这里将会被变化,若处理不当会使后面的分类或回归效果不佳。
- 原始数据到底该怎么进行归一化,我想到的是以下的几个问题:
(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,行代表数据样本的个数,列代表数据的属性值。两者正好相反。
---------------------
最后
以上就是美丽滑板为你收集整理的归一化函数mapminmax的讨论的全部内容,希望文章能够帮你解决归一化函数mapminmax的讨论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复