归一化问题

使用matlab学习svm,发如今对数据进行预处理时,要对数据进行归一化,而且,遇到问题:训练数据和测试数据是一块儿归一化处理好仍是分开归一化处理好?怎么肯定归一化的范围多大?是[0,1]仍是[-1,4]等,为何归一化范围不一样,对分类精度有影响?
断断续续的在网上找了几天,和同窗讨论了一下,总想找个确凿的答案,可是总结来讲为:
一、大多数状况应该对数据进行归一化处理,特别是在特征范围相差较大状况下。实在不知道归一化处理好很差时,那就针对本身的数据多进行实验测试一下。
二、对于训练数据和测试数据是否须要一块儿归一化的问题,认为多数状况下一块儿归一化处理得到的分类精度更好。
三、归一化范围,通常都取[-1,1],[0,1],而且前者效果好一些。
问题一: 对于归一化处理,其实现的是将一组数据映射到特定的数值范围内。好比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相对于其余数据,是两组奇异样本数据,所谓奇异样本,是相对于其余输入样本特别大或特别小的样本矢量。
这里写图片描述
在对数据进行操做前,先将数据归一化处理,使其无量纲化,避免较大数值的数据的变化掩盖掉小数值的变化。好比是二维数据,特征1的取值范围是[1000,2000],特征2的取之范围是[1,2],那么咱们二维画出的这些数据点基本都是在一个长条的数据区域内(1*1000的数据区域内),此时若是进行分类,特征2的变化几乎何以被忽略掉。同时这种分布不平衡的数据还会引发训练时间长,大数值样本或是收敛受到影响等问题。
mapmaxmin函数对特征数据归一化处理,是对每一特征来单独归一化的,也就是对图中每一列数据进行归一化。下图是归一化后的数据。归一化后的数据都被映射在[-1,1]范围内,对进一步的数据操做提供方便。
这里写图片描述
问题二:在分类问题中,训练数据和测试数据是否须要一块儿归一化处理,没有一个固定的答案说怎样好怎样很差,可是,一块儿进行归一化处理,咱们能够想到,这种作法会将训练数据和测试数据看做一个总体,由于此时映射函数中的输入数据集是训练数据和测试数据的总和,里面的(xmax,xmin)也是这个总和中的最大值和最小值,实际上,将训练数据和测试数据一块儿归一化,测试数据在必定程度上影响着分类模型的训练。此后再运用此分类模型对测试数据进行分类,避免产生”相同的训练数据和测试数据,由于训练数据集和测试数据集的(xmax,xmin)不一样,在分别归一化后,相同的数据得到不一样的归一化值,被分在不一样的类“的状况。可是,具体哪一种归一化作法能够得到更好的分类效果,只能根据本身的数据集,进行实验。web

问题三:归一化能够将数据集中太大或过小的样本映射到统一的范围内,可是,这个范围区间的选择怎么定呢?理论上,这个值能够本身随便设定,可是通常状况下,选取[-1,1],2个数值长度的空间,能获得比较好的分类效果。下面是测试实验截图:
(1)采用训练数据和测试数据一块儿归一化处理,范围为[0,1],得到精度为61.79%
这里写图片描述
(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%,归一化范围过大,又会丧失了归一化的优点。svg