Min-Max(算法)归一化实例解析(内容由 AI 生成)
Min-Max归一化实例解析
Min-Max 归一化的简单理解是:
当前值 - 该维度的最小值) / 该维度的数值范围(最大值 - 最小值)
再简单理解,就是比例化,当前维度范围的比例化
Min-Max 归一化是数据预处理领域的标准算法,其核心价值是通过 “固定步骤 + 数学公式”
居然是一个算法。 “固定步骤 + 数学公式”
一、Min-Max归一化核心概念
Min-Max归一化(也称为离差标准化)是数据预处理中常用的线性归一化方法,其核心作用是将原始数据映射到指定的固定区间(最常用区间为[0,1],也可根据需求调整为[1,5]、[-1,1]等),消除不同特征间的量纲和尺度差异。
其核心公式为(以目标区间[0,1]为例):
Xnorm=X−XminXmax−XminX_{norm} = \frac{X - X_{min}}{X_{max} - X_{min}}Xnorm=Xmax−XminX−Xmin
其中各参数含义:
- X:原始数据样本的值
- X:该特征维度下所有原始数据的最小值
- X:该特征维度下所有原始数据的最大值
- X:归一化后的数据值
若需映射到其他区间[a,b],公式可调整为:
Xnorm=a+(X−Xmin)×(b−a)Xmax−XminX_{norm} = a + \frac{(X - X_{min}) \times (b - a)}{X_{max} - X_{min}}Xnorm=a+Xmax−Xmin(X−Xmin)×(b−a)
二、实际案例演算(映射到[0,1]区间)
案例背景:学生成绩标准化
某班级5名学生的数学成绩(满分150分)和语文成绩(满分120分)原始数据如下表,由于两科满分不同,尺度存在差异,需通过Min-Max归一化消除差异,便于后续综合评价。
| 学生编号 | 数学成绩(原始) | 语文成绩(原始) |
|---|---|---|
| 1 | 120 | 96 |
| 2 | 90 | 60 |
| 3 | 150 | 120 |
| 4 | 60 | 48 |
| 5 | 105 | 84 |
步骤1:计算各特征维度的最值
分别针对“数学成绩”和“语文成绩”两个维度,计算各自的最小值(X)和最大值(X):
- 数学成绩维度:原始数据为[120,90,150,60,105]
X = 60(学生4的成绩) - X = 150(学生3的成绩)
- X-X = 150-60 = 90
语文成绩维度:原始数据为[96,60,120,48,84]
X = 48(学生4的成绩)
X = 120(学生3的成绩)
X-X = 120-48 = 72
步骤2:逐样本逐维度计算归一化值
以学生1为例,演示计算过程:
- 数学成绩归一化:X=120,代入公式得 (120-60)/90 = 60/90 ≈ 0.67
- 语文成绩归一化:X=96,代入公式得 (96-48)/72 = 48/72 ≈ 0.67
按此方法计算所有学生的归一化成绩,结果如下表:
| 学生编号 | 数学成绩(归一化) | 语文成绩(归一化) | 综合成绩(两科均值) |
|---|---|---|---|
| 1 | ≈0.67 | ≈0.67 | 0.67 |
| 2 | (90-60)/90≈0.33 | (60-48)/72≈0.17 | 0.25 |
| 3 | (150-60)/90=1.00 | (120-48)/72=1.00 | 1.00 |
| 4 | (60-60)/90=0.00 | (48-48)/72=0.00 | 0.00 |
| 5 | (105-60)/90≈0.50 | (84-48)/72≈0.50 | 0.50 |
步骤3:结果分析
归一化前,数学成绩的绝对分值普遍高于语文成绩(因满分更高),直接计算均值会偏向数学成绩;归一化后,两科成绩均处于[0,1]区间,尺度统一,综合成绩能更公平地反映学生的整体水平。
三、代码实现案例(Python+NumPy)
针对上述学生成绩数据,通过代码自动化实现Min-Max归一化,可快速处理大规模数据:
import numpy as np # 1. 准备原始数据(行:学生,列:数学、语文) raw_data = np.array([[120,96],[90,60],[150,120],[60,48],[105,84]])# 2. 定义Min-Max归一化函数(默认映射到[0,1])defmin_max_normalization(data, target_min=0, target_max=1):# 计算每列(每个特征)的最小值和最大值 data_min = data.min(axis=0)# 按列取最小,结果:[60, 48] data_max = data.max(axis=0)# 按列取最大,结果:[150, 120]# 避免分母为0(若某特征所有值相同) denominator = data_max - data_min denominator[denominator ==0]=1e-8# 替换为极小值# 应用归一化公式 normalized_data = target_min +(data - data_min)*(target_max - target_min)/ denominator return normalized_data, data_min, data_max # 3. 执行归一化 normalized_data, data_min, data_max = min_max_normalization(raw_data)# 4. 输出结果print("原始数据:")print(raw_data)print("\n归一化后数据([0,1]区间):")print(np.round(normalized_data,2))# 保留2位小数print("\n各特征最小值:", data_min)print("各特征最大值:", data_max)代码运行结果:
原始数据: [[120 96] [ 90 60] [150 120] [ 60 48] [105 84]] 归一化后数据([0,1]区间): [[0.67 0.67] [0.33 0.17] [1. 1. ] [0. 0. ] [0.5 0.5 ]] 各特征最小值: [60 48] 各特征最大值: [150 120] 四、关键注意事项
- 对异常值敏感:若数据中存在极端异常值(如某学生数学考0分),会导致X或X偏差极大,归一化结果失真。建议先处理异常值(如用中位数替换)再归一化。
- 训练集与测试集一致性:建模时,需用训练集的X和X对测试集进行归一化,而非单独计算测试集的最值,避免数据泄露。
- 分母为0处理:若某特征所有样本值相同(如所有学生语文都考80分),会导致分母为0,需在代码中添加容错处理(如替换为极小值)。
(注:文档部分内容可能由 AI 生成)