机器学习数据预处理:数据归一化(Min-Max)超通俗全解

数据归一化是把不同量级、不同单位的特征,统一缩放到同一尺度的核心方法,几乎所有机器学习模型训练前都会用到,本科生、研究生都必须熟练掌握。


一、什么是数据归一化?为什么一定要做?

1. 一句话理解

归一化 = 把所有特征按比例“压扁”到 [0,1] 区间,让特征对模型的影响公平。

2. 不做归一化会怎样?

举个例子:

  • 身高:150~200(数值大)
  • 体重:30~100(数值小)

模型会错误认为身高比体重重要得多,因为数值范围差距太大,导致:

  • 模型精度下降
  • 收敛速度变慢
  • 距离类算法(KNN、K-Means、SVM)完全失效

二、最常用方法:Min-Max 归一化

1. 核心公式

x_norm = (x - x_min) / (x_max - x_min)

2. 符号解释

  • x:原始数据
  • x_min:这一列特征的最小值
  • x_max:这一列特征的最大值
  • x_norm:归一化后结果(一定在 0~1 之间)

3. 直观计算例子

原始分数:[40, 60, 80, 90, 100]

  • min = 40
  • max = 100
  • 分母 = 100 - 40 = 60

计算:

  • 40 → (40-40)/60 = 0
  • 60 → (60-40)/60 ≈ 0.33
  • 80 → (80-40)/60 ≈ 0.67
  • 90 → (90-40)/60 ≈ 0.83
  • 100 → (100-40)/60 = 1

归一化结果:[0, 0.33, 0.67, 0.83, 1]


三、数学原理(详细推导,考试/论文必备)

1. 目标

构造线性函数:

f(x) = a·x + b

满足:

  • x = x_min → f(x) = 0
  • x = x_max → f(x) = 1

2. 求解系数

由边界条件可推出:

  • a = 1 / (x_max - x_min)
  • b = -x_min / (x_max - x_min)

3. 最终公式

f(x) = (x - x_min) / (x_max - x_min)

4. 重要性质

  • 线性变换:不改变数据相对大小与分布形状
  • 保留相对距离:不破坏数据规律
  • 范围严格 0~1:适合需要固定输入范围的模型

四、完整可运行代码(含4张可视化图)

直接复制运行,包含:计算、折线图、柱状图、映射曲线、分布对比。

import numpy as np
import matplotlib.pyplot as plt

# 原始数据
original_scores = np.array([40, 60, 80, 90, 100])

# 归一化计算
min_val = np.min(original_scores)
max_val = np.max(original_scores)
normalized_scores = (original_scores - min_val) / (max_val - min_val)

# 放大到0-100方便对比
normalized_scaled = normalized_scores * 100

# 绘图
fig, axs = plt.subplots(2, 2, figsize=(16, 10))
fig.suptitle('Data Normalization (Min-Max) Analysis', fontsize=20)

# 1. 折线图
axs[0,0].plot(original_scores, 'ro-', linewidth=3, markersize=10, label='Original')
axs[0,0].plot(normalized_scaled, 'bs--', linewidth=3, markersize=10, label='Normalized')
axs[0,0].set_title('Line Chart: Original vs Normalized')
axs[0,0].legend()
axs[0,0].grid(True)

# 2. 柱状图
idx = np.arange(len(original_scores))
w = 0.35
axs[0,1].bar(idx, original_scores, w, color='orange', label='Original')
axs[0,1].bar(idx+w, normalized_scaled, w, color='purple', label='Normalized')
axs[0,1].set_title('Bar Chart Comparison')
axs[0,1].legend()
axs[0,1].grid(True)

# 3. 映射曲线
axs[1,0].scatter(original_scores, normalized_scores, s=150, color='lime')
x_line = np.linspace(min_val, max_val, 100)
y_line = (x_line - min_val) / (max_val - min_val)
axs[1,0].plot(x_line, y_line, 'k--', linewidth=2, label='Mapping Curve')
axs[1,0].set_title('Scatter Plot: Mapping Function')
axs[1,0].set_xlabel('Original')
axs[1,0].set_ylabel('Normalized')
axs[1,0].legend()
axs[1,0].grid(True)

# 4. 分布直方图
axs[1,1].hist(original_scores, bins=8, alpha=0.7, color='cyan', label='Original')
axs[1,1].hist(normalized_scaled, bins=8, alpha=0.7, color='magenta', label='Normalized')
axs[1,1].set_title('Histogram Distribution')
axs[1,1].legend()
axs[1,1].grid(True)

plt.tight_layout()
plt.show()

五、可视化结果说明(超清晰)

  1. 折线图:归一化后趋势不变,只是尺度统一
  2. 柱状图:直观对比原始值与归一化值的差异
  3. 映射散点图:完美符合线性公式 y = kx + b
  4. 直方图:数据分布形状不变,仅范围被压缩

六、归一化 vs 标准化(最易混淆点)

方法 公式 输出范围 异常值影响 适用场景
归一化 (x-min)/(max-min) [0,1] 非常大 固定范围、图像、KNN
标准化 (x-μ)/σ 无固定范围 较小 正态分布、梯度下降、SVM

最简单选择口诀

  • 数据有极端异常值 → 用标准化
  • 数据需要 0~1 范围 → 用归一化
  • 不确定 → 优先标准化

七、哪些模型必须做归一化?

✅ 必须做(不做效果很差)

  • KNN、K-Means(基于距离)
  • SVM
  • 神经网络、梯度下降
  • 线性回归、逻辑回归

❌ 不用做(树模型)

  • 决策树、随机森林、XGBoost、LightGBM

八、总结(面试/笔记速背版)

  1. 归一化 = 统一特征尺度,消除量纲影响
  2. Min-Max 公式:(x-min)/(max-min)
  3. 结果一定落在 0~1
  4. 线性变换,保留数据分布
  5. 距离类模型必做,树模型可不做
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐