Skip to content

数据归一化

1. 什么是数据归一化

数据归一化(Normalization 或 Scaling)是一种数据预处理技术,旨在调整数据的尺度,使得不同特征之间具有可比性,或者满足特定算法的输入要求。这一过程对于数据分析、机器学习模型的训练尤为重要,因为它可以带来以下好处:

  1. 消除量纲影响:通过归一化,可以消除不同特征因量纲不同(如米、秒、千克)导致的不可比性,使得特征之间的比较有意义。

  2. 提高模型收敛速度:在梯度下降等迭代优化算法中,归一化可以减少参数更新时的摆动幅度,加速模型收敛。

  3. 减少奇异样本的影响:异常值(outliers)可能导致模型学习偏向,归一化可以减小它们的影响力。

  4. 权重初始化和平衡特征:在神经网络等模型中,合理的归一化有助于权重的初始化,确保各层激活值的范围适宜,避免梯度消失或爆炸问题。

2. 数据归一化的方法

常见的数据归一化方法包括:

  • 最小-最大归一化(Min-Max Scaling): 又称0-1标准化,公式为 (xscaled=xxminxmaxxmin)(x_{scaled} = \frac{x - x_{min}}{x_{max} - x_{min}})。它将数据线性映射到[0, 1]区间内。这种方法简单直观,但易受极端值(最大值和最小值)影响。

    最小-最大归一化保留了原始数据值之间的关系。如果归一化的未来输入案例超出A的原始数据范围,它将遇到“越界”错误。

  • Z-Score 标准化(Standardization): 也称为标准化,通过减去均值并除以标准差进行,公式为 (xscaled=xμσ)(x_{scaled} = \frac{x - \mu}{\sigma}),其中 (μ)(\mu) 是平均值,(σ)(\sigma) 是标准差。处理后数据具有平均值0,标准差1,符合标准正态分布,适合于需要保持数据的原始分布形态的场景。

  • 小数定标标准化(Decimal Scaling): 通过移动小数点的方式进行,根据特征的最大绝对值确定小数点移动位数,简化而快速,但不如前两者常用。

3. 举例说明

最小-最大归一化(Min-Max Scaling)示例

假设我们有一组学生考试成绩数据:[60, 75, 88, 92, 100]

  1. 计算最大值 (xmax)(x_{max}): 100
  2. 计算最小值 (xmin)(x_{min}): 60
  3. 进行归一化:
    • 第一个分数 (60)(60) 的归一化值为 (606010060=0)(\frac{60 - 60}{100 - 60} = 0)
    • 第二个分数 (75)(75) 的归一化值为 (756010060=0.375)(\frac{75 - 60}{100 - 60} = 0.375)
    • 第三个分数 (88)(88) 的归一化值为 (886010060=0.75)(\frac{88 - 60}{100 - 60} = 0.75)
    • 第四个分数 (92)(92) 的归一化值为 (926010060=0.8)(\frac{92 - 60}{100 - 60} = 0.8)
    • 第五个分数 (100)(100) 的归一化值为 (1006010060=1)(\frac{100 - 60}{100 - 60} = 1)

归一化后,成绩数据变为:[0,0.375,0.75,0.8,1][0, 0.375, 0.75, 0.8, 1],位于[0, 1]区间内。

Z-Score标准化示例

继续使用上面的成绩数据:[60, 75, 88, 92, 100]

  1. 计算平均值 (μ)(\mu): (60+75+88+92+1005=80.4)(\frac{60 + 75 + 88 + 92 + 100}{5} = 80.4)
  2. 计算标准差 (σ)(\sigma): 具体计算略,假设得到 (σ=19.8)(\sigma = 19.8)(实际计算需精确)
  3. 进行Z-Score标准化:
    • 第一个分数 (60)(60) 的标准化值为 (6080.419.8)(\frac{60 - 80.4}{19.8}) ≈ -1.08
    • 类似地,计算其余分数的标准化值。

小数定标标准化示例

对于同一组成绩数据:[60, 75, 88, 92, 100]

  1. 确定最大绝对值:100
  2. 确定小数点移动位数:因为最大值为100,移动2位小数点,使其成为1.00。
  3. 进行小数定标标准化:
    • 所有分数都除以100,得到:[0.60,0.75,0.88,0.92,1.00][0.60, 0.75, 0.88, 0.92, 1.00]

小数定标标准化不依赖于数据的分布,而是简单地通过移动小数点进行尺度调整,适用于快速预处理,但可能不会改变数据的分布形态。

4. 代码示例

  • 最小-最大归一化
Python

from sklearn.preprocessing import MinMaxScaler

data = [[60], [75], [88], [92], [100]]

# 初始化缩放器
scaler = MinMaxScaler()

# 训练并转换数据
normalized_data = scaler.fit_transform(data)
print(normalized_data)
  • Z-Score标准化
Python
from sklearn.preprocessing import StandardScaler

data = [[60], [75], [88], [92], [100]]

# 初始化标准化器
scaler = StandardScaler()

# 训练并转换数据
standardized_data = scaler.fit_transform(data)
print(standardized_data)
  • 小数定标标准化
Python
data = [60, 75, 88, 92, 100]
max_abs_value = max(abs(i) for i in data)

# 小数定标标准化
decimal_scaled_data = [x / (10 ** int(np.log10(max_abs_value))) for x in data]
print(decimal_scaled_data)

Released under the MIT License.