归一化和标准化

1. 什么是归一化

归一化:是一种数据处理方法,它涉及将数据按照一定的比例缩放,使其落入特定的区间内。具体来说,归一化可以将数值差异过大的数据组缩小至同一数量级,以便进行后续的计算或分析。在数学和统计学中,归一化通常指将数据映射到0到1的区间内,这样处理后的数据具有更好的统计特性,如概率分布或坐标分布。归一化的过程包括将有量纲的表达式转换为无量纲的表达式,使其成为标量,从而简化计算和处理。在不同的应用场景中,归一化的具体区间可能有所不同,例如在图像处理中,数据可能被映射到的区间。归一化的优点在于它能够统一不同变量的尺度,使得分析更加准确和有效。

公式:
  1. Min-Max 归一化:

    公式: x n e w = x − x m i n x m a x − x m i n x_{new} = \frac{x - x_{min}}{x_{max} - x_{min}} xnew=xmaxxminxxmin

    注释:

    1. x n e w x_{new} xnew:归一化后的结果

    2. x m i n x_{min} xmin:数据中的最小值

    3. x m a x x_{max} xmax:数据中的最大值

2. 什么是标准化:

数据标准化,就是将原来分布范围不同的数据缩放在一个范围之内,一般来说是标准化到均值为0,标准差为1的标准正态分布,均值为0是为了让数据中心化,让各个维度的特征都平衡,标准差为1是为了让数据在各个维度上的长度都呈现一个单位向量(矩阵),也就是把原来大小范围分布不通的数据缩放成统一量纲。

  1. Z-Score 标准化

    公式: x n e w = x − μ σ x_{new} = \frac{x - \mu}{\sigma} xnew=σxμ

    注释:

    1. x n e w x_{new} xnew:归一化后的结果

    2. μ \mu μ:样本数据的均值(mean)

    3. σ \sigma σ:样本数据的标准差(std)

3.为什么需要归一化和标准化

  1. 消除量纲影响:不同的特征往往具有不同的量纲和单位,这会影响到数据分析的结果。归一化和标准化可以消除这些量纲的影响,使得不同特征之间可以在相同的尺度下进行比较和分析。
  2. 提高分类器准确性:在机器学习中,归一化可以使得不同维度的特征在数值上具有可比性,这对于某些算法如支持向量机(SVM)和神经网络等是非常重要的,因为它可以帮助模型更快地收敛,提高分类或预测的准确性。
  3. 实现无关性:归一化和标准化的目的是为了使数据在某些方面实现“无关性”,例如偏置无关、尺度无关、长度无关等。这样可以使模型更加关注于数据的本质特征,而不是被数据的外在因素所干扰。
  4. 改善梯度下降效果:在训练基于梯度下降的模型时,如果所有特征的尺度相同,那么梯度下降的方向会更加稳定,有助于找到最优解。
  5. 避免数值计算问题:在数值计算中,如果特征值的范围相差很大,可能会导致数值不稳定,甚至出现溢出等问题。通过归一化和标准化,可以减少这种风险。
  6. 适应特定算法需求:一些算法对输入数据有特定的要求,例如,主成分分析(PCA)在进行方差最大化时,假设所有特征都是以零为中心且具有单位方差的。
  7. 提高模型泛化能力:通过归一化和标准化,模型在新的数据上的表现可能会更加稳定,因为模型不会过度依赖于特定的尺度或偏移量。
  8. 提高梯度下降算法的效率:归一化后,目标函数会呈现比较“圆”,减少梯度下降算法在优化过程中的弯路,从而加快梯度下降求最优解的速度。

4.归一化和标准化的对比

深度学习归一化(Normalization)和标准化(Standardization)是两种常用的数据预处理技术,用于将输入数据进行变换,以便更好地适应深度学习模型的训练。它们的主要区别如下:

归一化是将数据缩放到 [0,1] 范围内,即通过除以数据的最大值和最小值的差来实现。标准化则是将数据缩放到均值为 0,标准差为 1 的分布中,即通过对数据进行均值和方差的转换来实现。

归一化是适用于输入数据分布较为均匀的情况,而标准化则适用于输入数据分布不均匀、存在较大离群值的情况。

归一化会使得输入数据的大小在相同的范围内,使得各特征对模型的贡献更加均匀,有利于加速收敛。标准化可以减小特征之间的量纲差异,使得各特征权重更容易进行比较。

归一化可以通过 min-max 归一化、z-score 归一化(但其实z-score归一化并不会放缩到[0,1])等不同方式实现,而标准化一般是使用 z-score 标准化进行。

5. 使用sklearn完成归一化、标准化

  1. Min-Max 归一化:

    from sklearn.preprocessing import MinMaxScaler
    import numpy as np
    array = np.array([[14.56, 25.64, 25.38],
                      [14.78, 42.68, 22.22],
                      [3.22, 64.28, 98.74]])
    # 实例化
    scaler = MinMaxScaler()
    # 生成 min(x)和max(x)
    scaler = scaler.fit(array)
    result = scaler.transform(array)
    print(result)
    

    归一化到[0,1]以外的范围中(10, 30):

    from sklearn.preprocessing import MinMaxScaler
    import numpy as np
    
    array = np.array([[14.56, 25.64, 25.38],
                      [14.78, 42.68, 22.22],
                      [3.22, 64.28, 98.74]])
    # 实例化
    scaler = MinMaxScaler(feature_range=(10, 30))
    # 生成 min(x)和max(x)
    scaler = scaler.fit(array)
    result = scaler.transform(array)  # 通过接口导出结果
    print(result)
    
  2. Z-Score 标准化

    from sklearn.preprocessing import scale, StandardScaler
    import numpy as np
    
    array = np.array([[14.56, 25.64, 25.38],
                      [14.78, 42.68, 22.22],
                      [3.22, 64.28, 98.74]])
    # 实例化
    scaler = StandardScaler()
    # 生成 min(x)和max(x)
    scaler = scaler.fit(array)
    StandardScaler(copy=True, with_mean=True, with_std=True)
    result = scaler.transform(array)
    print(result)
    
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐