机器学习数据预处理:数据归一化(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张可视化图)
直接复制运行,包含:计算、折线图、柱状图、映射曲线、分布对比。
importnumpyasnpimportmatplotlib.pyplotasplt# 原始数据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.35axs[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
- 线性变换,保留数据分布
- 距离类模型必做,树模型可不做
