Eigen 矩阵的SVD分解
矩阵的SVD分解
- 一、SVD分解原理
- 二、SVD分解举例
- 三、用Eigen库实现SVD分解
- 1.C++代码
- 2.输出结果
一、SVD分解原理
奇异值分解是将一个非零的实数矩阵Am×nA_{m \times n}Am×n分解成由三个是矩阵乘积形式的运算,即进行矩阵的因子分解:
A=UΣVTA=U\Sigma V^TA=UΣVT
其中,UUU为m×mm\times mm×m的单位正交阵,VVV为n×nn\times nn×n的单位正交阵,即有UUT=I,VVT=IUU^T=I,VV^T=IUUT=I,VVT=I。Σ\SigmaΣ是m×nm\times nm×n维的对角矩阵其对角线上的数值即为奇异值,并且按照降序排列,如:
Σ=[σ1σ2⋱⋱]m×n\Sigma= \begin{bmatrix} \sqrt{ \sigma _1} \\ & \sqrt{\sigma _2} \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times n} Σ=⎣⎢⎢⎡σ1σ2⋱⋱⎦⎥⎥⎤m×n
UΣVTU\Sigma V^TUΣVT为矩阵AAA的奇异值分解,σi\sqrt{\sigma _i}σi为矩阵的奇异值,UUU称为左奇异矩阵,VVV称为右奇异矩阵。各矩阵的维度分别为U∈Rm×mU\in R^{m\times m}U∈Rm×m,Σ∈Rm×n\Sigma \in R^{m\times n}Σ∈Rm×n,V∈Rn×nV\in R^{n\times n}V∈Rn×n。
为求解上述UUU,Σ\SigmaΣ,VVV,我们可以利用如下性质:
AAT=UΣVT(UΣVT)T=UΣVTVΣTUT=UΣΣTUTATA=(UΣVT)TUΣVT=VΣTUTUΣVT=VΣTΣVTAA^T=U\Sigma V^T(U\Sigma V^T)^T=U\Sigma V^TV\Sigma ^TU^T=U\Sigma \Sigma^TU^T\\ A^TA=(U\Sigma V^T)^TU\Sigma V^T=V\Sigma ^TU^TU\Sigma V^T=V\Sigma ^T\Sigma V^T AAT=UΣVT(UΣVT)T=UΣVTVΣTUT=UΣΣTUTATA=(UΣVT)TUΣVT=VΣTUTUΣVT=VΣTΣVT
其中ΣΣT∈Rm×m\Sigma \Sigma^T\in R^{m\times m}ΣΣT∈Rm×m,ΣTΣ∈Rn×n\Sigma^T \Sigma \in R^{n\times n}ΣTΣ∈Rn×n,即:
ΣΣT=[σ1σ2⋱⋱]m×m\Sigma \Sigma^T= \begin{bmatrix} \sigma _1 \\ & \sigma _2 \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times m} ΣΣT=⎣⎢⎢⎡σ1σ2⋱⋱⎦⎥⎥⎤m×m
ΣTΣ=[σ1σ2⋱⋱]n×n\Sigma^T\Sigma= \begin{bmatrix} \sigma _1 \\ & \sigma _2 \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{n\times n} ΣTΣ=⎣⎢⎢⎡σ1σ2⋱⋱⎦⎥⎥⎤n×n
可以看到ΣΣT\Sigma \Sigma^TΣΣT和ΣTΣ\Sigma^T \SigmaΣTΣ的形式非常接近,进一步分析,我们可以发现AATAA^TAAT和ATAA^TAATA也是对称矩阵,那么就可以做特征值分解(EVD)。对AATAA^TAAT特征值分解,得到的特征矩阵即为UUU 。对ATAA^TAATA特征值分解,得到的特征矩阵即为VVV 。对AATAA^TAAT或ATAA^TAATA中的特征值开方,可以得到所有的奇异值。
由此可求得特征值为σ1\sqrt{ \sigma _1}σ1 、σ2\sqrt{ \sigma _2}σ2 、…、σk\sqrt{ \sigma _k}σk 。所以矩阵AAA:
A=UΣVT=[u1u2⋯um][σ1σ2⋱⋱]m×n[v1v2⋮vn]A=U\Sigma V^T= \begin{bmatrix} u_1 &u_2&\cdots&u_m\ \end{bmatrix}\begin{bmatrix} \sqrt{\sigma _1} \\ &\sqrt{ \sigma _2} \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times n} \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \\ \end{bmatrix} A=UΣVT=[u1u2⋯um ]⎣⎢⎢⎡σ1σ2⋱⋱⎦⎥⎥⎤m×n⎣⎢⎢⎢⎡v1v2⋮vn⎦⎥⎥⎥⎤
进一步化简得到
A=σ1u1v1T+σ2u2v2T+⋯+σkukvkTA=\sqrt{\sigma _1} u_1v_1^T+\sqrt{\sigma _2} u_2v_2^T+\cdots+\sqrt{\sigma _k} u_kv_k^T A=σ1u1v1T+σ2u2v2T+⋯+σkukvkT
即:
A=λ1u1v1T+λ2u2v2T+⋯+λkukvkTA=\lambda _1 u_1v_1^T+\lambda_2 u_2v_2^T+\cdots+\lambda _k u_kv_k^T A=λ1u1v1T+λ2u2v2T+⋯+λkukvkT
矩阵AAA被分解为kkk个小矩阵,每个矩阵都是λ\lambdaλ乘以uiviTu_iv_i^TuiviT。此时可以看到,若λ\lambdaλ取值较大,其对应的矩阵在矩阵AAA的占比也大,所以取以去前面主要的λ\lambdaλ来近似代表系统,近似的系统可以表示为:
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nTA_{m\times n}=U_{m\times m}\Sigma _{m\times n}V^T_{n\times n} \approx U_{m\times k}\Sigma _{k\times k}V^T_{k\times n} Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nT
二、SVD分解举例
A=[011110]A= \begin{bmatrix} 0 &1 \\ 1 & 1 \\ 1 & 0 \\ \end{bmatrix} A=⎣⎡011110⎦⎤
求解ATAA^TAATA和ATAA^TAATA:
ATA=[011110][011110]=[2112]A^TA= \begin{bmatrix} 0 &1&1 \\ 1 & 1&0 \\ \end{bmatrix} \begin{bmatrix} 0 &1 \\ 1 & 1 \\ 1 & 0 \\ \end{bmatrix}= \begin{bmatrix} 2 &1 \\ 1 & 2 \\ \end{bmatrix} ATA=[011110]⎣⎡011110⎦⎤=[2112]
AAT=[011110][011110]=[110121011]AA^T= \begin{bmatrix} 0 &1 \\ 1 & 1 \\ 1 & 0 \\ \end{bmatrix}\begin{bmatrix} 0 &1&1 \\ 1 & 1&0 \\ \end{bmatrix}= \begin{bmatrix} 1 &1&0 \\ 1 &2&1 \\ 0 &1&1 \\ \end{bmatrix} AAT=⎣⎡011110⎦⎤[011110]=⎣⎡110121011⎦⎤
进而求ATAA^TAATA的特征值和特征向量:
λ1=3;v1=[1/21/2]λ2=1;v2=[1/2−1/2]\lambda _1=3;v_1=\begin{bmatrix} 1/\sqrt 2 \\ 1/\sqrt 2 \\ \end{bmatrix}\\ \ \\ \lambda _2=1;v_2=\begin{bmatrix} 1/\sqrt 2 \\ -1/\sqrt 2 \\ \end{bmatrix} λ1=3;v1=[1/21/2] λ2=1;v2=[1/2−1/2]
ATAA^TAATA的特征值和特征向量
λ1=3;v1=[1/62/61/6]λ2=1;v2=[−1/201/2]λ3=0;v3=[1/3−1/31/3]\lambda _1=3;v_1=\begin{bmatrix} 1/\sqrt 6\\ 2/\sqrt 6 \\ 1/\sqrt 6 \\ \end{bmatrix}\\ \ \\ \lambda _2=1;v_2=\begin{bmatrix} -1/\sqrt 2 \\ 0 \\ 1/\sqrt 2 \end{bmatrix}\\ \ \\ \lambda _3=0;v_3=\begin{bmatrix} 1/\sqrt 3 \\ -1/\sqrt 3 \\ 1/\sqrt 3 \end{bmatrix} λ1=3;v1=⎣⎡1/62/61/6⎦⎤ λ2=1;v2=⎣⎡−1/201/2⎦⎤ λ3=0;v3=⎣⎡1/3−1/31/3⎦⎤
利用σi=λi\sigma _i=\sqrt {\lambda _i}σi=λi,可得奇异值为3\sqrt 33和111。最终得AAA的奇异值分解为:
A=UΣVT=[1/6−1/21/32/60−1/31/61/21/3][300100][1/21/21/2−1/2]A=U\Sigma V^T=\begin{bmatrix} 1/\sqrt 6&-1/\sqrt 2&1/\sqrt 3\\ 2/\sqrt 6&0&-1/\sqrt 3 \\ 1/\sqrt 6&1/\sqrt 2&1/\sqrt 3 \\ \end{bmatrix} \begin{bmatrix} \sqrt 3&0\\ 0&1 \\ 0&0 \\ \end{bmatrix} \begin{bmatrix} 1/\sqrt 2&1/\sqrt 2\\ 1/\sqrt 2&-1/\sqrt 2\\ \end{bmatrix} A=UΣVT=⎣⎡1/62/61/6−1/201/21/3−1/31/3⎦⎤⎣⎡300010⎦⎤[1/21/21/2−1/2]
三、用Eigen库实现SVD分解
1.C++代码
#include <iostream>
#include <Eigen/Dense>using namespace std;
using namespace Eigen;int main()
{MatrixXf m = MatrixXf::Zero(3, 2);m << 0,1,1,1,1,0;cout << "Here is the matrix m:" << endl << m << endl;JacobiSVD<MatrixXf> svd(m, ComputeFullU | ComputeFullV);cout << "Its singular values are:" << endl << svd.singularValues() << endl;cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << endl << svd.matrixU() << endl;cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << endl << svd.matrixV() << endl;system("pause");return 0;
}
2.输出结果
Here is the matrix m:
0 1
1 1
1 0
Its singular values are:
1.732051
Its left singular vectors are the columns of the thin U matrix:0.408248 -0.707107 0.577350.816496 5.96046e-08 -0.577350.408248 0.707107 0.57735
Its right singular vectors are the columns of the thin V matrix:0.707107 0.7071070.707107 -0.707107
Eigen 矩阵的SVD分解相关推荐
- 数据挖掘--矩阵的SVD分解
QR分解虽然很有用,而且具有较为稳定的性质,但也有不足之处:QR分解只能提供原矩阵A的列的一组正交基. 现在介绍的SVD分解可以分别提供对应原矩阵的行.列的正交基. 矩阵U.矩阵V的列向量都是奇异向量 ...
- 线性代数(14): 对称矩阵与矩阵的SVD分解
文章目录 1 完美的对称矩阵 2 正交对角化 3 什么是奇异值 4 奇异值的几何意义 5 矩阵的奇异值分解(SVD) 6 在numpy中使用SVD分解 参考资料 注:转载请标明原文出处链接:https ...
- 机器学习的数学基础(6):矩阵的SVD分解与最小二范数解
其实在上一篇文章中遗留了两个问题.在我们讨论最小二乘回归问题解的时候,当rank(A)<min(M,N)时,问题有二:1. 解的形式为其中为标准方程的解,在非满秩的情况下如何求得此时标准方程的一 ...
- AI 数学基础知识-方向导数与梯度、范数矩阵、SVD分解、PCA、凸函数
原课程链接 自己的课程笔记,方便自己查漏补缺.想补充数学预备知识的友友,建议去看原视频. 相比于考研数学,这里更注重理解,而不是强调计算能力. 数分 方向导数和梯度 之后学梯度下降算法需要,考研时没学 ...
- 几种矩阵分解算法: LU分解,Cholesky分解,QR分解,SVD分解,Jordan分解
目录 1.LU分解 2. LDLT分解法 3. Cholesky分解的形式 4. QR分解 5.SVD分解 5.1 SVD与广义逆矩阵 6. Jordan 分解 参考文章: ---------我只是搬 ...
- 矩阵分解 SVD分解
在认识SVD之前,先来学习两个相关的概念:正交矩阵和酉矩阵. 如果,则阶实矩阵称为正交矩阵.而酉矩阵是正交矩阵往复数域上的推广. 判断正交矩阵和酉矩阵的充分必要条件是:.或者说正交矩阵和酉矩阵的共轭转 ...
- 【机器学习中的矩阵分解】LU分解、QR分解、SVD分解
学习总结 文章目录 学习总结 一.三角分解(LU分解) 1.1 高斯消元 1.2 LU分解原理 1.3 LU分解python代码 1.4 LU分解算法 二.QR分解 2.1 Schmid 正交化 2. ...
- matlab中矩阵SVD分解
SVD分解 matlab中自带矩阵的SVD分解函数 [U,S,V] = svd(A) %返回一个与A同大小的对角矩阵S,两个酉矩阵U和V 其中,svd分解后,得到的是V的转置矩阵V'.分解后的U.S. ...
- 总结|C语言实现的矩阵运算(svd分解、乘法、转置等)
文章目录 前言 C语言实现的矩阵运算汇总 矩阵的定义 头文件:matrix_operation.h 函数实现:matrix_operation.c 对于svd分解:svdcmp.h svd分解实现: ...
最新文章
- 深入浅出理解c++虚函数
- 并发 --- 31 进程锁 守护进程 进程队列
- Transformer architecture的解释
- mysql邮箱认证_邮件服务系列postfix+sasl+mysql实现用户认证功能
- String的常用方法(java)
- php++isfile,PHP DirectoryIterator isFile()用法及代码示例
- 1124Js基础语法
- Linux下Java安装与配置
- canal与mysql高可用_canal 高可用介绍(4)
- SSE指令介绍及其C、C++应用 zz
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理...
- django实现下载功能
- ASP.net 简单注册界面
- python operator用法_说说 Python 中的 Operator 模块
- SAS PROC SQL
- 探索 ES8 Object.entries()
- C++ 使用Poco库进行文件操作
- 易经三原则:变易、简易、不易[转]
- tomcat的startup.bat启动成功了,但是页面加载不了
- pacemaker做nginx高可用
热门文章
- Shiro RememberMe 1.2.4 反序列化漏洞(SSV-92180)
- Hiho----有向图欧拉回路
- 淘淘商城第20讲——展示后台管理系统首页面
- jquery大于号的作用
- 宠物养成项目c语言文档,宠物养成游戏.doc
- Failure to open file: /home/samba/demo/untitled/Makefile Unable to generate makefile for: /home/samb
- python画卡通人物_python pyqt5 卡通人物形状窗体
- .Net Core 智能提示汉化包
- 【赞】用CSS打造的中国地图
- 联想oracle密码,联想ThinkVantage密码管理软件使用方法步骤