NumPy数据的归⼀化
数据的归⼀化
⾸先我们来看看归⼀化的概念:
数据的标准化(normalization)和归⼀化
numpy库是标准库吗数据的标准化(normalization)是将数据按⽐例缩放,使之落⼊⼀个⼩的特定区间。在某些⽐较和评价的指标处理中经常会⽤到,去除数据的单位限制,将其转化为⽆量纲的纯数值,便于不同单位或量级的指标能够进⾏⽐较和加权。其中最典型的就是数据的归⼀化处理,即将数据统⼀映射到[0,1]区间上。
⽬前数据标准化⽅法有多种,归结起来可以分为直线型⽅法(如极值法、标准差法)、折线型⽅法(如三折线法)、曲线型⽅法(如半正态性分布)。不同的标准化⽅法,对系统的评价结果会产⽣不同的影响,然⽽不幸的是,在数据标准化⽅法的选择上,还没有通⽤的法则可以遵循。
归⼀化的⽬标
1 把数变为(0,1)之间的⼩数
主要是为了数据处理⽅便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。
2 把有量纲表达式变为⽆量纲表达式
归⼀化是⼀种简化计算的⽅式,即将有量纲的表达式,经过变换,化为⽆量纲的表达式,成为纯量。⽐如,复数阻抗可以归⼀化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。
另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以如此处理,既保证了运算的便捷,⼜能凸现出物理量的本质含义。
归⼀化后有两个好处
1. 提升模型的收敛速度
如下图,x1的取值为0-2000,⽽x2的取值为1-5,假如只有这两个特征,对其进⾏优化时,会得到⼀个窄长的椭圆形,导致在梯度下降时,梯度的⽅向为垂直等⾼线的⽅向⽽⾛之字形路线,这样会使迭代很慢,相⽐之下,右图的迭代就会很快(理解:也就是步长⾛多⾛少⽅向总是对的,不会⾛偏)
2.提升模型的精度
归⼀化的另⼀好处是提⾼精度,这在涉及到⼀些距离计算的时效果显著,⽐如算法要计算欧⽒距离,上图中x2的取值范围⽐较⼩,涉及到距离计算时其对结果的影响远⽐x1带来的⼩,所以这就会造成精度的损失。所以归⼀化很有必要,他可以让各个特征对结果做出的贡献相同。
在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的⽔平相差很⼤时,如果直接⽤原始指标值进⾏分析,就会突出数值较⾼的指标在综合分析中的作⽤,相对削弱数值⽔平较低指标的作⽤。因此,为了保证结果的可靠性,需要对原始指标数据进⾏标准化处理。
在数据分析之前,我们通常需要先将数据标准化(normalization),利⽤标准化后的数据进⾏数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和⽆量纲化处理两个⽅⾯。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作⽤⼒的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评⽅案的作⽤⼒同趋化,再加总才能得出正确结果。数据⽆量纲化处理主要解决数据的可⽐性。经过上述标准化处理,原始数据均转换为⽆量纲化指标测评值,即各指标值都处于同⼀个数量级别上,可以进⾏综合测评分析。
从经验上说,归⼀化是让不同维度之间的特征在数值上有⼀定⽐较性,可以⼤⼤提⾼分类器的准确性。
现在我们再来看看基础的NumPy代码是如何实现的:
>>> x=np.random.random((10,3))
>>> x
array([[0.44951388, 0.58974524, 0.43980589],
[0.3082853 , 0.71042825, 0.02617535],
[0.10836115, 0.66774964, 0.85824697],
[0.01442332, 0.76459011, 0.75151452],
[0.64054078, 0.02121539, 0.87271819],
[0.75971598, 0.4268253 , 0.66039724],
[0.11865255, 0.14679259, 0.53782096],
[0.85085254, 0.26284603, 0.00246512],
[0.41957758, 0.96842006, 0.65555725],
[0.70227785, 0.78120928, 0.54771033]])
>>> x.mean(0)
array([0.43722009, 0.53398219, 0.53524118])
>>> an(0)
>>> xc
array([[ 0.01229379,  0.05576305, -0.0954353 ],
[-0.1289348 ,  0.17644606, -0.50906583],
[-0.32885894,  0.13376745,  0.32300579],
[-0.42279677,  0.23060792,  0.21627333],
[ 0.20332068, -0.5127668 ,  0.33747701],
[ 0.32249589, -0.10715689,  0.12515606],
[-0.31856754, -0.3871896 ,  0.00257978],
[ 0.41363245, -0.27113616, -0.53277606],
[-0.01764252,  0.43443787,  0.12031607],
[ 0.26505776,  0.24722709,  0.01246915]])
>>> xc.mean(0)
array([ 5.55111512e-18,  3.33066907e-17, -4.44089210e-17])
因为最后归⼀化的均值在0附近,因此在机器精度范围之内,该均值为0。