SVD——奇异值分解概述

前言

奇异值分解(Singular Value Decomposition,简称 SVD)
奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要特性。
这是一个很著名的定理,广泛应用于图像压缩,矩阵填充,推荐系统和潜在语义索引(有时称为潜在语义分析)。
此文主要关注奇异值的一些特性,还会提及一些奇异值的计算以及相关的数学基础知识。之后还会涉及PCA。

特征值

特征值分解和奇异值分解两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,即提取出一个矩阵最重要的特征。因此,首先从特征值分解讲起。(此部分主要参考资料1)
如果说一个向量ν\nu是方阵A的特征向量,则一定可以表示成下面的形式:
Aν=λνA \nu =\lambda \nu
其中λ\lambda被称为特征向量ν\nu对应的特征值,一个矩阵的一组特征向量为一组正交向量。计算特征值要求矩阵为方阵

特征值分解则是将一个矩阵分解成下面的形式:
A=QQ1A =Q \sum Q^{-1}
这其中Q是这个矩阵A的特征向量组成的矩阵,\sum是一个对角矩阵,每一个对角线上的元素就是一个特征值。
一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。从几何意义上来说,特征值和特征向量代表了主要方向及其大小。举一个具体的例子来说:
在这里插入图片描述
它对应的线性变换实际为下面的形式:
在这里插入图片描述
这是因为矩阵M乘以一个向量(x,y)的结果是:
在这里插入图片描述
上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:
在这里插入图片描述
它所描述的变换是下面的样子:
在这里插入图片描述
这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。
 

奇异值分解

特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的。那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案当然是可以,我们可以使用SVD。

奇异值分解:定义

奇异值分解是一个能适用于任意矩阵的一种分解方法。假设矩阵A是一个m×\timesn的矩阵,那么我们定义矩阵A的SVD为:
A = UΣVTA \ = \ U \Sigma V^T
其中 U 是一个 m×\times m 的矩阵,U里面的向量称为左奇异向量,Σ\Sigma 是一个 m×\times n 的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V 是一个 n×\times n 的矩阵,V 里面的向量称为右奇异向量。 U 和 V 都是酉矩阵(正交矩阵),即满足UTU=IU^T U = I, VTV=IV^T V = I。下图可以很形象地看出上面SVD的定义:
在这里插入图片描述

奇异值分解:求解过程

SVD分解后的U, Σ\Sigma, V这三个矩阵的具体求解过程为:
首先,我们将A的转置和A做矩阵乘法,那么会得到 n×\times n 的矩阵的一个方阵ATAA^T A。先对ATAA^T A进行特征值分解:
ATAvi = λvi(A^T A)\vec {v_i} \ = \ \lambda \vec {v_i}
这样我们就可以得到矩阵ATAA^T A 的n个特征值和对应的n个特征向量V\vec V了。将 ATAA^T A 的所有特征向量张成一个n×n的矩阵VV,就是我们SVD公式里面的V矩阵了。一般我们将VV中的每个特征向量叫做A的右奇异向量。
证明过程为:
A = UΣVTAT=VΣUTATA=VΣUTUΣVT=VΣ2VTA \ = \ U \Sigma V^T \Rightarrow A^T =V \Sigma U^T \Rightarrow A^T A=V \Sigma U^T U \Sigma V^T =V\Sigma^2 V^T
从而可以看出ATAA^T A 的特征向量组成的的确就是我们SVD中的V矩阵。
 
同理,我们将A与A的转置做矩阵乘法,那么会得到m×m的一个方阵 AATA A^T 。对方阵AATA A^T 进行特征分解,得到的特征值和特征向量满足下式:
AATui = λui(A A^T)\vec {u_i} \ = \ \lambda \vec {u_i}
这样我们就可以得到矩阵 AATA A^T的m个特征值和对应的m个特征向量u了。将AATA A^T 的所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A的左奇异向量。
奇异值矩阵Σ\Sigma 除了对角线上是奇异值外,其它位置均为0,那我们只需要求出每个奇异值σ就可以了。具体的推导过程来说:
A=UΣVTAV=UΣVTVAV=UΣAvi=σiuiσi=Avi/uiA = U \Sigma V^T \Rightarrow AV = U\Sigma V^T V \Rightarrow AV=U \Sigma \Rightarrow Av_i = σ_i u_i \Rightarrow σ_i = Av_i/u_i
由此,我们可以求出每个奇异值,进而求出奇异值矩阵Σ\Sigma

进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
σi=λiσ_i = \sqrt{\lambda_i}
这样也就是说,我们可以不用σi=Avi/uiσ_i = Av_i/u_i 来计算奇异值,也可以通过求出ATA 的特征值取平方根来求奇异值。
 

SVD的几何性质

奇异值的特点是衰减特别快,也就是说仅仅有前几个奇异值特别大,后面的值都很小。在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。
也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
Am×n=Um×mΣm×nVn×nTUm×kΣk×kVk×nTA_{m \times n} = U_{m \times m} \Sigma_{m \times n} V_{n \times n} ^T\approx U_{m \times k} \Sigma_{k \times k} V_{k \times n}^T
其中k比n小很多。
因此,奇异值分解可以把一个大矩阵,分解成三个小矩阵相乘。如下图所示,现在我们的矩阵A只需要灰色的部分的三个小矩阵就可以近似描述了。
在这里插入图片描述
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。

特征值分解和SVD的区别:几何意义

正如之前提到的,矩阵可以认为是一种线性变换,而且这种线性变换的作用效果与基的选择有关。
一个线性变换的作用可以包含旋转、缩放和投影三种类型的效应。奇异值分解正是对线性变换这三种效应的一个析构。
A = UΣVTA \ = \ U \Sigma V^T,其中,UUVV是两组正交单位向量,Σ\Sigma是对角阵,表示奇异值, 它表示我们找到了UUVV这样两组基,A矩阵的作用是将一个向量从VV这组正交基向量的空间旋转到UU这组正交基向量空间,并对每个方向进行了一定的缩放,缩放因子就是各个奇异值。如果维度比大,则表示还进行了投影。可以说奇异值分解将一个矩阵原本混合在一起的三种作用效果,分解出来了。
而特征值分解其实是对旋转缩放两种效应的归并。特征值,特征向量由Ax=λ\lambdax得到,它表示如果一个向量v处于A的特征向量方向,那么Av对v的线性变换作用只是一个缩放。也就是说,求特征向量和特征值的过程,我们找到了这样一组基,在这组基下,矩阵的作用效果仅仅是存粹的缩放。对于实对称矩阵,特征向量正交,我们可以将特征向量式子写成A=xλ\lambdaxTx^T,这样就和奇异值分解类似了,就是A矩阵将一个向量从x这组基的空间旋转到x这组基的空间,并在每个方向进行了缩放,由于前后都是x,就是没有旋转或者理解为旋转了0度。
总结来说,特征值分解和奇异值分解都是给一个矩阵(线性变换)找一组特殊的基,特征值分解找到了特征向量这组基,在这组基下该线性变换只有缩放效果。而奇异值分解则是找到另一组基,这组基下线性变换的旋转、缩放、投影三种功能独立地展示出来了。

参考资料

奇异值分解(SVD)详解及其应用
特征值分解和奇异值分解的区别
知乎专栏——奇异值分解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章