矩阵的奇异值分解(SVD)(理论)
矩阵的奇异值分解(Singular Value Decomposition,SVD)是数值计算中的精彩之处,在其它数学领域和机器学习领域得到了广泛的应用,如矩阵的广义逆,主分成分析(PCA),自然语言处理(NLP)中的潜在语义索引(Latent Semantic Indexing),推荐算法等。
鉴于实际应用,本次分享中的数域为实数域,即我们只在实数范围内讨论。我们假定读者具有大学线性代数的水平。那么,矩阵的奇异值分解定理如下:
(定理)(奇异值分解定理)任意一个$m \times n$矩阵A可分解为
$$A=PDQ$$
其中P是$m \times m$正交矩阵,D是$m \times n$对角阵,Q是$n \times n$正交矩阵。
证明:矩阵$A^{T}A$是$n \times n$对称矩阵,因为$(A^{T}A)^{T}=A^{T}(A^{T})^{T}=A^{T}A$.又因为
$$x^{T}(A^{T}A)x=(Ax)^{T}(Ax)\ge0,$$
所以$A^{T}A$是半正定矩阵,从而,$A^{T}A$的特征值为非负数。
假设$A^{T}A$的特征值为$\sigma_{1}^{2},\sigma_{2}^{2},...,\sigma_{n}^{2}$,其中,$\sigma_{1}^{2},\sigma_{2}^{2},...,\sigma_{r}^{2}$都是正的,$\sigma_{r+1}^{2},\sigma_{r+2}^{2},...,\sigma_{n}^{2}$都是0,$r$为$A^{T}A$的秩。设$\{u_{1},u_{2},...,u_{n}\}$为$A^{T}A$的标准正交特征向量集,则
$$A^{T}Au_{i}=\sigma_{i}^{2}u_{i} (i=1,2,...,n)$$
于是$(Au_{i})^{T}(Au_{i})=u_{i}^{T}(A^{T}A)u_{i}=u_{i}^{T}\sigma_{i}^{2}u_{i}=\sigma_{i}^{2}.$当$i\ge r+1$时,$\sigma_{i}=0$,从而$Au_{i}=0$.
用$\{u_{1}^{T},u_{2}^{T},...,u_{n}^{T}\}$作为行构成一个$n\times n$矩阵$Q$.接着,定义
$$v_{i}=\sigma_{i}^{-1}Au_{i} (1\le i \le r).$$
当$1\le i,j \le r$时,$v_{i}$构成一个标准正交系,这是因为
$$v_{i}^{T}v_{j}=\sigma_{i}^{-1}(Au_{i})^{T}\sigma_{j}^{-1}(Au_{j})=(\sigma_{i}\sigma_{j})^{-1}(u_{i}^{T}A^{T}Au_{j})=(\sigma_{i}\sigma_{j})^{-1}(u_{i}^{T}\sigma_{j}^{2}u_{j})=\delta_{ij},$$
其中$\delta_{ij}$为Kronecker符号,即当$i=j$时,$\delta=1$,当$i\neq j$时,$\delta=0$.
我们选择额外的向量$v_{i}$使得$\{v_{1},v_{2},...,v_{m}\}$为$\mathbb{R}^{m}$的标准正交基。设P是$m\times m$矩阵,其列是$v_{1},v_{2},...,v_{m}$.设D是$m\times n$对角阵,$\sigma_{1},\sigma_{2},...\sigma_{r}$在其对角线上,其余地方均为0.于是有
$$A=PDQ.$$
这是因为$(P^{T}AQ^{T})_{ij}=v_{i}^{T}Au_{j}$,当$j\ge r+1$时,该式为0,当$j\le r$时,该式为$v_{i}^{T}\sigma v_{j}=\sigma_{j}\delta_{ij}$,从而$P^{T}AQ^{T}=D$.又因$P,Q$为正交矩阵,因此$$A=PDQ.$$
证毕。
在上面证明中,我们称实数$\sigma_{1},\sigma_{2},...,\sigma_{n}$(取非负数)为矩阵A的奇异值,它们是$A^{T}A$的特征值的非负平方根。定理中的分解$A=PDQ$就是一个奇异值分解。由上面的证明,我们可以知道:矩阵的奇异值分解并不唯一,因为$\sigma_{1},\sigma_{2},...,\sigma_{n}$的次序及$v_{r+1},v_{r+2},...,v_{n}$的选择并不唯一。
在Python中的Numpy模块中,已经实现了矩阵的奇异值分解。以下为示例的应用代码:
import numpy as np
#generate a random 3*4 matrix
A = np.random.randint(5, size=(3, 4))
#parameter full_matrices: control the size of P and Q
#d returns as numpy.ndarray, not matrix
P,d,Q = np.linalg.svd(A, full_matrices=True)
print('A:',A)
print('P:',P)
#D return as diagonal 3*4 matrix
D = np.zeros(12).reshape(3,4)
for i in range(len(d)):
D[i][i] = d[i]
print('D:',D)
print('Q:',Q)
#check if P*D*Q == A
print('P*D*Q:',np.dot(P,np.dot(D,Q)))
输入结果如下:

至于如何用原始算法来实现矩阵的SVD,也是需要考虑的,有机会的话,可以交流哦~~
本次分享到此结束,欢迎大家批评与交流~~
参考文献:
- SVD 维基百科:https://en.wikipedia.org/wiki/SVD
- 数值分析 机械工业出版社 作者:萨奥尔(Timothy Sauer) 译者:裴玉茹
- numpy的svd实现函数: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html
- 奇异值分解(SVD)原理与在降维中的应用:https://www.cnblogs.com/pinard/p/6251584.html
- 奇异值分解SVD应用——LSI:http://blog.csdn.net/abcjennifer/article/details/8131087
- 论文:CALCULATING THE SINGULAR VALUES AND PSEUDO-INVERSE OF A MATRIX, G. GOLUB AND W. KAHAN, J. SIAM llrM,B. AfeArd.Ser. B, Vol. 2, No. 2, 1965
矩阵的奇异值分解(SVD)(理论)的更多相关文章
- 用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 最近在学习高动态图像(HDR)合成的算法,其中需要求解一个超定方程组,因此花了点时间研究了一下如何用 GSL 来解决这个问题. GSL 里是有最 ...
- 用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 2
接上一篇... 下面我们将 SVD 相关的功能封装成一个类,以方便我们提取 S 和 V 的值. 另外,当我们一个 A 有多组 x 需要求解时,也只需要计算一次 SVD 分解,用下面的类能减少很多计算量 ...
- 矩阵奇异值分解(SVD)及其应用
机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用(好文) [简化数据]奇异值分解(SVD) <数学之美> 第15章 矩阵运算和文本处理中的两个分类问题
- 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射
机器学习降维方法概括 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...
- 一步步教你轻松学奇异值分解SVD降维算法
一步步教你轻松学奇异值分解SVD降维算法 (白宁超 2018年10月24日09:04:56 ) 摘要:奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分 ...
- 降维之奇异值分解(SVD)
看了几篇关于奇异值分解(Singular Value Decomposition,SVD)的博客,大部分都是从坐标变换(线性变换)的角度来阐述,讲了一堆坐标变换的东西,整了一大堆图,试图“通俗易懂”地 ...
- 奇异值分解(SVD)原理与在降维中的应用
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...
- 数值分析之奇异值分解(SVD)篇
在很多线性代数问题中,如果我们首先思考若做SVD,情况将会怎样,那么问题可能会得到更好的理解[1]. --Lloyd N. ...
- 转载:奇异值分解(SVD) --- 线性变换几何意义(下)
本文转载自他人: PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理 ...
随机推荐
- JavaScript--我发现,原来你是这样的JS(再说引用类型,基本包装类型与个体内置对象)
一.介绍 本篇是续上一篇的,引用类型的后篇,本篇主要是说基本包装类型和个体内置对象.如果你能收获一些知识,那我很高兴,很满足,哈哈哈,希望大家能愉快看完.如果你想学好一门技术,要不忘初心,方得始终. ...
- 使用canvas实现环形进度条
html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- J - Scarily interesting! URAL - 2021
This year at Monsters University it is decided to arrange Scare Games. At the Games all campus gathe ...
- IdentityServer4实现Token认证登录以及权限控制
相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...
- css之定位(position)
1.什么是定位: css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设置一些不规则 ...
- Problem C: 线性表的基本操作
Description 线性表是一类重要的且基础的数据结构.请定义MyList类,来模拟针对线性表的插入.删除等操作: 1. 数据成员int *elements:线性表元素. 2. 数据成员int l ...
- 《Linux命令行与shell脚本编程大全》 第四章
4.1 监测程序 1. ps 默认只显示运行在当前控制台下的属于当前用户的进程. 可以接很多选项,比如 -A表示所有进程 -e等. 2. ps -l 查看进程更多信息 UID:启动这些进程的用 ...
- React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践
关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...
- 【机器学习实战】第15章 大数据与MapReduce
第15章 大数据与MapReduce 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力. 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则 ...
- Java8一:Lambda表达式教程
1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成 ...