(1)数值归一化法
当数据包含不同量纲的多种变量时,数值间的差别可能很大,例如有些有机酸的离解常数(pKa)数值大约为个位数或为负数,沸点数据则约为几十摄氏度或数百摄氏度。再如所采用的单位不同,数据的大小也会有很大的差别,如毫摩尔浓度与摩尔浓度相差1000倍。如果将这种不同种类、不同量纲、数值大小差别很大的数据组合在一起进行模式识别,势必会影响到正确的分类。常用的解决方法就是对数据进行数值归一化。数值归一化就是把各个变量的数据都线性地变换到一个新的标尺上,在新标尺上,每个变量的最大值都为1。第i个变量数值归一化公式为
http://s2/mw690/002EBwmJzy6ZM9qwSyd21&690
式中xi,old为原始数据;xi,new为变换后的新数据;xmax为原始数据中的最大值;n为数据中变量个数。该变换保证了各变量的数据都≤1。有时为了将数据规范为0~1之间的数值,即变换后数据的最小值为0,最大值为1,也常用下述公式进行预处理:
http://s1/mw690/002EBwmJzy6ZM9reveg90&690
式中,xmin为原始数据中的最小值。数值归一化可以保证各变量的变化幅度处于同一水平上,从而消除了数据本身差别带来的影响。但其缺点是,若数值集合中有一个数值很大,则其余各值都会相差不大。
(2)方差归一化法
方差可以用来描述变量的变化幅度,而在处理化学数据时,有时我们更关注数据的变化幅度,因此从方差这个角度进行数据归一化就是方差归一化方法,常用下面的公式进行变换,
http://s11/mw690/002EBwmJzy6ZM9s7V7Yba&690
式中,m为变量i的均值;Vj为该变量的方差。经变换后的数据方差为1,它保证了各变量的方差一致,各变量在分类过程中影响程度相同。
案例.matlab
mapminmax函数实现极差归一化
对数据{xn},归一化为{x’n}落到区间[Ymin, Ymax](默认是[-1, 1]), 公式:
x’n =(Ymax-Ymin)* (xn-Xmin)/(Xmax-Xmin) + Ymin
调用格式:[Y, PS] = mapminmax(X,Ymin,Ymax); % PS记录该变换过程mapminmax('apply',Z,PS); % 对矩阵Z实施PS变换过程mapminmax('reverse',Y,PS) ; % 从Y变换回X
注:(1) Matlab7.1之前版本没有mapminmax函数,可以用premnmx函数。Matlab 2012版本之前mapminmax函数有bug,按标准格式调用得到的结果是错误的,需要特殊处理一下;(2) 若矩阵中有缺省数据,需要用fixunknowns函数。
例1 Matlab极差归一化测试程序。
代码:
x=[1 2 4; 1 1 1; 3 2 2; 0 0 0];
[y,ps]=mapminmax(x)
% 直接调用函数对矩阵的每一行数据做归一化
% 注意:Matlab2012之前的版本有bug,
% 使用mapminmax(X,Ymin,Ymax)得不到正确结果
% 归一到区间[0,1]可以如下处理:
ps.ymin=0; %归一化后的最小值
ps.ymax=1; %归一化后的最大值
ps.yrange=1;
%归一化后的极差,值为ps.ymax-ps.ymin。若未调整该值,则逆运算会出错
[y1,ps]=mapminmax(x,ps)
x1=mapminmax('reverse',y2,ps) % 变换回来,回到原来的矩阵
x2=[5 2 3; 1 1 1; 6 7 3; 0 0 0];
y2=mapminmax('apply',x1,ps)
% 对矩阵x2实施同样的归一化变换,也有bug,结果错误
% 直接编程计算对矩阵的每一列数据做归一化
[r,l]=size(x);
y3=(x-repmat(min(x),r,1))./(repmat(max(x),r,1)…
-repmat(min(x),r,1))
运行结果:x =
1 2 4
1 1 1
3 2 2
0 0 0
y =
-1.0000 -0.3333 1.0000
1.0000 1.0000 1.0000
1.0000 -1.0000 -1.0000
0 0 0
ps =
name: 'mapminmax'
xrows: 4
xmax: [4x1 double]
xmin: [4x1 double]
xrange: [4x1 double]
yrows: 4
ymax: 1
ymin: -1
yrange: 2
no_change: 0
y1 =
0 0.3333 1.0000
1.0000 1.0000 1.0000
1.0000 0 0
0 0 0
ps =
name: 'mapminmax'
xrows: 4
xmax: [4x1 double]
xmin: [4x1 double]
xrange: [4x1 double]
yrows: 4
ymax: 1
ymin: 0
yrange: 1
no_change: 0
x1 =
1 2 4
1 1 1
3 2 2
0 0 0
x2 =
5 2 3
1 1 1
6 7 3
0 0 0
y2 =
1.3333 0.3333 0.6667
1.0000 1.0000 1.0000
4.0000 5.0000 1.0000
0 0 0
y3 =
0.3333 1.0000 1.0000
0.3333 0.5000 0.2500
1.0000 1.0000 0.5000
0 0 0
加载中,请稍候......