您的位置:

归一化与反归一化

在数据挖掘或机器学习中,输入的数据来自于不同的数据源,其取值范围、量纲不同,这时候我们需要对这些数据进行归一化或称作标准化。标准化后,将有利于提高机器学习初始化速度、提高算法的收敛速度和精度,也可以消除特征的量纲不同对模型的影响。

一、为什么需要归一化

归一化指的是将数据按比例缩放,使之落入一个小的特定区间。主要有以下几个原因:

1. 模型初始化速度

一旦确定好神经网络的架构后,其权重参数需要初始化,如果权重参数初始化太小,则整个神经网络的输出太小,使得网络学习过程非常缓慢,需要更长时间的学习才能收敛。如果权重参数初始化太大,则整个神经网络的输出太大,使得网络也无法学到更多的知识。那么我们可以通过归一化输入数据,用一组更合适的初始权重,默认初始化而不是0初始化,从而加快初始化速度。

2. 提高算法的收敛速度和精度

在神经网络中,一般使用梯度下降算法进行反向传播学习,而梯度下降算法需要计算梯度值来取得最佳av_min(最小值),如果收敛慢,不仅会耗费更多的计算时间,而且很容易陷入局部最小值中。归一化可以缩小特征间的差异,使得收敛速度更快,且不易陷入局部最小值。

3. 消除特征的量纲不同对模型的影响

在数据挖掘或机器学习中,输入的数据往往来自不同的数据源,其取值范围和量纲也不一致。例如身高和体重不在一个量纲。这会对模型产生影响,体现在模型的预测效果不佳,不能充分表达数据的意义。归一化则可以减少特征间的影响,增加模型的鲁棒性。

二、常用的归一化方法

1. Min-max归一化

Min-max归一化是对原始数据进行线性变换,将数据映射到[0, 1]区间内,其函数可表示为:

x = (x - min) / (max - min) 

其中,x为每个数据的归一化后的结果,min和max分别为特征属性中的最小值和最大值。

其中,一份简单的python代码实现样例:

def min_max_scale(data):
    """Min-max scaling"""
    return (data - np.min(data)) / (np.max(data) - np.min(data))

2. Z-score标准化

Z-score标准化是将原始数据转化为均值为0,标准差为1的分布。其函数可表示为:

x = (x - mean) / std

其中,x为每个数据的标准化结果,mean为特征属性中的均值,std为标准差。

其中,一份简单的python代码实现样例:

def z_score_scale(data):
    """Z-score scaling"""
    return (data - np.mean(data)) / np.std(data)

三、反归一化的实现

在训练神经网络时,我们需要将归一化后的结果映射到原来的取值范围内,这个过程称为反归一化。反归一化可以用于提取真实结果,判断神经网络的预测效果。反归一化的函数与归一化是相反的。

1. 反Min-max归一化

如果已知待反归一化值$x'$、原本归一化的最大值$max$和最小值$min$,则可以通过下式反推出$x$值:

x = x'* (max - min) + min

其中,一份简单的python代码实现样例:

def inverse_min_max_scale(data, inverse_data):
    """Inverse Min-max scaling"""
    min, max = np.min(data), np.max(data)
    inv_data = inverse_data * (max - min) + min
    return inv_data

2. 反Z-score标准化

如果已知待反归一化值$x'$、原本归一化的均值$mean$和标准差$std$,则可以通过下式反推出$x$值:

x = x' * std + mean

其中,一份简单的python代码实现样例:

def inverse_z_score_scale(data, inverse_data):
    """Inverse Z-score scaling"""
    mean, std = np.mean(data), np.std(data)
    inv_data = inverse_data * std + mean
    return inv_data

总结

归一化与反归一化在数据挖掘和机器学习中起着重要的作用。在归一化方面,最常用的方法是Min-max归一化和Z-score标准化;在反归一化方面,只需要根据原本的归一化计算方法,并将映射到[0, 1]或者均值为0,标准差为1的分布的结果再次还原回去即可。