【学习记录】PCA主成分分析 SVD奇异值分解
在看MSC-VO代码的过程中,大量出现了奇异值分解的内容,本身对这部分了解不多,这里补一下课,参考b站up主小旭学长的视频,链接为:PCA主成分分析和SVD主成分分析
PCA主成分分析
PCA根本目的在于让数据在损失尽可能小的前提下,降低数据的维度。比如将三维数据降低到二维,那么就是要在空间中找一个平面,让3d点在2d平面上的投影尽可能保持原来3d空间下的分布。将这个概念推广一下,PCA的任务也就是找一个新的坐标系,让原数据在新坐标系下的投影损失尽可能小,而这个新的坐标系的寻找方法,我们就要依赖于方差这一概念。这里我们可以这样去理解,方差衡量的是数据的密集程度,方差小意味着这一大堆数据几乎就是集中在一小撮,这样必然会导致数据的差异性变得很模糊,因此我们在进行降维时,需要寻找的坐标系最好是方差尽可能大的,从而能让数据降维后分布尽量分散。因此这里我们要寻找的这个坐标系,就是原数据中方差最大的方向。
在进行坐标系的寻找之前,我们需要对原始数据做一个中心化的操作,也就是将坐标原点移动到数据的分布中心,这主要是为了更好地寻找方差最大的方向。移动到中心后,就需要进行一系列的推导,这里我们假定最后的处理结果数据符合高斯分布,根据线性代数中数据的拉伸和旋转的写法,拉伸等于左乘一个对角阵,旋转等于左乘一个三角函数构成的矩阵,数据的处理前后本身就可以用旋转和拉伸来表示。
上图描述的是原始数据和最终结果之间通过旋转和拉伸的转换关系,在这个问题中,我们并不知道旋转和拉伸的幅度,所以问题变为如何求R和S。在求R和S的过程中,我们需要利用协方差矩阵COV,协方差用于表示两个变量在变化过程中的关联关系,协方差为正表示两个量是正相关,反之为负相关,如果为零则表示两个量相互无关。根据协方差矩阵的定义,我们可以得到下面的化简公式:
从这个公式可以看出,协方差矩阵的计算依赖于原数据构成的矩阵,这里为了方便我们统一以二维举例,那么最后的x1 x2 y1 y2表示的就是二维坐标下的点,我们将其记录为数据矩阵D。而在前面我们得到了原始数据和处理结果之间基于旋转R和拉伸S的转换关系,那么带入后可以继续往后写。
在这个过程中主要有这么几步需要解释一下,首先右上角加’表示的是最终结果,这个与前面的推导稍微有点不同但是一个意思。在第四行,括号内对应的刚好是目标坐标系的协方差矩阵,因此括号的内容在第五行合成为了C’,由于前面我们假定了目标坐标系的数据在两个方向都符合高斯分布,所以协方差矩阵为单位矩阵,所以在第六行可以直接消去C’,从而得到最后的计算结果。由于S本身是一个对角阵,因此转置与否都不发生变化,而且R本身是一个正交矩阵,R的转置与逆矩阵相等,所以我们进行如下的操作。
从最终结果来看,这个结果其实对应了考研数学中老生常谈的矩阵对角化,C表示的是原始数据的协方差矩阵,L本身为对角阵,因此就是由特征值组成的对角矩阵,R则为特征向量拼成的矩阵。所以我们要求R和S,就需要先计算原始数据的协方差矩阵,对这个矩阵做对角化,结果的特征向量组成的矩阵就是旋转R,特征值对角阵开方得到的就是拉伸S。
SVD奇异值分解
SVD本身和矩阵对角化是相通的,矩阵对角化要求矩阵必须是一个方阵,这个时候可以计算出特征值和特征向量,而当矩阵本身不是方阵时,我们就无法计算特征值与特征向量,与之相对应的就变成奇异值,当矩阵为方阵的时候,奇异值和特征值就是一个东西。类似于对角化,奇异值分解本身也是要寻找矩阵,由于不是方阵,这里目标变成了三个矩阵。
奇异值分解的过程本身也可以用拉伸旋转的理论来解释,我们将M看作是一个线性变换,我们希望找到一个基,这个基在线性变换前后依然可以保持正交,这个就是SVD的主要任务。假设V是原始域的标准正交基,U是经过M变换后的标准正交基,由于SVD本身要求变换前后保持正交即可,所以结果的U不一定是标准正交基,这里额外补充一个伸缩б1和б2用于实现这个正交的对齐。那么我们可以写出下面的等式:
得到了M的表示,那么我们可以继续进行后续的推理:
在这部分公式中,左侧第三行到第四行中,由于U本身表示的是标准正交基组成的矩阵,其转置右乘原矩阵等于单位矩阵,因此在这一步中进行了消去,第四行中的操作和前面PCA的过程基本相似,∑本身不一定是方阵,但其依然符合主对角线上有元素其余位置均为零,所以依然可以整合为一个平方的矩阵,这里就是记作了L,也就是到了第五行的位置,在第五行中,L已经变成了一个方阵,公式左侧也是一个方阵,这时等式的形式就转变为了矩阵对角化的结果,左侧是原矩阵,右侧的L为特征值组成的对角矩阵,V表示特征向量组成的矩阵,所以对MTM和MMT分别进行对角化,就可以计算出线性变化前后的两个基底,对特征值矩阵进行开方,就可以得到伸缩系数。
PCA与SVD的关系
在PCA中我们需要的旋转R和SVD中的V是一样的,也就是说SVD的V就是PCA的主成分的方向。
这二者之间的关系主要通过这个V矩阵进行联系,PCA需要先计算协方差矩阵,计算量可能会比较大,反过来用SVD的话,可以不计算协方差矩阵直接求出V。
相关文章:

【学习记录】PCA主成分分析 SVD奇异值分解
在看MSC-VO代码的过程中,大量出现了奇异值分解的内容,本身对这部分了解不多,这里补一下课,参考b站up主小旭学长的视频,链接为:PCA主成分分析和SVD主成分分析 PCA主成分分析 PCA根本目的在于让数据在损失尽…...

用 Python 调用 GPT-3 API
用 Python 调用 GPT-3 API GPT-3 是去年由 Open AI 推出的语言机器学习模型。它因其能够写作、写歌、写诗,甚至写代码而获得了广泛的媒体关注!该工具免费使用,只需要注册一个电子邮件即可。 GPT-3 是一种叫 transformer 的机器学习模型。具体…...

类和对象实操之【日期类】
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The pessimist complains about the wind; the optimist expects it to change; the realist adjusts the sails. 悲观主义者抱怨风;乐观主义者期望它…...

微搭中如何实现弹性布局
我们在实际开发中经常可能会有一些社交的场景,比如开发一个类似朋友圈九宫格图片展示的功能。因为图片的数量不确定,所以需要实现图片的从左到右顺序排列。 在微搭中可以以可视化的方式设置样式。但是对于我们这类特殊需求,只用可视化设置显…...

九龙证券|外资强势出手!这只科创板百元股,被疯狂加仓
本周,北上资金净买入29.32亿元,连续第13周加仓A股。分商场看,北上资金加仓重点倾向于沪市的白马蓝筹股,沪股通取得50.34亿元,深股通则被净卖出21.02亿元。 食品饮料本周取得逾23亿元的增持,居职业首位&…...
51单片机最强模块化封装(4)
文章目录 前言一、创建key文件,添加key文件路径二、key文件编写三、模块化测试总结前言 本篇文章将为大家带来按键的模块化封装,这里使用到了三行按键使得我们的代码更加简便。 按键原理:独立按键 一、创建key文件,添加key文件路径 这里的操作就不过多解释了,大家自行看…...

五、Git本地仓库基本操作——分支管理
1. 什么是分支? master分支 我们在初始化git仓库的时候,会默认创建一个master分支,HEAD指针这时就会默认执行master分支。当我们在master分支提交(commit)了更新之后,master分支就会指向当前当前最新的co…...

vscode搭建python Django网站开发环境
这里使用pip安装的方式,打开命令行,输入执行: pip install django2.2这里选择安装2.2版本是因为是新的lts版本,长期支持稳定版。 接下来再安装pillow,Django底层一部分是基于pillow进行的。 pip install pillowpylint…...

【mybatis】实现分页查询
一 .使用原生分页器的实体类 1.1 java代码部分 方法多 不易书写 package cn.bdqn.entity;public class Page {private Integer pageIndex;//页码private Integer pageSize;//页大小 显示多少行数据private Integer totalCounts;//数据的总行数private Integer totalPages;//…...
CF1560D Make a Power of Two 题解
CF1560D Make a Power of Two 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1560D 字面描述 题面翻译 给定一个整数 nnn。每次操作你可以做两件事情中的一件&am…...
C#开发的OpenRA的读取文件的函数
C#开发的OpenRA的读取文件的函数 在OpenRA游戏里,读取文件是必备的功能。 因为游戏大部分文件都是图片、动画、语音。 很久以前,我以为开发游戏的主要功能是在程序开发上, 其实游戏的大部分工作都不是在开发上,而是在美工方面。 因为游戏跟电影是一样,就是不断地展示场景,…...

SpringBoot结合XXL-JOB实现定时任务
Quartz的不足 Quartz 的不足:Quartz 作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题: 通过调用API的方式操作任务,不人性化。需要…...

【Node.js】 创建web服务器
Node.js什么是客户端,什么是服务器服务器和普通电脑的区别什么是http模块导入http模块服务器相关概念创建web服务器的基本步骤req请求对象req响应对象解决中文乱码根据不同的url响应不同的html内容什么是客户端,什么是服务器 客户端在网络节点中&#x…...
基于go语言实现RestFul交互
一、RestFul 1.1 RestFul的介绍 RESTFUL(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP或HTTPS,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景&…...
情感溢出:读《浣溪沙》
浣溪沙 谁念西风独自凉 作者 纳兰性德 谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。 被酒莫惊春睡重,赌书消得泼茶香,当时只道是寻常。 记得年轻时学这篇词,就是愣背,现在也就记得这句当时只道是寻常…...

深入解读.NET MAUI音乐播放器项目(一):概述与架构
系列文章将分步解读音乐播放器核心业务及代码: 深入解读.NET MAUI音乐播放器项目(一):概述与架构深入解读.NET MAUI音乐播放器项目(二):播放内核深入解读.NET MAUI音乐播放器项目(三…...

【Python小游戏】某程序员将套圈游戏玩儿到了巅峰,好嗨哟~Pygame代码版《牛牛套圈》已上线,大人的套圈游戏太嗨了,小孩勿进。
前言 世上选择那么多。 关注栗子同学会是您最明智的选择哦。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 “幸运牛牛套圈圈”套住欢乐,圈住幸福,等你来挑战…...
php的declare命令如何使用?
php中的declare结构用来设定一段代码的执行指令declare用于执行3个指令:ticks,encoding,strict_typesdeclare结构用于全局范围,影响到其后的所有代码(但如果有declare结构的文件被其他文件包含,则对包含他的父文件不起作用&#x…...

嵌软工程师要掌握的硬件知识2:一文看懂什么开漏和推挽电路(open-drain / push-pull)
想了解开漏和推挽,就要先了解一下三极管和场效应管是什么,在其他章节有详细介绍,本文就不再进行赘述。 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管,Q4是个PNP型三极管。 1)当Vin电压为正时,上面的N型三极管控制端有电…...

1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间
1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间流水线周期计算流水线执行时间微秒,时间单位,符号μs(英语:microsecond ),1微秒等于百万分之一秒(…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...