归一化化定义:我是这样认为的,归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内,因为我们得到的样本数据中可能一个特征向量的某几个元素的值非常大,使得特征数据不在一个数量级,因此必须限定在一个合适的范围内。归一化就是为了后面数据处理的方便,其次是保正程序运行时收敛加快。
没有经过归一化,寻找最优解的过程:
经过归一化,把各个特征的尺度控制在相同的范围内:
------------------------------------------------------------------------------------------------------------------
归一化方法有如下:
![模式识别之样本数据归一化(Normalization)与标准化(Standardization) 模式识别之样本数据归一化(Normalization)与标准化(Standardization)](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMyNC9mN2UzNTAwZmVhYzdkMjA4MDYzZWQ0NTQ1MmQ3NjVmYy5wbmc%3D.png?w=700&webp=1)
在对数据进行操作前,先将数据归一化处理,使其无量纲化,避免较大数值的数据的变化掩盖掉小数值的变化。比如是二维数据,特征1的取值范围是[1000,2000],特征2的取之范围是[1,2],那么我们二维画出的这些数据点基本都是在一个长条的数据区域内(1*1000的数据区域内),此时如果进行分类,特征2的变化几乎何以被忽略掉。同时这种分布不平衡的数据还会引起训练时间长,大数值样本或是收敛受到影响等问题。
mapmaxmin函数对特征数据归一化处理,是对每一特征来单独归一化的,也就是对图中每一列数据进行归一化。下图是归一化后的数据。归一化后的数据都被映射在[-1,1]范围内,对进一步的数据操作提供方便。
问题二:在分类问题中,训练数据和测试数据是否需要一起归一化处理,没有一个固定的答案说怎样好怎样不好,但是,一起进行归一化处理,我们可以想到,这种做法会将训练数据和测试数据看作一个整体,因为此时映射函数中的输入数据集是训练数据和测试数据的总和,里面的(xmax,xmin)也是这个总和中的最大值和最小值,实际上,将训练数据和测试数据一起归一化,测试数据在一定程度上影响着分类模型的训练。此后再运用此分类模型对测试数据进行分类,避免产生”相同的训练数据和测试数据,因为训练数据集和测试数据集的(xmax,xmin)不同,在分别归一化后,相同的数据获得不同的归一化值,被分在不同的类“的情况。但是,具体哪种归一化做法可以获得更好的分类效果,只能根据自己的数据集,进行实验。
(2)采用训练数据和测试数据一起归一化处理,范围为[-1,1],获得精度为98.87%
对于归一化范围,我认为重要的不是选择[0,1]还是[-1,1],而是这个区间的长度是多少,这个区间长度才是对分类精度影响的真正原因。对于[0,1]或者是[3,4]等,归一化区间长度是1,实验验证他们的分类精度都是相同的61.79%,长度为2的[-1,1]和[3,5]归一化范围获得的分类精度都是98.87%,在我的理解,这个长度,直接影响着的是数据集的分布稀疏程度,而对于某些高维大数据集合的分类来说,如果没有稀疏性,可能svm并不实用。但是这个归一化区间长度并不是越大越好,试验中,将范围设置为[-1,10],分类精度只有65.16%,归一化范围过大,又会丧失了归一化的优势。
需要说明的事并不是任何问题都必须事先把原始数据进行规范化 , 也就是数据规范化这一步并不是必须要做的 , 要具体问题具体看待 , 测试表明有时候规范化后的预测准确率比没有规范化的预测准确率低很多 . 就最大最小值法而言 , 当你用这种方式将原始数据规范化后 , 事实上意味着你承认了一个假设就是测试数据集的每一模式的所有特征分量的最大值 ( 最小值 ) 不会大于 ( 小于 ) 训练数据集的每一模式的所有特征分量的最大值 ( 最小值 ), 但这条假设显然过于强 , 实际情况并不一定会这样 . 使用平均数方差法也会有同样类似的问题 . 故数据规范化这一步并不是必须要做的 , 要具体问题具体看待 .
1、min-max标准化(Min-max
normalization)
也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:
其中max为样本数据的最大值,min为样本数据的最小值。这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
2、log函数转换
通过以10为底的log函数转换的方法同样可以实现归一下,具体方法如下:
看了下网上很多介绍都是x*=log10(x),其实是有问题的,这个结果并非一定落到[0,1]区间上,应该还要除以log10(max),max为样本数据最大值,并且所有的数据都要大于等于1。
3、atan函数转换
用反正切函数也可以实现数据的归一化:
使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上。
4、l2-norm归一化
L2范数归一化就是向量中每个元素除以向量的L2范数:
![模式识别之样本数据归一化(Normalization)与标准化(Standardization) 模式识别之样本数据归一化(Normalization)与标准化(Standardization)](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMyNC9mN2UzNTAwZmVhYzdkMjA4MDYzZWQ0NTQ1MmQ3NjVmYy5wbmc%3D.png?w=700&webp=1)
MATLAB中对一个矩阵的行(列)归一化为二范数是1的简洁代码,一句实现:
(1) A = A./repmat(sqrt(sum(A.^2,2)),1,size(A,2));
%每一行(row )l2范数归一化
(2) A = A./repmat(sqrt(sum(A.^2,1)),size(A,1),1); %每一列(column )l2范数归一化
举例:
% normalize each row to unit
A = A./repmat(sqrt(sum(A.^2,2)),1,size(A,2));
% normalize each column to unit
A = A./repmat(sqrt(sum(A.^2,1)),size(A,1),1);
% % Nannan wang says that in matlab, cycling(循环) is time-consuming.
% % 能不用循环就不用循环
% % Examples
% A=[3 4;5 12];
% [m n] = size(A);
% % normalize each row to unit
% for i = 1:m
% A(i,:)=A(i,:)/norm(A(i,:));
% end
% A
% % another beautiful way to normalize each row to unit
% A=[3 4;5 12];
% A = A./repmat(sqrt(sum(A.^2,2)),1,size(A,2));
% A
%
%
% % normalize each column to unit
% A=[3 4;5 12];
% for i = 1:n
% A(:,i)=A(:,i)/norm(A(:,i));
% end
% A
% % another beautiful way to normalize each column to unit
% A=[3 4;5 12];
% A = A./repmat(sqrt(sum(A.^2,1)),size(A,1),1);
% A
----------------------------------------------
5、标准差标准化
经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
而并非所有数据标准化的结果都映射到[0,1]区间上,其中最常见的标准化方法就是Z标准化,也是SPSS中最为常用的标准化方法:
-----------------------------------------------------------------------------------------------------------------------------
应用SVM分类实验实例:
问题一:
对于归一化处理,其实现的是将一组数据映射到特定的数值范围内。比如matlab自带的mapmaxmin函数,所用的映射函数为y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin 其中,x为输入,y为归一化处理后的输出,[ymin,ymax]是映射的范围,如[0,1]或者[-1,4]等,而(xmax,xin)是输入的数据集x的最小值和最大值。如对于一个178*13的数据集,每一行代表一瓶酒,每一列代表一种特征(如下图)一共13个特征。而在这组数据中,特征5和特征13相对于其他数据,是两组奇异样本数据,所谓奇异样本,是相对于其他输入样本特别大或特别小的样本矢量。
mapmaxmin函数对特征数据归一化处理,是对每一特征来单独归一化的,也就是对图中每一列数据进行归一化。下图是归一化后的数据。归一化后的数据都被映射在[-1,1]范围内,对进一步的数据操作提供方便。
问题三:归一化可以将数据集中太大或太小的样本映射到统一的范围内,但是,这个范围区间的选择怎么定呢?理论上,这个值可以自己随便设定,但是一般情况下,选取[-1,1],2个数值长度的空间,能得到比较好的分类效果。下面是测试实验截图:
(1)采用训练数据和测试数据一起归一化处理,范围为[0,1],获得精度为61.79%