奇异值分解SVD(Singular Value Decomposition)

SVD是计算时代最为重要的矩阵分解方式之一,其提供了一种数值稳定的矩阵分解结果,可用于多种应用目的并保证矩阵分解的存在性。

一、问题

高维是在处理复杂系统中的数据时经常遇到的挑战,这些系统可能涉及大型测量数据集,包括音频、图像或视频数据。数据也可以从物理系统生成,例如来自大脑的神经记录、来自仿真或实验的流体速度测量值等。

SVD提供了一种系统的方法,可以根据主导模式确定高维数据的低维近似值。SVD在数值上是稳定的,并根据由数据内主要相关性定义的新坐标系提供数据的层次表示。此外,与特征分解不同,SVD可以保证对于任何矩阵都是存在的。

二、应用

(1)降低高维数据的维数。

(2)计算非方阵的伪逆。

(3)为欠定或超定矩阵方程组Ax = b提供解。

(4)对数据集去噪。

(5)对于刻画向量空间之间的线性映射的输入和输出几何关系也很重要。

三、基础

1、拉伸

比如,此刻我们手里有一个2×3的数据矩阵D = \bigl(\begin{smallmatrix} x_{1} & x_{2} &x_{3}\\ y_{1}& y_{2} & y_{3} \end{smallmatrix}\bigr),设S = \begin{pmatrix} 2 &0 \\ 0 & 1 \end{pmatrix}(只有对角线上有元素),那么SD = \begin{pmatrix} 2 & 0\\ 0& 1 \end{pmatrix}\begin{pmatrix} x_{1} & x_{2} & x_{3}\\ y_{1}& y_{2} & y_{3} \end{pmatrix}=\begin{pmatrix} 2x_{1}& 2x_{2} &2x_{3} \\ y_{1}& y_{2} & y_{3} \end{pmatrix}

我们可以看到这个S矩阵对D数据矩阵的x轴方向做了个拉伸。

2、旋转

同样设R=\begin{pmatrix} cos(\theta ) &-sin(\theta ) \\ sin(\theta ) & cos(\theta ) \end{pmatrix},还是对2×3的数据矩阵D = \bigl(\begin{smallmatrix} x_{1} & x_{2} &x_{3}\\ y_{1}& y_{2} & y_{3} \end{smallmatrix}\bigr)左乘,那么RD=\begin{pmatrix} cos(\theta ) &-sin(\theta ) \\ sin(\theta ) & cos(\theta ) \end{pmatrix}\bigl(\begin{smallmatrix} x_{1} & x_{2} &x_{3}\\ y_{1}& y_{2} & y_{3} \end{smallmatrix}\bigr)

R的作用是对D在坐标轴上按逆时针旋转\theta角度。

四、定义

对于我们要分析的大型数据集X\in \mathbb{C}^{^{n\times m}},SVD存在唯一矩阵分解:

X=U\Sigma V^{\ast }

其中,U\in \mathbb{C}^{n\times n}V\in \mathbb{C}^{m\times m}是带有标准正交列的酉矩阵,\Sigma \in \mathbb{C}^{n\times m}是一个对角元素为非负实数、非对角元素都为零的矩阵。\ast表示复共轭转置,对实值矩阵来说,这与常规转置X^{\ast }=X^{T}相同。\Sigma \in \mathbb{C}^{n\times m}的对角线元素被称为奇异值,X矩阵的秩等于非零奇异值的个数。

由于UV是带有标准正交列的酉矩阵,结合上述基础知识,X=U\Sigma V^{\ast },对数据集X进行线性变换,分解为旋转、拉伸、旋转。其中,U代表旋转,\Sigma(对角阵)代表拉伸,V^{\ast }代表旋转。在线性变换之前我们可以找到一对基,在线性变换之后还可以找到一对垂直的基。此处V为原始数据集的标准正交基,U为经过线性变换后的标准正交基。

如何求解SVD?

X = U\Sigma V^{\ast } \\X^{\ast }X=(U\Sigma V^{\ast })^{\ast }U\Sigma V^{\ast }

X^{\ast }X=V\Sigma ^{\ast }U^{\ast }U\Sigma V^{\ast }\\\because U^{\ast } U=I 

 X^{\ast }X = V\Sigma ^{\ast }\Sigma V^{\ast }

 令L = \Sigma ^{\ast }\Sigma,其实\Sigma是一个对角阵,其转置等于它本身。如果\Sigma=\begin{bmatrix} \sigma _{1} &0 \\ 0& \sigma_{2} \end{bmatrix}是一个2×2的矩阵,则L = \Sigma ^{\ast }\Sigma=\begin{bmatrix} \sigma {_{1}}^{2} &0 \\ 0 & \sigma {_{2}}^{2} \end{bmatrix}

言归正传,

X^{\ast} X=VLV^{\ast}\\X^{\ast} XV=VL

同理,我们可以推导出

 XX^{\ast} U=UL

讨论X^{\ast} X的特征向量,我们写为以下形式

X^{\ast} XV = \lambda V

由上式,类比

X^{\ast} XV=VL

XX^{\ast} U=UL

我们可以将V看作是X^{\ast} X的特征向量,L则是X^{\ast} X的特征值对角阵,那么\SigmaX^{\ast} X的特征是开方构成的对角阵。同理,UXX^{\ast}的特征向量。

求解流程:

X = U\Sigma V^{\ast }--->

X^{\ast} X的特征向量得到V,求XX^{\ast}的特征向量得到U;--->

X^{\ast} XXX^{\ast}的特征值,然后开方得到奇异值。--->

构成对角矩阵\Sigma=\begin{bmatrix} \sigma _{1} &0 \\ 0& \sigma_{2} \end{bmatrix}(以二阶为例)

五、代码

在matlab中,SVD的计算很简单:

X = randn(5,3);
[U,S,V] = svd(X);

 对于非方阵X,经济SVD效率更高:

[Uhat,Shat,V]=svd(X,'econ');  %economy sized SVD

 在Python中

import numpy as np
X = np.random.rand(5,3)        %创建任意数据矩阵
U,S,V = np.linalg,svd(X,full_matrices = True)    %满SVD
Uhat,Shat,Vhat = np.linalg.svd(X,full_matrices = False)%经济型SVD

 在R中:

X <- replicate(3,rnoem(5))
s <- svd(X)
U <- s$u
S <- diag(s$d)
V <- s$v

  • 39
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值