在用Matlab建立bp神经网络时,需要对特征值进行缩放,进行归一化。遇到以后,查阅了一些文章,进行了一些汇总。
用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。
premnmx语句的语法格式是:
[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T),其中P,T分别为原始输入和输出数据。
警告:PREMNMX is an obsolete function.Use MAPMINMAX instead.
p = [1 2 3 4 5 6 7 8 9];
>> [input,minI,maxI] = premnmx(p)
警告: PREMNMX is an obsolete function.
> In nnerr.obs_fcn (line 17)
In premnmx (line 23)
Use MAPMINMAX instead, type HELP PREMNMX for bug warning.
input =
-1.0000 -0.7500 -0.5000 -0.2500 0 0.2500 0.5000 0.7500 1.0000
minI =
1
maxI =
9
在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx函数:
tramnmx语句的语法格式是:[PN]=tramnmx(P,minp,maxp)
其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
警告: TRAMNMX is an obsolete function.Use MAPMINMAX instead.
p1 = [10 11 12 13 14 15 16 17 18 19]
p1 =
10 11 12 13 14 15 16 17 18 19
>> [pn] = tramnmx(p1,minI,maxI)
警告: TRAMNMX is an obsolete function.
> In nnerr.obs_fcn (line 17)
In tramnmx (line 10)
Use MAPMINMAX instead.
pn =
1.2500 1.5000 1.7500 2.0000 2.2500 2.5000 2.7500 3.0000 3.2500 3.5000
网络输出结果需要进行反归一化还原成原始的数据,常用的函数是:postmnmx。
postmnmx语句的语法格式是: [PN] = postmnmx(P,minp,maxp)
其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
[p3] = postmnmx(pn,minI,maxI)
p3 =
10 11 12 13 14 15 16 17 18 19
https://blog.csdn.net/hqh45/article/details/42965481
将矩阵的每一行处理成[-1,1]区间,此时对于模式识别或者其他统计学来说,数据应该是每一列是一个样本,每一行是多个样本的同一维,即对于一个M*N的矩阵来说,样本的维度是M,样本数目是N,一共N列N个样本。
mapminmax的数学公式为y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin。如果某行的数据全部相同,此时xmax=xmin,除数为0,则此时数据不变。
function [out]=myMapminmax(x,ymin,ymax)
out=(ymax-ymin).*(x-repmat(min(x,[],2),1,size(x,2)))./repmat((max(x,[],2)-min(x,[],2)),1,size(x,2))+ymin;
index=isnan(out);
out(index)=x(index);
end
其主要调用形式有:
1. [Y,PS] = mapminmax(X,YMIN,YMAX)
2. [Y,PS] = mapminmax(X,FP)
3. Y = mapminmax('apply',X,PS)
4. X = mapminmax('reverse',Y,PS)
5. dx_dy = mapminmax('dx_dy',X,Y,PS)
对于1和2的调用形式来说,X是预处理的数据,Ymin和Ymax是期望的每一行的最小值与最大值,FP是一个结构体成员主要是FP.ymin, FP.ymax.这个结构体就可以代替Ymin和Ymax,1和2的处理效果一样,只不过参数的带入形式不同。
x=[2,3,4,5,6;7,8,9,10,11];
mapminmax(x,0,1)
fp.ymin=0;
fp.ymax=1;
mapminmax(x,fp)
而对于3式,在模式识别或者统计学里,PS是训练样本的数据的映射,即PS中包含了训练数据的最大值和最小值,这里的X是测试样本,对于测试样本来说,预处理应该和训练样本一致即最大值和最小值应该是训练集的最大值与最小值。假设y是测试样本,一共两个测试样本,则代码如下:
x=[2,3,4,5,6;7,8,9,10,11];
y=[2,3;4,5];
[xx,ps]=mapminmax(x,0,1);
mapminmax('apply',y,ps)
对于4式,是预处理之后的数据进行反转得到原始数据。
x=[2,3,4,5,6;7,8,9,10,11];
y=[2,3;4,5];
[xx,ps]=mapminmax(x,0,1);
yy=mapminmax('apply',y,ps);
mapminmax('reverse',yy,ps)
对于5式,根据给定的矩阵X、标准化矩阵Y及映射PS,获取逆向导数(reverse derivative)。如果给定的X和Y是m行n列的矩阵,那么其结果dx_dy是一个1×n结构体数组,其每个元素又是一个m×n的对角矩阵。这种用法不常用,这里不再举例。
将矩阵的每一行映射为0均值1方差的数据
公式为y = (x-xmean)*(ystd/xstd) + ymean。如果设置的ystd=0,或某行的数据全部相同(此时xstd =0)
function [out] = myMapstd(x,ymean,ystd) out=(x-repmat(mean(x,2),1,size(x,2)))./repmat(std(x,0,2),1,size(x,2)).*ystd+ymean;
end
主要调用形式有:
1. [Y,PS] = mapstd(X,ymean,ystd)
2. [Y,PS] = mapstd(X,FP)
3. Y = mapstd('apply',X,PS)
4. X = mapstd('reverse',Y,PS)
5. dx_dy = mapstd('dx_dy',X,Y,PS)