精通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提供了一整套从快速实验到生产部署的完整工具。
相关推荐
三维空间3 小时前
MATLAB输入输出完全教程:input/disp/fprintf函数用法与实战
matlab
三维空间3 小时前
MATLAB数组创建完全教程:直接赋值/linspace/zeros/ones/rand函数用法与实战
matlab
逆小舟4 小时前
【matlab】simulink实践经验(12.3)
开发语言·matlab
科技观察4 小时前
国产MATLAB替代软件的关键能力与生态发展现状
大数据·人工智能·matlab
Dev7z5 小时前
基于MATLAB小波变换的音频水印算法研究与实现
开发语言·matlab·音视频
cici158745 小时前
MATLAB/Simulink单相光伏并网逆变器仿真
开发语言·matlab
Dev7z6 小时前
基于MATLAB小波分析的图像增强算法及其仿真实现
开发语言·matlab
机器学习之心6 小时前
MATLAB基于极差法和灰色关联分析的40Cr零件内孔珩磨参数优化
matlab·灰色关联分析
aini_lovee7 小时前
基于UERD算法的JPEG图像隐写MATLAB实现
开发语言·算法·matlab