机器学习数据预处理:数据归一化(Min-Max)超通俗全解
·
机器学习数据预处理:数据归一化(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()
五、可视化结果说明(超清晰)
- 折线图:归一化后趋势不变,只是尺度统一
- 柱状图:直观对比原始值与归一化值的差异
- 映射散点图:完美符合线性公式 y = kx + b
- 直方图:数据分布形状不变,仅范围被压缩
六、归一化 vs 标准化(最易混淆点)
| 方法 | 公式 | 输出范围 | 异常值影响 | 适用场景 |
|---|---|---|---|---|
| 归一化 | (x-min)/(max-min) | [0,1] | 非常大 | 固定范围、图像、KNN |
| 标准化 | (x-μ)/σ | 无固定范围 | 较小 | 正态分布、梯度下降、SVM |
最简单选择口诀
- 数据有极端异常值 → 用标准化
- 数据需要 0~1 范围 → 用归一化
- 不确定 → 优先标准化
七、哪些模型必须做归一化?
✅ 必须做(不做效果很差)
- KNN、K-Means(基于距离)
- SVM
- 神经网络、梯度下降
- 线性回归、逻辑回归
❌ 不用做(树模型)
- 决策树、随机森林、XGBoost、LightGBM
八、总结(面试/笔记速背版)
- 归一化 = 统一特征尺度,消除量纲影响
- Min-Max 公式:(x-min)/(max-min)
- 结果一定落在 0~1
- 线性变换,保留数据分布
- 距离类模型必做,树模型可不做
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)