归一化是一种简单的计算方式,即将有量纲的表达式,经过变换,转换为无量纲的表达式,称为标量。归一化是机器学习中的一项基础工作。
归一化有两种方式,一种是把数变为(0,1)之间的小数,一种是把有量纲表达式变为无量纲表达式。
归一化的作用:不仅能够提高求解速度,还可能提高计算精度。
比如:计算样本距离时,如果特征向量取值范围相差很大,如果不进行归一化处理,则值范围更大的特征向量对距离的影响更大,实际情况是,取值范围更小的特征向量对距离影响更大,这样的话,精度就会收到影响
从集合的角度可以做维度的归一,即抽象化归一。还有一种是向量的归一化。
维度的归一化方法一般包含:
1.线性函数归一化(Min-Max scaling)
线性函数将原始数据线性化的方法转换到[0 1]的范围,
Xnorm = (X-Xmax)/(Xmax-Xmin)
Xnorm为归一化后的数据,X为原始数据,Xmax、Xmin分别为原始数据集的最大值和最小值。
2.欧式距离标准化(用的比较多)
标准欧式距离的思路:既然数据各维分量的分布不一样,那么先将各个分量都“标准化”到均值、方差等。
标准化后的值=(标准化前的值-分量的均值)/分量的标准差
3、非线性归一化(Nonlinear Scaling)
包括对数log,指数e,正切等。
应用场景:数据分化比较大,有些很大,有些很小,可能用此方法将数值映射到一个比较小的范围进行处理。log(V,2),log(V,10).
个人认为:机器学习中一般做维度的归一化。由于样本的数量一般比较多,做向量的归一化处理过程与样本的数据有关系,样本太大,归一化过程应该也比较长。
mat=mat([[5000,25550],[3200,25550],[0.25,15],[0.3,10]])
print mat
[m,n]=shape(mat)
for i in xrange(n): #维度的归一化
mat[:,i]=(mat[:,i]-mean(mat[:,i]))/std(mat[:,i])
print mat
#行向量归一化
def cal2NF(X):
return linalg.norm(X)
for i in xrange(m):
two_NF = cal2NF(mat[i,:])
for j in xrange(n):
mat[i,j]=mat[i,j]/two_NF
print mat
#结果
[[ 5.00000000e+03 2.55500000e+04]
[ 3.20000000e+03 2.55500000e+04]
[ 2.50000000e-01 1.50000000e+01]
[ 3.00000000e-01 1.00000000e+01]]
[[ 1.3743447 0.99999999]
[ 0.5357224 0.99999999]
[-0.9550452 -0.9998042 ]
[-0.9550219 -1.00019578]]
[[ 0.80860269 0.58835508]
[ 0.47222698 0.88147699]
[-0.69073555 -0.72310746]
[-0.6905853 -0.72325096]]