数据归一化总结
近来,在网上搜了很多关于数据归一化的帖子,看了太多,很杂,这里整理总结一下
归一化是一种数据预处理方法,就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内,为了后面数据处理的方便,其次是保正程序运行时收敛加快。
比如说,对于奇异样本数据(所谓奇异样本数据数据指的是相对于其他输入样本特别大或特别小的样本矢量),奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,所以对于训练样本存在奇异样本数据的数据集在训练之前,最好先进形归一化,若不存在奇异样本数据,则不需要事先归一化。
在matlab里面,用于归一化的方法共有三种:
(1)premnmx、postmnmx、tramnmx
(2)prestd、poststd、trastd
(3)是用matlab语言自己编程。
premnmx一般在低版本的matlab中不能使用,可能会直接转向MAPMINMAX函数
对于mapminmax函数的一般接口:
>>[Y,PS] = mapminmax(X)
>>[Y,PS] = mapminmax(X,FP)
>>Y = mapminmax('apply',X,PS)
>>X = mapminmax('reverse',Y,PS)
其中,y是对进行某种规范化后得到的数据,这种规范化的映射记录在结构体ps中。那么,ps的结构是什么,可以通过程序测试一下:
- >> x1 = [1 2 4]
- >> [y,ps] = mapminmax(x1)
- y =
- -1.0000 -0.3333 1.0000
- ps =
- name: 'mapminmax'
- xrows: 1
- xmax: 4
- xmin: 1
- xrange: 3
- yrows: 1
- ymax: 1
- ymin: -1
- yrange: 2
其中的映射算法如下, 其中ymin和ymax参数可以自定义,默认的ymax=1,ymin=-1
* y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,将归一化的数据反归一化再得到原来的数据
- >> [y1,ps] = mapminmax(x1);
- >> xtt = mapminmax('reverse',y1,ps)
- xtt =
- 1 2 4
自己编写程序的时候呢,归一化方法主要有如下几种,供大家参考
1、线性函数转换,表达式如下:
y=(x-MinValue)/(MaxValue-MinValue)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
2、对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。
3、反余切函数转换,表达式如下:
y=atan(x)*2/PI
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;
我们用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx。
下面介绍tramnmx函数:
[Pn]=tramnmx(P,minp,maxp)
其中P和Pn分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
当需要对另外一组数据做归一时,比如SVM 中的 training data用以上方法归一,而test data就可以用下面的方法做相同的归一了
y2 = mapminmax('apply',x2,PS)
比如说
- >> x2 = [5 2 3]
- >> y2=mapminmax('apply',x2,ps)
- y2 =
- 1.6667 -0.3333 0.3333
我们发现,归一化的数据不在是(-1,1)范围内了,因为max(x2)~=max(x1)...
当需要把归一的数据还原时,可以用以下命令
x1_again = mapminmax('reverse',y,PS)