ML:主成分分析(PCA)的基本原理与实现

news2026/5/8 15:24:32
在机器学习中并不是所有任务都直接以“预测标签”或“预测数值”为目标。有时我们面对的数据本身就具有较高维度特征很多、变量之间相关性较强、可视化困难、计算开销偏大。这时一个自然的问题就会出现能否在尽量保留主要信息的前提下用更少的维度表示原始数据主成分分析Principal Component AnalysisPCA正是解决这一问题的经典方法。它属于无监督学习Unsupervised Learning中的降维方法训练数据中不需要标签算法也不直接学习输入与输出之间的映射关系而是从数据自身的分布结构中寻找更紧凑的表示方式。PCA 的设计出发点可以概括为一句话如果高维数据中的主要变化集中在少数几个方向上就可以用这些方向重新表示数据从而达到降维、压缩和可视化的目的。一、主成分分析的基本思想PCA 的核心思想是在原始特征空间中寻找若干个新的坐标轴使得数据在这些方向上的变化尽可能大并用这些新坐标轴重新表示数据。这里所谓“变化尽可能大”更准确地说就是数据投影到新坐标轴之后投影结果的方差尽可能大。方差越大说明数据在该方向上的差异越明显在 PCA 的假设中这类方向往往包含更多主要结构信息。图 1PCA 的基本思路如果把数据看作分布在特征空间中的一团点云那么 PCA 会尝试找到• 第一条最重要的方向使数据投影到这条线上之后方差最大• 第二条方向与第一条正交并在剩余变化中继续解释尽可能多的方差• 第三条方向再与前两条正交并解释下一部分方差• 依此类推得到一组按重要程度排序的新方向因此PCA 不是简单删除某些原始特征而是重新构造一组新的综合变量。这些新变量称为主成分Principal Components它们是原始特征的线性组合并且彼此正交。从机器学习流程看PCA 完成的是这样一件事• 输入一个高维特征矩阵• 输出一个低维表示• 目标在压缩维度的同时尽量保留数据中的主要变化信息图 2PCA 在机器学习流程中的位置需要注意的是PCA 是无监督方法。它只根据特征矩阵本身寻找主要变化方向不需要类别标签也不直接关心某个方向是否有利于分类或回归。因此PCA 更适合用于结构分析、数据压缩、降维可视化和下游模型预处理。二、主成分分析的数学表达1、数据矩阵与中心化设原始数据矩阵为其中• X 表示原始数据矩阵• n 表示样本数• p 表示特征数• xᵢⱼ 表示第 i 个样本在第 j 个特征上的取值每一行表示一个样本每一列表示一个特征。PCA 在计算前通常会先对每个特征做中心化也就是减去该特征的均值。设按列求得的均值向量为其中• x̄ 表示按列计算得到的均值向量• x̄₁ 表示第 1 个特征的均值• x̄₂ 表示第 2 个特征的均值• x̄ₚ 表示第 p 个特征的均值中心化后的数据可记为其中• Xᶜ 表示中心化后的数据矩阵• X 表示原始数据矩阵• x̄ 表示每个特征的均值向量中心化后的每一列均值为 0。中心化的意义在于PCA 关注的是数据围绕均值的变化方向而不是数据整体离原点有多远。2、主成分方向PCA 要寻找的是一组新的方向向量。设第一个主成分方向为其中• w₁ 表示第一主成分方向• w₁₁、w₂₁、…、wₚ₁ 表示该方向在各个原始特征上的权重• w₁ 是单位向量• p 表示原始特征数所有样本投影到这一方向上的坐标可写为其中• z₁ 表示所有样本在第一主成分方向上的投影结果• Xᶜ 表示中心化后的数据矩阵• w₁ 表示第一主成分方向PCA 的目标是让 z₁ 的方差尽可能大。因此第一个主成分可以理解为使投影后方差最大的方向。第二个主成分方向 w₂ 要求与 w₁ 正交并在这一约束下使投影方差继续尽可能大其中• w₁ 表示第一主成分方向• w₂ 表示第二主成分方向• w₁ᵀw₂ 0 表示两个方向正交正交意味着两个主成分方向彼此不重复表达同一部分变化。依此类推就得到一组彼此正交、按解释方差从大到小排序的主成分方向。在 Scikit-learn 中components_ 表示特征空间中的主轴并按解释方差从大到小排列。3、低维投影图 3PCA 投影过程示意从二维到一维如果只保留前 k 个主成分并把这些方向组成矩阵其中• Wₖ 表示前 k 个主成分方向组成的投影矩阵• w₁ 表示第一主成分方向• w₂ 表示第二主成分方向• wₖ 表示第 k 个主成分方向• k 表示希望保留的主成分个数那么原始数据在低维空间中的表示可写为其中• Z 表示降维后的新表示• Xᶜ 表示中心化后的数据矩阵• Wₖ 表示前 k 个主成分方向组成的投影矩阵• Z 的每一列对应一个主成分• k p表示降维后的维度小于原始特征数这就是 PCA 最核心的结果用更少的主成分近似表示原始数据。4、一个简单的运算示例为了更直观地理解 PCA 的“投影”和“方差最大”思想可以考虑一个非常简单的二维数据集。假设有 3 个样本且数据已经中心化其中• Xᶜ 表示中心化后的数据矩阵• 该数据集有 3 个样本、2 个特征• 三个样本大致分布在同一条斜线上观察数据可知主要变化方向大致沿着向量将其单位化得到第一主成分方向其中• w₁ 表示第一主成分方向• √5 是向量 [2, 1] 的长度单位化后w₁ 的长度为 1w₁ 仍然表示原数据中变化最明显的方向。把样本投影到该方向上其中• z₁ 表示样本在 w₁ 方向上的一维投影坐标• Xᶜ 表示中心化后的二维数据• w₁ 表示第一主成分方向逐行计算第 1 个样本第 2 个样本第 3 个样本因此投影结果为其中• z₁ 表示三个样本在第一主成分方向上的投影结果• 第 1 个样本投影值为 √5• 第 2 个样本投影值为 0• 第 3 个样本投影值为 -√5二维数据已经被压缩为一维表示。由于数据已经中心化投影结果的均值也是 0。按样本方差计算其中• Var(z₁) 表示 z₁ 的样本方差• 分子表示三个投影值的平方和• 分母为 3 - 1因为这里计算的是样本方差• 结果为 5说明样本在 w₁ 方向上的变化较明显再看与 w₁ 正交的方向其中• w₂ 表示第二个方向• w₂ 与 w₁ 正交• w₂ 用来观察数据在另一条垂直方向上的变化投影结果为其中• Xᶜw₂ 表示样本在 w₂ 方向上的投影结果• 三个投影值都为 0说明数据在 w₂ 方向上几乎没有变化因此w₂ 方向的方差为 0。这个例子说明数据几乎全部沿着 w₁ 方向变化而在与之正交的 w₂ 方向上几乎没有变化。因此如果只保留第一主成分就可以把二维数据压缩为一维同时保留主要变化信息。三、PCA 为什么以“方差最大”为目标图 4PCA 为什么寻找方差最大的方向1、方差大的方向包含更多变化信息在 PCA 中一个基本假设是如果某个方向上的方差很大说明数据在这个方向上有更明显的差异这个方向更可能包含主要结构信息。反过来如果某个方向上的方差很小说明样本在该方向上变化不明显它可能只包含较弱信息甚至主要是噪声。因此PCA 会优先保留方差较大的方向。2、降维本质上是有损压缩降维并不意味着“完全不损失信息”。它真正做的是在允许一定信息损失的前提下尽量保留最主要的变化结构。很多高维数据虽然表面上维度很高但主要变化往往集中在少数几个方向上。此时前几个主成分就可能已经保留了数据中的大部分结构信息。3、方差最大与重构误差最小PCA 也可以从另一个角度理解当我们用较低维度近似表示原始数据时PCA 寻找的是一种线性子空间使数据投影到该子空间后重构误差尽可能小。也就是说在标准 PCA 中保留最大方差方向与在线性子空间中最小化重构误差是同一问题的两个视角。前者更容易从“信息保留”角度理解后者更容易从“数据压缩”角度理解。4、解释方差比训练完成后解释方差比 explained_variance_ratio_ 表示每个选中主成分所解释的方差比例。如果保留了全部主成分这些比例之和为 1.0。这意味着• 第一主成分解释最多方差• 第二主成分解释剩余方向中的次多方差• 若前几个主成分的解释方差比总和已经很高就说明这些主成分已经保留了数据的大部分主要变化图 5PCA 的解释方差比与累计解释方差比在实际使用中常会根据累计解释方差比选择主成分个数。例如希望累计解释方差比达到 90% 或 95%就可以据此确定需要保留多少个主成分。四、PCA 在 Scikit-learn 中的实现方式在 Scikit-learn 中PCA 是一种线性降维方法。它基于奇异值分解Singular Value DecompositionSVD把数据投影到更低维空间。输入数据在计算前会按特征中心化但默认不会自动标准化。这点非常重要中心化只是减去均值标准化还会调整尺度。如果不同特征的量纲或数值范围差异很大通常应先使用 StandardScaler 再使用 PCA。1、PCA 是一个 transformer在 Scikit-learn 中PCA 被实现为一个 transformer。它在 fit 中学习主成分方向在 transform 中把数据投影到这些主成分上。典型使用流程是• 创建 PCA 对象• 调用 fit(X) 学习主成分• 调用 transform(X) 把数据投影到低维空间• 或直接使用 fit_transform(X) 一步完成学习与转换2、常见参数PCA 的常见参数包括• n_components要保留的主成分个数。若未设置则保留 min(n_samples, n_features) 个成分。它也可以是 0 到 1 之间的浮点数表示希望保留的累计解释方差比例也可以设为 mle由算法估计合适维度。• whiten是否进行白化处理。若设为 True会把投影后的主成分缩放到单位方差。它有时有利于下游模型但会丢失主成分之间原有的相对方差尺度信息。• svd_solver指定 SVD 求解策略。通常情况下使用默认值即可只有在大规模数据或特殊性能需求下才需要重点调整。其中n_components 是最关键的参数因为它直接决定降维后保留多少个维度。3、常见属性训练完成后常见属性包括• components_主成分方向• explained_variance_每个主成分解释的方差• explained_variance_ratio_每个主成分解释的方差比例• singular_values_对应奇异值• mean_每个特征的经验均值这些属性共同帮助我们理解 PCA 学到了什么以及降维后保留了多少主要信息。五、模型结果如何解释1、主成分的含义每一个主成分本质上都是原始特征的一个线性组合。图 6主成分是原始特征的线性组合可以写成其中• PC₁ 表示第一主成分• x₁、x₂、…、xₚ 表示原始特征• a₁、a₂、…、aₚ 表示对应权重• PC₁ 是多个原始特征按不同权重组合得到的新变量如果某个主成分方向在若干原始特征上的权重较大就说明这个主成分主要反映了这些特征的共同变化模式。因此PCA 不是“重新命名特征”而是在构造新的综合变量。六、Python 实现用鸢尾花数据集做 PCA 降维下面用鸢尾花数据集演示 PCA 的基本使用方式。import matplotlib.pyplot as plt # 绘图库from sklearn.datasets import load_iris # 加载鸢尾花数据集from sklearn.decomposition import PCA # 主成分分析降维 # 根据操作系统选择中文字体二选一取消注释对应行plt.rcParams[font.sans-serif] [Microsoft YaHei] # Windows# plt.rcParams[font.sans-serif] [Songti SC] # macOSplt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 1. 加载数据iris load_iris()X iris.data # 特征 (150,4)y iris.target # 标签 (150,) # 2. 创建 PCA 模型降到 2 维pca PCA(n_components2) # 保留前两个主成分 # 3. 拟合并转换X_pca pca.fit_transform(X) # 训练 PCA 并降维 # 4. 查看解释方差比print(各主成分解释方差比, pca.explained_variance_ratio_) # 每个主成分保留的信息占比print(累计解释方差比, pca.explained_variance_ratio_.sum()) # 总信息保留比例 # 5. 可视化plt.figure(figsize(8, 5)) # 按类别分别绘制散点图for class_id, class_name in enumerate(iris.target_names): plt.scatter( X_pca[y class_id, 0], # 第一主成分坐标 X_pca[y class_id, 1], # 第二主成分坐标 labelclass_name ) plt.xlabel(第一主成分)plt.ylabel(第二主成分)plt.title(PCA 降维后的鸢尾花数据)plt.legend()plt.show() # 显示图形输出示意图这段代码展示了 PCA 的基本工作流1、构造或加载数据2、创建 PCA(n_components2) 模型3、使用 fit_transform() 学习主成分并完成降维4、查看解释方差比5、用二维散点图观察降维后的分布。在这里X_pca 不再是原来的 4 维特征而是投影到前两个主成分上的二维表示。需要注意的是鸢尾花数据的各特征单位相同数值范围差异也不算特别大所以这个示例可以直接演示 PCA 的基本流程。但在更一般的任务中如果不同特征量纲差异明显通常应先进行标准化。七、Python 实现在 Pipeline 中把 PCA 与分类模型结合在实际应用流程中PCA 往往不是单独使用而是作为预处理步骤与分类器或回归器配合使用。下面使用手写数字数据集演示一个典型流程。from sklearn.datasets import load_digits # 加载手写数字数据集from sklearn.decomposition import PCA # 主成分分析降维from sklearn.linear_model import LogisticRegression # 逻辑回归分类器from sklearn.model_selection import train_test_split # 数据集划分from sklearn.pipeline import make_pipeline # 创建管道from sklearn.preprocessing import StandardScaler # 标准化 # 1. 加载数据digits load_digits()X digits.data # 特征 (1797, 64)y digits.target # 标签 (1797,) # 2. 划分训练集与测试集测试集20%分层采样X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy) # 3. 构造管道标准化 → PCA降维到20维 → 逻辑回归pipe make_pipeline( StandardScaler(), # 标准化均值为0方差为1 PCA(n_components20), # 降维到20个主成分 LogisticRegression(max_iter2000) # 逻辑回归增大迭代次数保证收敛) # 4. 训练与评估pipe.fit(X_train, y_train) # 训练模型score pipe.score(X_test, y_test) # 测试集准确率 print(测试集得分, score)这个示例说明PCA 可以先把原始高维数据压缩到更低维空间再交给后续分类器处理。这种写法有三个好处• 使用 StandardScaler() 先统一特征尺度避免 PCA 被大尺度特征主导• 使用 PCA(n_components20) 压缩特征维度减少冗余信息• 使用 Pipeline 把预处理、降维和建模串成一个完整流程避免训练集与测试集之间发生数据泄漏需要注意的是PCA 不一定总能提升模型预测效果。它主要优化的是无监督的方差保留目标而不是分类准确率或回归误差。因此在监督学习任务中PCA 是否有利于最终模型需要通过验证集或交叉验证来判断。八、PCA 的适用场景与主要局限图 7PCA 的适用场景与局限1、适用场景PCA 较适合以下情况• 特征维度较高• 特征之间相关性较强• 希望压缩维度、减少冗余• 希望把高维数据可视化到 2 维或 3 维• 希望作为后续模型的预处理步骤• 希望在不使用标签的情况下分析数据主要结构它尤其适合那些“主要变化方向明显、线性结构较强”的数据。2、主要局限PCA 虽然经典但并不是万能方法。1PCA 是线性的普通 PCA 只能寻找线性方向。如果数据的主要结构明显是非线性的PCA 可能无法很好表示此时可以考虑 KernelPCA、t-SNE、UMAP 等方法。2解释性有限主成分是原始特征的组合往往不如原始变量直观。尤其当特征数量较多时每个主成分的实际含义可能较难解释。3默认不做标准化PCA 对特征尺度敏感。如果各特征量纲差异很大结果可能被大尺度特征主导。因此在多数实际任务中通常需要先做标准化。4并不直接考虑监督目标PCA 是无监督方法只关心方差大小不直接关心类别区分或预测效果。某些方差较大的方向未必对分类最有用而某些方差较小的方向反而可能包含重要判别信息。5标准 PCA 是批处理方法标准 PCA 通常需要整体访问数据。当数据规模很大时计算和内存开销可能较高。此时可以考虑 IncrementalPCA、随机 SVD 或其他适合大规模数据的降维方法。 小结PCA 通过寻找方差最大的正交方向把高维数据压缩为更低维表示。它不依赖标签适合用于降维、可视化、去冗余和预处理。理解 PCA有助于把握无监督学习中的结构发现、线性降维与数据表示变换。“点赞有美意赞赏是鼓励”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…