当前位置: 首页 > article >正文

主成分分析(Principal Component Analysis, PCA) 数学原理 与 MATLAB代码复现

主成分分析(Principal Component Analysis, PCA)介绍

主成分分析(PCA)是一种广泛应用的统计技术,主要用于数据的降维和特征提取。它通过正交变换将一组可能存在相关性的变量转换为一组线性不相关变量,这些新的变量被称为主成分。

其中两个关键基本概念

  1. 主成分:PCA的目标是找到数据集中方差最大的方向,并将数据投影到这个方向上,得到第一个主成分。随后,在与第一个主成分正交的方向上找到方差次大的方向,得到第二个主成分,以此类推。

  2. 降维:通过选择前几个主成分,可以保留数据集中的大部分信息,同时减少数据的维度,从而简化后续的数据处理和分析。

 

论文中常利用PCA分析高维数据的分布与特征聚类效果 、或用于降维,优化后续模型的表现

数学原理

主成分分析的设计初衷是为了解决部分数据间线性相关性较强,参数冗余的问题,将数据的向量空间重新投影至一个“高效空间”,即主成分空间(以下简称为:“这一目标”)

主成分的数学思想:为了实现这一目标,主成分降维后的数据应达到以下两个要点:

降维后各维度的方差尽可能大,即数值分布最离散。(找到最能表示数值差异的维度)
不同维度(参数)间的相关性为 0 (空间正交)。(保证各维度线性无关)

 

为解决这一需求,学者们巧妙地利用了协方差矩阵来构建这一问题的解决方法

C=\frac{1}{n-1}Z^TZ

其中,Z 是标准化后的数据矩阵,n 是样本数。协方差矩阵C是一个对称矩阵,其对角线上的元素是各特征的方差,非对角线上的元素是各特征之间的协方差。

为什么要选择利用协方差矩阵解决这一问题?

协方差矩阵有许多优秀的性质帮我们达到以上两项要求:

协方差矩阵 对角线上的元素分别是向量的方差 ,表示该维度数据的离散程度;
而非对角线元素表示不同维度数据之间的协方差,即它们的相关性。
 
因此,这一目标,也就可以表述为让变化后数据的协方差矩阵的迹尽可能的大,同时非对角线元素为0.

说到让数据的协方差矩阵的迹尽可能的大,同时非对角线元素为0.你会想到什么?那当然是矩阵的特征值与特征向量矩阵。

回顾一下在线性代数中矩阵特征值的性质:

特征值之积等于矩阵的行列式值, 特征值之和等于矩阵的迹 (即对角线元素之和 = 方差之和)。
对于任意两个不同的特征值 λ1 λ2 ,它们对应的 特征向量 v1 v2 是正交的 ,即 v1·v2=0
矩阵的所有特征值都是实数或复数。 对称矩阵的特征值为实数 。(巧了,协方差矩阵必定为对称矩阵)

于是:

对协方差矩阵C进行特征值分解,可得到特征值λ1​,λ2​,…,λp​(按大小排序)和对应的特征向量v1​,v2​,…,vp​。这些线性无关的正交向量,就是评估该数据分布的最优空间,也就是PCA的主成分空间。

我们手算时常用的特征值λ求解方程:

f(\lambda )=|A-\lambda E|=0

但协方差矩阵通常是正定矩阵,所以在计算时常用奇异值分解SVD来等价特征值求解,减少计算量。

 SVD的计算量通常与数据的秩成正比,而秩通常远小于数据的维度。这意味着SVD可以在不计算整个协方差矩阵的情况下找到数据的主成分,从而显著提高计算效率。

SVDA=U \Sigma V^T

变化:(U)^{-1} A (V^{T})^{-1}=\Sigma

其中:U=Order(AA^T);    V=Order(A^T A);

其中,A就是我们输入的协方差矩阵,Order意味将矩阵按特征值(向量拥有的维度)进行由大到小排列。Σ(sigma)是由降序排列的非负对角线元素组成的m×n矩形对角矩阵,这些对角线元素称为奇异值-特征值。

 

得到特征值λ1​,λ2​,…,λp​和对应的特征向量v1​,v2​,…,vp后,​按大小排序。特征值表示每个特征向量的方向上数据的方差大小,而特征向量则表示这些方向。用选定的k个特征向量构造矩阵P,再将原始数据投影到P所构成的空间中,得到降维后的数据

Y=X*P^T

对于不同的特征向量(主成分空间),我们可以用主成分贡献率Contributing rate of principal component进行评估:

算公式为:

\alpha _{i}=\frac{\lambda_{i}}{\sum \hat{\lambda }_{i}}

其中,αi​表示第i个主成分的贡献率,λi​表示第i个主成分的特征值,\sum \hat{\lambda }_{i}表示所有特征值之和。

注:

累计贡献率:它是指主成分前k个特征值之和在全部特征值之和的比率。一般选择前k个主成分,使其累计方差贡献率达到一定的阈值(如85%-95%),用前k个主成分代替原来的n个变量,这样既能保证信息含量基本不变,又能实现数据降维和各数据因子之间独立的目的。

MATLAB复现代码

function [coeff, score, latent] = myPCA(X)
    % 输入:
    % X - 原始数据矩阵,每一行是一个数据样本,每一列是一个特征
    %
    % 输出:
    % coeff - 主成分系数矩阵(即特征向量)
    % score - 转换后的数据(即主成分得分)
    % latent - 每个主成分的特征值(即解释的方差)
 
    % 第一步:数据中心化
    X_mean = mean(X);
    X_centered = X - X_mean;
 
    % 第二步:计算协方差矩阵
    covMatrix = cov(X_centered);
 
    % 第三步:计算协方差矩阵的特征值和特征向量
    [V, D] = eig(covMatrix);
 
    % 特征值是对角矩阵,提取对角线上的特征值
    latent = diag(D);
 
    % 第四步:将特征值从大到小排序,并相应调整特征向量
    [latent, idx] = sort(latent, 'descend');
    coeff = V(:, idx);
 
    % 第五步:计算主成分得分
    score = X_centered * coeff;
end
 
% 示例使用
% 假设我们有一个数据矩阵X,其中每一行是一个样本,每一列是一个特征
X = [2.5, 2.4;
     0.5, 0.7;
     2.2, 2.9;
     1.9, 2.2;
     3.1, 3.0;
     2.3, 2.7;
     2, 1.6;
     1, 1.1;
     1.5, 1.6;
     1.1, 0.9];
 
% 调用自定义的PCA函数
[coeff, score, latent] = myPCA(X);
 
% 显示结果
disp('主成分系数矩阵:');
disp(coeff);
 
disp('主成分得分:');
disp(score);
 
disp('每个主成分的特征值:');
disp(latent);

可直接使用官方函数,更加方便:[coeff,score,latent] = pca(___)

相关参考:matlab PCA(Principal Component Analysis)主成分分析作图 2D|3D带有参数指向 案例_主成分分析图用什么软件制作-CSDN博客


http://www.kler.cn/a/392676.html

相关文章:

  • 【Unity开发】低版本HDRenderPipeline升级到HDRP14.x版本问题笔记
  • 如何阻止盗版软件在互联网上传播
  • 模拟——郑益慧_笔记1_绪论
  • docker mysql5.7安装
  • SQL创建和操纵表
  • Java开发经验——数据库开发经验
  • D67【python 接口自动化学习】- python基础之数据库
  • PostgreSQL 一键安装部署脚本化
  • html实体字符
  • 动态规划 —— dp 问题-买卖股票的最佳时机含冷冻期
  • Linux手动安装nginx
  • Vue全栈开发旅游网项目(11)-用户管理前端接口联调
  • 【iStat Menus for MacBook状态栏菜单系统监控工具--安装教程【简单操作,随时了解电脑情况】
  • IDEA一键部署SpringBoot项目到服务器
  • 516.最长回文子序列
  • 通过wsl配置Qt的中文开发环境
  • 《操作系统 - 清华大学》3 -2:地址空间和地址生成
  • Vue的路由
  • 数据分析-系统认识数据分析
  • 快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)
  • 浏览器添加翻译扩展
  • 系统架构设计师(第二版)常见英语(更新中)
  • Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南
  • 字节、快手、Vidu“打野”升级,AI视频小步快跑
  • 卷积神经网络CNN
  • 使用 Sparkle 实现 macOS 应用自定义更新弹窗