矩阵的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=[u1​​u2​​⋯​um​ ​]⎣⎢⎢⎡​σ1​​​σ2​​​⋱​⋱​⎦⎥⎥⎤​m×n​⎣⎢⎢⎢⎡​v1​v2​⋮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=σ1​​u1​v1T​+σ2​​u2​v2T​+⋯+σk​​uk​vkT​
即:
A=λ1u1v1T+λ2u2v2T+⋯+λkukvkTA=\lambda _1 u_1v_1^T+\lambda_2 u_2v_2^T+\cdots+\lambda _k u_kv_k^T A=λ1​u1​v1T​+λ2​u2​v2T​+⋯+λk​uk​vkT​
矩阵AAA被分解为kkk个小矩阵,每个矩阵都是λ\lambdaλ乘以uiviTu_iv_i^Tui​viT​。此时可以看到,若λ\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×n​Vn×nT​≈Um×k​Σk×k​Vk×nT​

二、SVD分解举例

A=[011110]A= \begin{bmatrix} 0 &1 \\ 1 & 1 \\ 1 & 0 \\ \end{bmatrix} A=⎣⎡​011​110​⎦⎤​
求解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=[01​11​10​]⎣⎡​011​110​⎦⎤​=[21​12​]

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=⎣⎡​011​110​⎦⎤​[01​11​10​]=⎣⎡​110​121​011​⎦⎤​
进而求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/2​1/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/6​2/6​1/6​​⎦⎤​ λ2​=1;v2​=⎣⎡​−1/2​01/2​​⎦⎤​ λ3​=0;v3​=⎣⎡​1/3​−1/3​1/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/6​2/6​1/6​​−1/2​01/2​​1/3​−1/3​1/3​​⎦⎤​⎣⎡​3​00​010​⎦⎤​[1/2​1/2​​1/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分解相关推荐

  1. 数据挖掘--矩阵的SVD分解

    QR分解虽然很有用,而且具有较为稳定的性质,但也有不足之处:QR分解只能提供原矩阵A的列的一组正交基. 现在介绍的SVD分解可以分别提供对应原矩阵的行.列的正交基. 矩阵U.矩阵V的列向量都是奇异向量 ...

  2. 线性代数(14): 对称矩阵与矩阵的SVD分解

    文章目录 1 完美的对称矩阵 2 正交对角化 3 什么是奇异值 4 奇异值的几何意义 5 矩阵的奇异值分解(SVD) 6 在numpy中使用SVD分解 参考资料 注:转载请标明原文出处链接:https ...

  3. 机器学习的数学基础(6):矩阵的SVD分解与最小二范数解

    其实在上一篇文章中遗留了两个问题.在我们讨论最小二乘回归问题解的时候,当rank(A)<min(M,N)时,问题有二:1. 解的形式为其中为标准方程的解,在非满秩的情况下如何求得此时标准方程的一 ...

  4. AI 数学基础知识-方向导数与梯度、范数矩阵、SVD分解、PCA、凸函数

    原课程链接 自己的课程笔记,方便自己查漏补缺.想补充数学预备知识的友友,建议去看原视频. 相比于考研数学,这里更注重理解,而不是强调计算能力. 数分 方向导数和梯度 之后学梯度下降算法需要,考研时没学 ...

  5. 几种矩阵分解算法: LU分解,Cholesky分解,QR分解,SVD分解,Jordan分解

    目录 1.LU分解 2. LDLT分解法 3. Cholesky分解的形式 4. QR分解 5.SVD分解 5.1 SVD与广义逆矩阵 6. Jordan 分解 参考文章: ---------我只是搬 ...

  6. 矩阵分解 SVD分解

    在认识SVD之前,先来学习两个相关的概念:正交矩阵和酉矩阵. 如果,则阶实矩阵称为正交矩阵.而酉矩阵是正交矩阵往复数域上的推广. 判断正交矩阵和酉矩阵的充分必要条件是:.或者说正交矩阵和酉矩阵的共轭转 ...

  7. 【机器学习中的矩阵分解】LU分解、QR分解、SVD分解

    学习总结 文章目录 学习总结 一.三角分解(LU分解) 1.1 高斯消元 1.2 LU分解原理 1.3 LU分解python代码 1.4 LU分解算法 二.QR分解 2.1 Schmid 正交化 2. ...

  8. matlab中矩阵SVD分解

    SVD分解 matlab中自带矩阵的SVD分解函数 [U,S,V] = svd(A) %返回一个与A同大小的对角矩阵S,两个酉矩阵U和V 其中,svd分解后,得到的是V的转置矩阵V'.分解后的U.S. ...

  9. 总结|C语言实现的矩阵运算(svd分解、乘法、转置等)

    文章目录 前言 C语言实现的矩阵运算汇总 矩阵的定义 头文件:matrix_operation.h 函数实现:matrix_operation.c 对于svd分解:svdcmp.h svd分解实现: ...

最新文章

  1. 深入浅出理解c++虚函数
  2. 并发 --- 31 进程锁 守护进程 进程队列
  3. Transformer architecture的解释
  4. mysql邮箱认证_邮件服务系列postfix+sasl+mysql实现用户认证功能
  5. String的常用方法(java)
  6. php++isfile,PHP DirectoryIterator isFile()用法及代码示例
  7. 1124Js基础语法
  8. Linux下Java安装与配置
  9. canal与mysql高可用_canal 高可用介绍(4)
  10. SSE指令介绍及其C、C++应用 zz
  11. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理...
  12. django实现下载功能
  13. ASP.net 简单注册界面
  14. python operator用法_说说 Python 中的 Operator 模块
  15. SAS PROC SQL
  16. 探索 ES8 Object.entries()
  17. C++ 使用Poco库进行文件操作
  18. 易经三原则:变易、简易、不易[转]
  19. tomcat的startup.bat启动成功了,但是页面加载不了
  20. pacemaker做nginx高可用

热门文章

  1. Shiro RememberMe 1.2.4 反序列化漏洞(SSV-92180)
  2. Hiho----有向图欧拉回路
  3. 淘淘商城第20讲——展示后台管理系统首页面
  4. jquery大于号的作用
  5. 宠物养成项目c语言文档,宠物养成游戏.doc
  6. Failure to open file: /home/samba/demo/untitled/Makefile Unable to generate makefile for: /home/samb
  7. python画卡通人物_python pyqt5 卡通人物形状窗体
  8. .Net Core 智能提示汉化包
  9. 【赞】用CSS打造的中国地图
  10. 联想oracle密码,联想ThinkVantage密码管理软件使用方法步骤