背景
归一化数据的目标,是为了让数据的分布变得更加符合期望,增强数据的表达能力。
归一化方式
线性归一化
相当于最大最小值归一化。
零均值归一化/Z-score标准化
可参考其它网站,比较常见
正态分布Box-Cox变换
box-cos变换可以将要给非正太分布转换为正太分布。
Batch Normalization 原理
这个batchNormalization近似来自于 零均值归一化/Z-score标准化。BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。增大导数值,增强反向传播信息流动性,加快训练收敛速度。但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作,这其实是变换的反操作: 首先,为啥要做BN, 没有BN肯定也是可以的,但是有BN效果肯定更好,众所周知,神经网络一旦训练起来,参数就要发生更新,出了输入层的数据外,其它层的数据分布是一直发生变化的,因为在训练的时候,网络参数的变化就会导致后面输入数据的分布变化,比如第二层输入,是由输入数据和第一层参数得到的,而第一层的参数随着训练一直变化,势必会引起第二层输入分布的改变,把这种改变称之为:Internal Covariate Shift,BN就是为了解决这个问题的,这个技巧在2015年的时候由谷歌提出,现在已经成为神经网络的标配。ML中通常都需要对原始数据进行中心化(Zero-Centered)和标准化(Normalization)处理,目的是得到均值为0,标准差为1 的服从标准正态分布的数据。
数据归一化到某一个区间
将数据归一化到任意区间[a, b]的方法
在数据分析的时候需要用到将原有的数据进行归一化,方便更好的绘图展示或者用做机器学习等其他用途。
(1)首先找到原本样本数据X的最小值Min及最大值Max
(2)计算系数:k=(b-a)/(Max-Min)
(3)得到归一化到[a,b]区间的数据:Y=a+k(X-Min) 或者 Y=b+k(X-Max)
将数据归一化到区间[1, 1000]的代码实现如下:
# python 代码实现, value 是list
k = 1000/(max(value)-min(value))
transform_value=[k*(x-min(value)) for x in value]
参考资料
https://www.zhihu.com/question/38102762 (算法)
https://blog.csdn.net/weixin_39874379/article/details/112771445
https://blog.csdn.net/weixin_40533355/article/details/88554586
https://blog.csdn.net/weixin_36677127/article/details/83187816
https://www.codenong.com/cs105358096/