y = mapminmax(‘apply‘,x,ps)与mapminmax(‘reverse‘,y,ps)

在使用mapminmax过程中发现了一些问题,整理了其他人的一些讲解放到这里,参考的链接放到文末

mapminmax简介

mapminmax功能为将矩阵的每一行处理成[-1,1]区间(默认)。对于常见模式识别或者其他统计学来说,数据应该是每一列是一个样本,每一行是多个样本的同一维,即对于一个M*N的矩阵来说,样本的维度是M,样本数目是N,一共N列N个样本。

注:

BP神经网络中,newff函数使用的数据m行n列,行代表数据属性值,列代表数据样本的个数。(所以在归一化的时候,所用矩阵要行为特征数,列为样本数。

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

调用形式:

[Y,PS] = mapminmax(X)
[Y,PS] = mapminmax(X,FP)
Y = mapminmax('apply',X,PS)
X = mapminmax('reverse',Y,PS)

可参见数据归一化 normlization.m 及 Z-score(bsxfun)与mapminmax区分_FDA_sq的博客-CSDN博客_数据归一化函数

1. [Y,PS] = mapminmax(X)

ps 参数是一个结构体,主要包含了映射前的矩阵每一行的最小值 xmin, 最大值 xmax, 以及映射到的新矩阵每一行的 ymin, ymax信息 (ymin默认为-1,ymax默认为1)。这些信息是可以直接通过 mapminmax 返回的

[y,ps] = mapminmax(x,ymin,ymax)   % 这里如果不指定 ymin,ymax,则ymin默认为-1,ymax默认为1

这一句的映射过程就是将输入矩阵的每一行最小值 xmin 映射到 ymin,最大值 xmax 映射到 ymax,介于 xmin 和 xmax之间的数值按均匀映射。所以,这个映射实际上是一个线性关系:
y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;

2. Y = mapminmax('apply',X,PS)

一般,'apply' 配合 ps,是说将之前执行 mapminmax 调用得到的参数设置 ps 应用当前这句调用里。
每一句 mapminmax 调用,都可以获取当前的 ps 参数,然后将 ps 参数里的   xmin, xmax, ymin, ymax 用于下一句 mapminmax 调用 (通过指定'apply'  ps 参数实现),这样,就会用 ps 里指定的 xmin, xmax, ymin, ymax 来代入上述公式映射了,而不会按照矩阵自己的每一行  xmin, xmax 来映射了。

常见格式:

[inputtrain,ps] = mapminmax(input_train');

inputtest = mapminmax('apply',input_test',ps);

这两句命令代表将Input_text按input_train的归一化规则进行归一化,但是前提必须是input_test中的数据必须在inout_train数据的最小值和最大值之间

举个例子:

x1 = [1 2 4;1 1 1;3 2 2;0 0 0];
[y1,PS1] = mapminmax(x1)  % 映射 x1 到 y1,并得到 ps1 参数

x2 = [5 2 3;1 1 1;6 7 3;0 0 0];
[y2,PS2] = mapminmax(x2)  % 映射 x2 到 y2,并得到 ps2 参数 (用矩阵 x2自己的xmin,xmax,映射到 ymin = -1,ymax = -1)

[y3,PS3] = mapminmax('apply',x2,PS1) % 通过使用 ps1 参数来映射 x2 到 y3,这样,使用的 xmin、xmax、ymin、ymax 和 映射 x1 到 y1 相同。返回的 ps3跟ps1一样

结果:

y1 =

   -1.0000   -0.3333    1.0000
    1.0000    1.0000    1.0000
    1.0000   -1.0000   -1.0000
         0         0         0

PS1 = 

  包含以下字段的 struct:

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

y2 =

    1.0000   -1.0000   -0.3333
    1.0000    1.0000    1.0000
    0.5000    1.0000   -1.0000
         0         0         0

PS2 = 

  包含以下字段的 struct:

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

y3 =

    1.6667   -0.3333    0.3333
    1.0000    1.0000    1.0000
    7.0000    9.0000    1.0000
         0         0         0

PS3 = 

  包含以下字段的 struct:

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

可以看到,y3返回的 ps3跟ps1一样

3. X = mapminmax('reverse',Y,PS)

X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,将归一化的数据反归一化再得到原来的数据:

>> x1 = [1 2 4]
>> [y1,ps] = mapminmax(x1);
>> xtt = mapminmax('reverse',y1,ps)
xtt =
     1     2     4

此时又得到了原来的x1(xtt = x1);

在回归分析的时候,得出的预测值就可以根据训练值的ps回归,和训练值的真实值对比。实例可见下文

两种观点:

在做测试和训练时,使用mapminmax对数据点归一化时,一般有两种方式,一种是将数据集与测试集放在一起进行归一化;另一种是将测试集按照训练集的归一化原则进行归一化处理,即先处理训练集得到一个映射关系,然后用这个映射关系去处理测试集,不用在意测试集的最值,因为实际中测试数据本身就是不确定的,正好可以检测模型的诊断/预测能力。

至于为什么要将测试集按照训练集的归一化原则进行归一化处理,给出原博主回答:

我想问一下为什么要将测试集按照训练集的归一化原则进行归一化处理呢?单独将测试集归一化处理会有什么不同?

:你要确保训练集和测试集是同一个范围的。比如你训练集数据区间是[0,100],而测试集数据区间是[0,10000],那归一化结果就不准。

参考链接: 

【新提醒】y = mapminmax('apply',x,ps)中各个参数是什么意思呢? – MATLAB中文论坛 (ilovematlab.cn)

(4条消息) Matlab中的数据预处理-归一化(mapminmax)与标准化(mapstd)_老子今晚不加班的博客-CSDN博客_mapminmax

(4条消息) 归一化函数mapminmax的讨论_hubery_zhang的博客-CSDN博客_mapminmax函数 归一化

mapminmax的用法详解 _MATLAB - Lunais - 博客园 (cnblogs.com)

实例:

给出一个博主使用bp神经网络时归一化和反归一化的实例:

 (4条消息) 机器学习 BP神经网络_Dr·Chen的博客-CSDN博客_spectra_data.mat

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值