再议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

时间: 2024-10-21 17:59:22

再议Matlab归一化函数的相关文章

再议指针---------函数回调(qsort函数原理)

我们能否写一个这样的函数: 可以对任何类型数据排序 任何人在使用该函数不需要修改该函数代码(即:用户可以不必看到函数源 码,只会调用就行) 思考: 用户需要排序的数据的类型千变万化,可能是int型,也有可能是自定义的结构体类型,各种类型的大小比较规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能. 但具体需要排序的类型应按照什么规则确定大小只有使用该函数的用户最清楚,那我们可不可以把实现比较大小的功能交给用户来完成了,到时候用户只需告诉该函数比较规则(函数)在什么位置,这样排序函数不就

Matlab中函数句柄@的作用及介绍

问:[email protected](x)acos(x)表示什么意思?其中@代表什么?答:表示f为函数句柄,@是定义句柄的运算符.[email protected](x)acos(x) 相当于建立了一个函数文件:% f.mfunction  y=f(x)y=acos(x); 若有下列语句:[email protected](x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2); 则相当于建立了一个函数文件: % xsqual.m fun

matlab set函数

1.MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值.例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-' .':'.'-.'.'--'或'none'.2.属性的操作    set函数的调用格式为:    set(句柄,属性名1,属性值1,属性名2,属性值2,…) 例子: clearx=0:0.2:12;y1=bessel(1,x);y2=bessel(2,x);y3=bessel(3,x);h=plot(x,y1,x,y2,x

第十节课:再议数据结构与数据类型

一.list, dict, tuple之它们其实是好基友 1. 没有最优秀的数据结构,只有最适用的. 2. 了解每个数据结构才能活学活用 3. 它们相互转化如此简单 ps:如果一个问题能用Python的内置数据类型解决,推荐使用内置的数据类型,这样做的效率是比较好的. list[1,2,3,4] 是有序的 list[0] list[1] list[2] 如果涉及到的问题是有顺序的就可以考虑使用list 字典是键值(本质上list也是键值,键就是游标,只不过是整型), 但字典的键可以是字符串(语义

MyEclipse调用Matlab打包函数

本文部分内容参考了http://www.360doc.com/content/15/1103/16/1180274_510463048.shtml 一.检查Java环境 对于已经装上JAVA环境的计算机,首先要确定一下装的环境是否与当前的Matlab builder for java版本相兼容,本文使用的Matlab版本是R2014a. 在CMD.EXE中键入 :java -version 如果出现图中信息则表示已经安装好了JAVA环境并且可以看到它的版本 进一步在cmd中输入javac -ve

matlab reshape函数

语法 (1)B = reshape(A,m,n) 用法: B=reshape(A,m,n) 返回m*n矩阵B,它的元素是获得A的行宽度.如果A没有m*n元素,得到一个错误结果. 例子: <span style="font-size:18px;">>> A=rand(1,10)</span> 结果: <span style="font-size:18px;">A = Columns 1 through 8 0.1622

再议 js 数字格式之正则表达式

原文:再议 js 数字格式之正则表达式 前面我们提到到了js的数字格式<浅谈 js 数字格式类型>,之前的<js 正则练习之语法高亮>里也提到了优化数字匹配的正则.不过最近落叶给了我一个正则,让我豁然开朗,比我写的犀利多了,所以今天拿出来简单说一下(只说十进制部分的匹配). 先看下我之前写的正则:/\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?/落叶在 jQuery 中发现的正则: /(?:\d*\.|)\d+(?:[eE

Matlab中函数定义方法

Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件,直接定义: n4.匿名函数: n5.Syms+subs:无需M文件,直接定义: n6.字符串+subs:无需M文件,直接定义. ------------ 1.函数文件+调用函数文件:定义多个M文件 % 调用函数文件:myfile.m clear clc for t=1:10 y=mylfg(t);

matlab 等值线函数 contour

matlab 等值线函数 contour contour是等高线绘制函数我并没怎么用过这个函数,只是参照help将上面的英文翻译一下,如果有错误,请大家提出来.contour(Z)根据矩阵Z画出等高线,Z是以x,y为平面的高度.Z必须是一个至少二维的矩阵.等高线的数量和水平线的值将根据Z值的最小值和最大值自动选择.x,y轴的范围是[1:n]和[1:m],[m,n]=size(Z)contour(Z,n)用n条水平线来绘制Z的等高线.contour(Z,v)是以向量v中的数据来绘制矩阵Z的等高线.