数据归一化的原理、类型及Python实现详解

拾光
拾光
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析数据归一化的核心概念及其必要性,包括加速梯度下降与提升模型精度。重点介绍线性归一化、标准差标准化及非线性归一化(如Log变换)三种类型,并提供基于Python NumPy的具体实现代码,帮助开发者掌握不同场景下的数据预处理技巧。

数据归一化:

数据标准化是指将原始数据按比例进行缩放,使其落入一个特定的较小区间内。这一过程旨在消除数据的单位限制,将其转化为无量纲的纯数值,从而使得不同单位或量级的指标之间能够进行有效的比较和加权处理。

为什么要做归一化:

1)加快梯度下降求最优解的速度

若两个特征的取值区间差异巨大,其形成的等高线会非常尖锐。这可能导致优化算法走出“之字型”路线(即垂直于等高线方向移动),从而导致需要迭代很多次才能收敛。

2)有可能提高精度

部分分类器需要计算样本之间的距离。如果某个特征的值域范围非常大,距离计算将主要受该特征支配,从而与实际情况相悖(例如,实际情况可能是值域范围较小的特征更为重要)。

归一化类型

1)线性归一化

这种归一化方法比较适用于数值分布较为集中的情况。其缺陷在于,如果最大值(max)和最小值(min)不稳定,很容易导致归一化结果不稳定,进而使后续模型效果波动。在实际使用中,可以用经验常量来代替max和min以增强稳定性。

2)标准差标准化

经过该处理后的数据符合标准正态分布,即均值为0,标准差为1。

3)非线性归一化

该方法经常用在数据分化较大的场景,其中有些数值很大,有些很小。通过特定的数学函数将原始值进行映射。该方法包括log、指数、反正切等。需要根据数据分布的具体情况,决定非线性函数的曲线形态。

log函数:x = lg(x)/lg(max)

反正切函数:x = atan(x)*2/pi

Python实现

线性归一化

定义数组:x = numpy.array(x)

获取二维数组列方向的最大值:x.max(axis = 0)

获取二维数组列方向的最小值:x.min(axis = 0)

对二维数组进行线性归一化:

def max_min_normalization(data_value, data_col_max_values, data_col_min_values):
""" Data normalization using max value and min value

Args:
 data_value: The data to be normalized
 data_col_max_values: The maximum value of data's columns
 data_col_min_values: The minimum value of data's columns
"""
data_shape = data_value.shape
data_rows = data_shape[0]
data_cols = data_shape[1]

for i in xrange(0, data_rows, 1):
 for j in xrange(0, data_cols, 1):
  data_value[i][j] = \
   (data_value[i][j] - data_col_min_values[j]) / \
   (data_col_max_values[j] - data_col_min_values[j])

标准差归一化

定义数组:x = numpy.array(x)

获取二维数组列方向的均值:x.mean(axis = 0)

获取二维数组列方向的标准差:x.std(axis = 0)

对二维数组进行标准差归一化:

def standard_deviation_normalization(data_value, data_col_means,
         data_col_standard_deviation):
""" Data normalization using standard deviation

Args:
 data_value: The data to be normalized
 data_col_means: The means of data's columns
 data_col_standard_deviation: The variance of data's columns
"""
data_shape = data_value.shape
data_rows = data_shape[0]
data_cols = data_shape[1]

for i in xrange(0, data_rows, 1):
 for j in xrange(0, data_cols, 1):
  data_value[i][j] = \
   (data_value[i][j] - data_col_means[j]) / \
   data_col_standard_deviation[j]

非线性归一化(以lg为例)

定义数组:x = numpy.array(x)

获取二维数组列方向的最大值:x.max(axis=0)

获取二维数组每个元素的lg值:numpy.log10(x)

获取二维数组列方向的最大值的lg值:numpy.log10(x.max(axis=0))

对二维数组使用lg进行非线性归一化:

def nonlinearity_normalization_lg(data_value_after_lg,
        data_col_max_values_after_lg):
""" Data normalization using lg

Args:
 data_value_after_lg: The data to be normalized
 data_col_max_values_after_lg: The maximum value of data's columns
"""

data_shape = data_value_after_lg.shape
data_rows = data_shape[0]
data_cols = data_shape[1]

for i in xrange(0, data_rows, 1):
 for j in xrange(0, data_cols, 1):
  data_value_after_lg[i][j] = \
   data_value_after_lg[i][j] / data_col_max_values_after_lg[j]

以上这篇基于数据归一化以及Python实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表