题目
在机器学习与数据分析中,不同尺度的特征需要无量纲化。编写程序,对一个特征列向量分别执行 Min-Max 归一化(缩放到 $[0, 1]$ 区间)与 Z-Score 标准化(变换为均值为 0、标准差为 1 的正态分布)。
输入格式:无需外部输入。
输出格式:输出原始数据、Min-Max 归一化后数据及其区间、Z-Score 标准化后数据及其均值标准差。
数据范围与约定:特征工程预处理。
思路与算法
1. Min-Max 归一化公式
$x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$。处理后严格落在 $[0, 1]$ 之间。
2. Z-Score 标准化公式
$z = \frac{x - \mu}{\sigma}$。消除量纲与绝对尺度影响。
3. 分母防零防御
若所有数据全等导致 $x_{\max} = x_{\min}$ 或 $\sigma = 0$,除法会除零,必须做容差保护。
完整程序
% Octave / MATLAB 第90题:数据归一化与标准化
feat = [100, 200, 300, 400, 500];
% 1. Min-Max 归一化到 [0, 1]
f_min = min(feat);
f_max = max(feat);
feat_minmax = (feat - f_min) ./ (f_max - f_min);
% 2. Z-Score 标准化
mu = mean(feat);
sigma = std(feat);
feat_zscore = (feat - mu) ./ sigma;
fprintf("原始特征数据: %s\n", mat2str(feat));
fprintf("Min-Max 归一化: %s\n", mat2str(feat_minmax, 2));
fprintf("Z-Score 标准化: %s\n", mat2str(feat_zscore, 2));
fprintf("验证 Z-Score 后均值: %.2e | 标准差: %.2f\n", mean(feat_zscore), std(feat_zscore));运行示例
输出:
原始特征数据: [100 200 300 400 500]
Min-Max 归一化: [0 0.25 0.5 0.75 1]
Z-Score 标准化: [-1.3 -0.63 0 0.63 1.3]
验证 Z-Score 后均值: 0.00e+00 | 标准差: 1.00