归一化
一、直观理解:把长短不一的尺子都裁到同一段
归一化(这里主要指最小—最大归一化,Min-Max Normalization)把每个变量的取值线性压缩(或拉伸)到指定区间,最常见是 ,有时是 。
可以把它想成:有的指标用百分制(0–100),有的用千分制(0–1000),有的是温度从 到 。归一化先找到每个指标在训练数据里的“最短端”和“最长端”,再按比例把所有读数标到同一把 0 到 1 的短尺上。
对第 个变量:
变换后:
- 训练集上该变量的最小值变成 0,最大值变成 1;
- 中间值按比例落在 内;
- 变量的排序关系保持不变(严格单调的仿射变换)。
与标准化不同,归一化明确制造有界输入,因此特别受神经网络、某些图像/信号特征、需要概率型输入或固定动态范围的算法欢迎。但它的“尺子两端”完全由极值决定:只要混进一个异常大的点, 被拉高,其他正常点全被挤到靠近 0 的一小段里。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 算法要求特征有界(部分神经网络激活、某些核方法与元启发式算法的编码);需要把异量纲指标综合成加权评分且希望落在 ;像素、比例、评分卡等本身具有天然上下界;希望可视化时各轴可比。 |
| 核心优点 | 结果落在固定区间,直观好解释;计算极简单;保持原始分布的形状(只做平移缩放,不改变偏度的“相对形态”)。 |
| 局限与缺点 | 对最小值、最大值极其敏感;测试集可能出现 <0 或 >1 的越界值;不改变异常值的相对地位,只是把它们钉在 0 或 1;常数列()无法处理。 |
“保持形状”是相对标准化而言:两者都是线性变换,都不会把偏态变成对称。若目标是减弱偏态,应使用对数或 Box-Cox,而不是 min-max。
使用归一化前通常需要完成以下检查:
- 变量是否近似有界、是否存在明显错误极值;
- 与 是否来自训练集,而非全数据;
- 目标区间选 还是 (含大量负数或要与 输入匹配时常用后者);
- 约定测试集越界时的策略:截断到端点,还是允许出界并记录;
- 若用于多指标加权评价,确认“越大越好”还是“越小越好”(后者要做逆向指标变换)。
三、核心原理:按训练极值做线性映射
1. 最小—最大归一化到
当 时分母为 0,该特征无判别信息,应剔除。
2. 映射到一般区间
常用 或 。
3. 逆向指标(越小越好)
综合评价里,若污染指数、成本等越小越好,可先做
再归一化,或直接
这样 1 始终表示“在该指标上最优”。
4. 测试集变换与越界
若 x^{\mathrm{test}}>M^{\mathrm{train}},则 x^{*}>1;若 x^{\mathrm{test}}<m^{\mathrm{train}},则 x^{*}<0。这并不自动算错,但要在建模前规定:
- 硬截断:
min(max(x*,0),1),适合需要严格有界输入的模型; - 允许出界:保留真实相对位置,适合分析“是否出现训练期未见的极端情形”。
5. 与标准化、小数定标等的关系
| 方法 | 公式要点 | 输出 |
|---|---|---|
| Min-Max 归一化 | 减最小值除极差 | 常为 |
| Z-score 标准化 | 减均值除标准差 | 无固定边界 |
| 小数定标 | 除以 | 压到 量级 |
| 均值归一化 | 中心在 0 附近 |
数模论文中若写“归一化”,默认应给出具体公式,避免与标准化混淆。
四、关键决策 / 如何选参数
1. 目标区间
- :最常见,便于解释为“相对位置百分比”;
- :数据本有正负对称含义,或激活函数对对称输入更友好;
- 自定义 :与赛题评分公式或物理约束对齐时使用。
2. 极值是否稳健
若怀疑 被个别错误点污染,可考虑:
- 先用箱线图 / 3σ 清理明显错误;
- 或用分位数窗口代替极值,例如 1% 与 99% 分位数做“截尾 min-max”(需在论文中改称并说明)。
3. 是否按组别分别归一化
不同年份、不同地区的“满分”若不可比,全样本统一 min-max 可能抹平组别结构。应先问:比较的是组内相对水平,还是跨组绝对水平?
4. 交叉验证
与标准化相同:每一折在训练折上重估 ,再变换验证折。
5. 与缺失、异常的顺序
先处理缺失与明显错误值,再估计 min/max。若先归一化再删异常,端点可能已由脏数据决定,清洗也救不回来。
五、MATLAB 示例
% 三列异量纲指标:温度(℃)、浓度(mg/L)、评分(0-100)
X_train = [
10, 2.0, 60;
25, 5.5, 80;
18, 3.2, 70;
30, 8.0, 90;
12, 2.5, 65
];
X_test = [
28, 9.0, 85; % 浓度超过训练集最大,归一化后将 > 1
15, 4.0, 75
];
featureNames = ["温度", "浓度", "评分"];
% 训练集极值
xMin = min(X_train, [], 1);
xMax = max(X_train, [], 1);
range = xMax - xMin;
range(range == 0) = 1; % 避免除零
% 映射到 [0,1]
X01_train = (X_train - xMin) ./ range;
X01_test = (X_test - xMin) ./ range;
disp("训练集 [0,1] 归一化:");
disp(array2table(X01_train, "VariableNames", featureNames));
disp("测试集 [0,1] 归一化(可能越界):");
disp(array2table(X01_test, "VariableNames", featureNames));
% 越界截断策略
X01_test_clipped = min(max(X01_test, 0), 1);
% 映射到 [-1,1]
X_ab_train = -1 + 2 * X01_train;
% 逆向指标示例:假设“浓度”越小越好,单独反向归一化
conc_star = (xMax(2) - X_train(:, 2)) ./ range(2);
disp("浓度(越小越好)归一化到 [0,1],1 表示最优:");
disp(conc_star);
% 还原
X_test_recovered = X01_test .* range + xMin;
disp("还原后的测试集:");
disp(X_test_recovered);
% 可视化某一列变换前后
figure;
subplot(1, 2, 1);
histogram(X_train(:, 2));
title("浓度(原始)");
subplot(1, 2, 2);
histogram(X01_train(:, 2));
title("浓度([0,1] 归一化)");
也可以使用 rescale(R2017b+):
% 将训练集第 2 列缩放到 [0,1]
col2 = rescale(X_train(:, 2), 0, 1);
% 对测试集使用训练集的输入范围
col2_test = rescale(X_test(:, 2), 0, 1, ...
"InputMin", xMin(2), "InputMax", xMax(2));
六、如何解释结果
归一化后的 表示:
该样本在该变量上,相对于训练集观测到的最小、最大水平,所处的相对位置。
例如 表示:从训练最小值走到训练最大值的路径上,该点大约位于 75% 处——不是概率,也不是分位数(分位数基于排序秩次,min-max 基于数值线性比例;分布不均匀时二者不同)。
报告中建议写明:
- 归一化公式与目标区间 ;
- 每个变量的 及估计所用样本;
- 正向 / 逆向指标的处理方式;
- 测试集越界比例与处置规则;
- 变换前后的描述统计或直方图;
- 若用于综合评价,权重与聚合公式如何与归一化结果衔接。
若多个指标归一化后加权求和得到“综合得分”,需要强调:得分的绝对数值依赖于训练期的 min/max,换一批样本端点变了,同一原始向量的得分也会变。跨期比较时要固定端点或改用标准化等方法。
七、常见误区
1. 用含测试集甚至未来数据的全局 min/max
这会把评价或预测场景中本不可见的信息注入特征,造成虚高表现。
2. 不处理异常极值就直接 min-max
一个错误的“最大产量”就能把其余年份的归一化值全部压到近 0,后续 PCA 或评分会被扭曲。
3. 把归一化值当成概率或分位
只说明靠近训练最大值,不代表“优于 90% 的样本”。
4. 对已经是比例、概率的变量再机械归一化
若变量已在 且端点有明确含义,再做一次 min-max 可能破坏可解释性;除非不同来源的“比例”口径不一致。
5. 与标准化选错场景
需要抑制数量级、服务 PCA / 正则回归时,优先标准化;需要严格有界输入或做最小—最大型评分时,再用归一化。二者不必叠床架屋,除非有明确理由。
八、小结
归一化(最小—最大法)用训练集的两端极值做线性尺子,把变量压到统一区间,适合有界输入和多指标评分。
它的核心思想可以概括为:
先固定“最差”与“最好”两端,再按比例读取每个样本在两端之间的位置。
代价是对异常值和训练—测试分布漂移非常敏感。写论文时应给出公式、端点来源、越界策略,并与标准化明确区分。归一化改变的是读数刻度,不是分布形态,也不能替代异常值治理。