精通MATLAB中的数据标准化与归一化

文章目录

  • 前言
  • 一、 为什么需要标准化与归一化?
  • 二、 核心方法及其MATLAB实现
      1. 标准化
      1. 最小-最大归一化
      1. 稳健标准化
      1. L2范数归一化(向量归一化)
  • 三、 关键实践:训练集与测试集的处理流程
  • 四、 方法选择指南
  • 总结

前言

在多元数据分析与机器学习的实践中,我们常常会遇到一个关键挑战:数据集中的不同特征往往具有各异的量纲和数值范围。例如,在一个包含年龄、年收入和信用评分的客户数据集中,年龄的范围可能是20-80,年收入可能是30,000-200,000,而信用评分可能是300-850。这种尺度上的巨大差异会严重影响许多机器学习算法的性能------基于距离计算的算法(如K近邻、聚类分析)会被数值范围大的特征所主导;基于梯度下降的优化算法(如神经网络、逻辑回归)则会因为参数空间的不均衡而收敛缓慢。

为了解决这一问题,我们需要通过数据标准化归一化等技术,将不同特征的数值转换到统一的尺度上,同时保留原始数据所包含的关键信息。这不仅是一个技术步骤,更是确保模型公平对待每个特征、释放算法真正潜力的必要前提。MATLAB提供了一套完整而高效的工具集,使得这些预处理操作变得简单而直观。本文将深入探讨MATLAB中主要的数据缩放方法,阐明其原理、实现与应用场景。


一、 为什么需要标准化与归一化?

核心目标:消除特征间的量纲影响,创造公平的比较基础。

  1. 保证距离度量的公正性:在KNN、SVM、K-Means等算法中,尺度大的特征会主导距离计算,导致模型忽略尺度小但可能重要的特征。
  2. 加速梯度下降收敛:未经缩放的特征会导致损失函数的等高线呈狭长椭圆形,梯度下降路径会剧烈震荡,收敛缓慢。缩放后的等高线更接近圆形,路径更直接。
  3. 提升模型性能与稳定性:特别是对于依赖梯度计算的模型(如神经网络)和使用正则化的模型(如L1、L2),特征缩放能显著提高模型的精度和泛化能力。
  4. 增强算法数值稳定性:防止计算过程中因数值过大或过小而引发的浮点数溢出或下溢问题。

二、 核心方法及其MATLAB实现

1. 标准化

核心思想:将数据转换为均值为0、标准差为1的正态分布。

  • 公式

    z = \\frac{x - \\mu}{\\sigma}

    其中,(\mu) 是特征值的均值,(\sigma) 是特征值的标准差。

  • MATLAB实现

    matlab 复制代码
    % 使用 zscore 函数(最常用)
    data = [1000, 2000, 3000; 30, 40, 50; 0.1, 0.2, 0.3]'; % 一个3x3的示例数据
    data_standardized = zscore(data);
    
    % 验证结果
    mean_val = mean(data_standardized);   % 应接近 [0, 0, 0]
    std_val = std(data_standardized);     % 应接近 [1, 1, 1]
  • 适用场景

    • 数据分布近似正态分布,或分布未知。
    • 算法假设数据均值为零(如PCA、LDA)。
    • 数据中存在异常值(标准化对异常值有一定鲁棒性,因为标准差受异常值影响)。

2. 最小-最大归一化

核心思想:将数据线性地映射到一个指定的范围(通常是[0, 1])。

  • 公式

    x_{\\text{norm}} = \\frac{x - x_{\\min}}{x_{\\max} - x_{\\min}}

  • MATLAB实现

    matlab 复制代码
    % 使用 rescale 函数(推荐)
    data_normalized = rescale(data, 0, 1); % 缩放到 [0, 1]
    
    % 手动实现
    data_min = min(data);
    data_max = max(data);
    data_normalized_manual = (data - data_min) ./ (data_max - data_min);
  • 适用场景

    • 数据边界已知,且需要固定输出范围(如图像处理中的像素强度)。
    • 数据分布不服从正态分布。
    • 对不存在异常值的数据集进行处理(因为最小值和最大值对异常值极其敏感)。

3. 稳健标准化

核心思想:使用中位数和四分位数范围(IQR)进行缩放,对异常值不敏感。

  • 公式

    x_{\\text{robust}} = \\frac{x - \\text{Median}(x)}{\\text{IQR}(x)}

  • MATLAB实现

    matlab 复制代码
    % 手动计算
    data_median = median(data);
    data_iqr = iqr(data); % 计算四分位距
    data_robust = (data - data_median) ./ data_iqr;
  • 适用场景

    • 数据中存在显著异常值。
    • 需要更稳健的缩放方法,避免异常值对转换结果的扭曲。

4. L2范数归一化(向量归一化)

核心思想:将每个样本(行)转换为单位范数的向量。

  • 公式

    x_{\\text{unit}} = \\frac{x}{\|x\|_2}

  • MATLAB实现

    matlab 复制代码
    % 使用 vecnorm 函数
    norms = vecnorm(data, 2, 2); % 计算每行的L2范数
    data_l2_normalized = data ./ norms;
    
    % 或者使用 normalize 函数
    data_l2_normalized = normalize(data, 2, 'norm'); % 按行进行L2归一化
  • 适用场景

    • 文本分类、词袋模型。
    • 任何使用余弦相似度作为度量标准的场景。

三、 关键实践:训练集与测试集的处理流程

在机器学习中,一个至关重要的原则是:任何从数据中学习得到的参数(包括标准化/归一化的参数),都必须仅从训练集中计算,然后应用于测试集。 绝不允许使用测试集的信息来拟合预处理器。

正确的MATLAB工作流:

matlab 复制代码
% 1. 分割数据
cv = cvpartition(size(data,1), 'HoldOut', 0.3);
idxTrain = training(cv);
idxTest = test(cv);

dataTrain = data(idxTrain, :);
dataTest = data(idxTest, :);

% 2. 从训练集中计算转换参数
mu_train = mean(dataTrain);
sigma_train = std(dataTrain);

% 3. 使用训练集参数转换训练集和测试集
dataTrain_std = (dataTrain - mu_train) ./ sigma_train;
dataTest_std = (dataTest - mu_train) ./ sigma_train; % 注意:使用训练集的mu和sigma!

% 如果使用Normalize函数,可以保存并复用预处理对象
[dataTrain_std, PS] = mapstd(dataTrain'); % 注意mapstd默认按行处理,所以需要转置
dataTest_std = mapstd('apply', dataTest', PS);
dataTest_std = dataTest_std'; % 转置回来

四、 方法选择指南

方法 优点 缺点 典型应用
标准化 保留异常值信息,适用于大多数场景 对极端异常值仍敏感 线性模型、PCA、神经网络
最小-最大归一化 保留原始分布形状,输出范围固定 对异常值非常敏感 图像处理、神经网络输入层
稳健标准化 对异常值不敏感 不保留原始分布和范围 含有异常值的数据集
L2归一化 适用于余弦相似度 改变了原始数据的相对关系 文本挖掘、推荐系统

总结

数据标准化与归一化是构建高效、公平机器学习模型不可或缺的预处理步骤。它们通过消除特征间的量纲差异,为算法提供了一个公平的竞争环境。

核心要点回顾:

  • 理解差异标准化 致力于将数据转换为标准正态分布,关注数据的分布形状 ;而归一化 则专注于将数据压缩到特定的数值范围
  • 正确流程 :预处理参数必须严格从训练集中学习,并一致地应用于验证集和测试集,这是防止数据泄露、保证模型评估公正性的生命线。
  • 场景化选择:没有绝对最优的方法。标准化因其通用性成为默认的起点;最小-最大归一化在需要固定输出范围时表现出色;而面对异常值时,稳健标准化则是更安全的选择。
  • MATLAB工具链 :从简洁的zscorerescale,到灵活的normalize函数,再到可保存状态的mapstd,MATLAB提供了一整套从快速实验到生产部署的完整工具。
相关推荐
yongui4783422 分钟前
混凝土二维随机骨料模型 MATLAB 实现
算法·matlab
我爱C编程25 分钟前
5G下行信号的频谱结构及模糊函数特征matlab仿真与分析
5g·matlab·模糊函数·频谱结构
yong99902 小时前
基于势能原理的圆柱齿轮啮合刚度计算MATLAB程序实现
开发语言·matlab
矿矿不想吃饭6 小时前
MATLAB control system model
matlab
bubiyoushang8887 小时前
基于MATLAB的局部特征尺度分解(LCD)实现与优化
开发语言·matlab
一个没有本领的人19 小时前
Matlab批量修改文件夹的名称
matlab
kaikaile199520 小时前
结构风荷载理论与Matlab计算
开发语言·matlab
yugi9878381 天前
遗传算法优化的极限学习机模型(GA-ELM)Matlab实现
开发语言·matlab
ghie90901 天前
MATLAB中编写不平衡磁拉力方程
开发语言·matlab
机器学习之心1 天前
卷积神经网络(CNN) 与SE(Squeeze-and-Excitation)注意力机制锂电池剩余寿命预测,MATLAB代码
人工智能·matlab·cnn·锂电池剩余寿命预测