归一化的目的
首先,我们假设
按照常理来说,我们可以想象θ1x1与θ2x2对y的贡献应该是一样大的,即θ1x1=θ2x2,但如果下x1<<x2的情况出现,那么θ'1>>θ'2。
在梯度下降时,最初的θ1与θ2是通过正态分布随机出来的,所以两者的大小是相差不大的,但是最终的θ'1和θ'2却是相差巨大的。
我们设
那么会有|D1|>>|D2|。又因为x1<<x2,我们根据梯度公式
可以得到g1 << g2。参数的调整公式为
所以θ1的调整程度远小于θ2的调整程度。
综上所述,θ1的调整速率小于θ2,但θ1的改变量却远大于θ2,所以θ1只能增加它的轮次来满足条件,否则就会矛盾。而这种等待会耗费时间,这是我们不愿看见的,所以为了解决这个矛盾,归一化应运而生。
结论:归一化的目的是使得最终梯度下降的时候可以不同维度θ参数可以在接近的调整幅度上。
同时,归一化可以去量纲化,这可能会提高一些分类器的精度,例如KNN算法。
归一化分类
最大值最小值归一化
min(x(i,j))是对应X矩阵第j列特征值的最小值,max(x(j))是对应X
阵第j列特征值的最大值
缺点:易受离群值(噪声)的干扰。
标准归一化
基本概念
均值Xmean指的是第j列的均值,而不是所有数据的均值。同样地,标准差也是第j列的标准差。
其中μ为所有样本的均值,σ为所有样本数据的标准差,经过处理的数据符合正态分布。
其中,fi是样本权重,这里设置为1。
优势
我们观察这个公式,可以发现,原始数据被减去了平均值,这是为什么呢?
我们观察梯度下降公式:
如果Xj >= 0,那么不管如何调整,参数的调整方向都是一致的,而减去平均值可以让部分Xj小于0而让参数变化方向不一致而产生更好的结果。
不易受噪声干扰也是它的一大优势。
代码部分
from sklearn.preprocessing import StandardScaler
import numpy as np
data = np.array([1,2,3,7,7,5,5])
data = data.reshape((-1,1))
scaler = StandardScaler()
scaler.fit(data)
print(scaler.mean_)#均值
print(scaler.var_)#方差
data_new = scaler.transform(data)
print(data_new)#归一化后的矩阵
scaler.fit(data_new)
print(scaler.var_)#计算归一化后的方差 == 1
print(scaler.mean_)#计算归一化后的均值 == 0