继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【机器学习】降维——SVD原理以及示例

Peak_One
关注TA
已关注
手记 25
粉丝 7094
获赞 169

SVD算法

奇异值分解(Singular Value Decompositionm,简称SVD)是在机器学习领域应用较为广泛的算法之一,也是学习机器学习算法绕不开的基石之一。SVD算法主要用在降维算法中的特征分解推荐系统自然语言处理计算机视觉等领域。奇异值分解(SVD)通俗一点讲就是将一个线性变换分解为两个线性变换,一个线性变换代表旋转,一个线性变换代表拉伸。

注:SVD是将一个矩阵分解成两个正交矩阵和一个对角矩阵,我们知道正交矩阵对应的变换是旋转变换,对角矩阵对应的变换是伸缩变换。

1.矩阵相关概念

上一篇:降维——PCA降维及原理推导详细介绍了PCA算法,其中核心思想就是矩阵中的特征值和特征向量,为了后续内容的进行,在此,对此部分内容进一步做详细介绍。

1.1特征值和特征向量

关于特征值和特征向量的定义如下:
Ax=λxAx=\lambda x其中ARn×nA\in R^{n \times n}的一个矩阵,xx是一个nn维向量,即xRnx \in R^n,如果上式成立,我们则称λ\lambda为矩阵AA的特征值,称xxλ\lambda所对应的特征向量。

1.2特征分解

如果我们求出了矩阵AAnn个特征值λ1λ2λnλ_1≤λ_2≤\cdots≤λ_n,以及这nn个特征值所对应的特征向量{w1,w2,,wn}\{w_1,w_2,\cdots,w_n\},如果这nn个特征向量线性无关,那么矩阵AA就可以用下式的特征分解表示:
A=WΣW1A=W\Sigma W^{-1}其中W=(w1,w2,,wn)W=(w_1,w_2,\cdots,w_n)Σ\Sigma为:
Σ=(λ1λ2λn)\Sigma=\begin{pmatrix}\lambda_1&\\ &\lambda_2\\ &&\cdots\\ &&&\lambda_n \end{pmatrix}一般我们会把WW的这nn个特征向量标准化,即满足wi2=1||w_i||_2=1,或者说wiTwi=1w_i^Tw_i =1,此时WWnn个特征向量为标准正交基,且满足WTW=IW^TW=I,即WT=W1W^T=W^{-1},此时我们称WW为酉矩阵。
故,此时我们的特征分解表达式可以写成
A=WΣWTA=W \Sigma W^T但是有一个局限,进行特征分解的矩阵必须是方阵,但是我们拿到的数据往往都不是方阵的形式,所以对于n×mn\times m的矩阵,如何进行特征分解?对于这个问题,SVD算法应运而生。

2.特征分解的几何意义。

首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:
M=[3001]M=\begin{bmatrix} 3&0\\ 0&1\\ \end{bmatrix}
它其实对应的线性变换是下面的形式:
图片描述
因为这个矩阵MM乘以一个向量(x,y)(x,y)的结果是:
[3001][xy]=[3xy]\begin{bmatrix} 3&0\\ 0&1 \end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}3x\\y\end{bmatrix}
上面的矩阵是对称的,所以这个变换是一个对xxyy轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:
M=[1101]M=\begin{bmatrix} 1&1 \\ 0&1 \end{bmatrix}
它所描述的变换是下面的样子:
图片描述
这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个)。如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵

3.奇异值分解

正如上文所示,特征分解只适用于方阵的情况,但是对于不是方阵的矩阵,我们需要用SVD算法进行特征分解。假设我们定义矩阵AA的SVD为:
A=UΣVTA = U\Sigma V^T其中UU是一个m×mm \times m的矩阵,Σ\Sigma是一个m×nm\times n的矩阵,除了主对角线上的元素以外,其余的元素均为零。其中主对角线上每个元素都称为奇异值,VV是一个n×nn\times n的矩阵。UUVV都是酉矩阵,即满足UTU=I,VTV=IU^TU=I,V^TV=I。如下图所示,其中rr为矩阵AA的秩。
图片描述
转换成数学公式就是:
A=(U1 U2)U (Σ10r×(nr)0(mn)×r0(mr)×(nr))Σ (V1TV2T)VT=UΣVT=U1Σ1V1T=Σi=1rσiuiViT\begin{aligned}A&=\underbrace{(U_1\ U_2)}_{U}\ \underbrace{\begin{pmatrix}\Sigma_1&0_{r\times(n-r)}\\ 0_{(m-n)\times r}&0_{(m-r)\times(n-r)} \end{pmatrix}}_{\Sigma}\ \underbrace{\begin{pmatrix}V_1^T\\V_2^T\end{pmatrix}}_{V^T}\\ &=U\Sigma V^T\\ &=U_1\Sigma_1V_1^T\\ &=\Sigma_{i=1}^r\sigma_iu_iV_i^T \end{aligned}
那么如何求出SVD分解后的U,Σ,VU,\Sigma,V这三个矩阵呢?
我们将奇异值和特征值联系起来。首先,我们用矩阵A的转置乘以A,得到一个方阵,用这样的方阵进行特征分解,得到的特征值和特征向量满足下面的等式:
(ATA)vi=λivi(A^TA)v_i=\lambda_iv_i
此时我们可以得到矩阵ATARn×nA^TA \in R^{n \times n}nn个特征值和对应的nn个特征向量viv_i(右奇异向量)。而将所有的特征向量按行排列,就构成了SVD公式中的V矩阵了。
其次,我们求AATRm×mAA^T \in R^{m\times m}的矩阵的特征分解,我们得到以下公式:
(AAT)ui=λ1ui(AA^T)u_i=\lambda_1u_i
这样我们就可以得到矩阵AATAA^Tmm个特征值和对应的mm个特征向量uiu_i(左奇异向量)了。将AATAA^T的所有特征向量按列排列就构成了m×mm\times m的矩阵UU,就是我们SVD公式里面的UU矩阵了。

证明:为什么ATAA^TA的特征向量就构成了右奇异向量?为什么AATAA^T中的特征向量就构成了左奇异向量?以右奇异向量为例:
A=UΣVTAT=VΣTUTA=U\Sigma V^T\qquad\qquad\qquad A^T=V\Sigma^TU^T
ATA=VΣTUTUΣVT=VΣ2VT(1)A^TA=V\Sigma^TU^TU\Sigma V^T=V\Sigma^2V^T \qquad\qquad \cdots(1)
其中由于U为正交向量,所以UTU=I,ΣTΣ=Σ2U^TU=I,\Sigma^T\Sigma=\Sigma^2,故可以结论得证。

得到奇异向量以后,我们接着求奇异值,求奇异值的方法有两种:
补充:UMn(R)U \in M_n(R)满足UTU=IU^TU=I,则UU是实正交矩阵。

  • 第一种
    A=UΣVTAV=UΣVTVAV=UΣAvi=σiuiA=U\Sigma V^T \Rightarrow AV=U\Sigma V^TV \Rightarrow AV=U\Sigma \Rightarrow Av_i=\sigma_iu_i
    进而可得:σi=Aviui\sigma_i=\frac{Av_i}{u_i}
  • 第二种
    通过(1)式的证明,我们可以很容易的得到ATAA^TAAATAA^T的特征值等于对应奇异值的平方。即:
    σi=λi\sigma_i=\sqrt{\lambda_i}
    这里的σi\sigma_i就是奇异值,奇异值σi\sigma_i跟特征值类似,在矩阵Σ\Sigma中也是从大到小排列。

4.SVD算法示例

假定矩阵AA如下:
A=(011110)\mathbf{A} = \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1& 0 \end{array} \right)
根据上面的计算步骤,我们首先构造出ATAA^TAAATAA^T:
ATA=(011110)(011110)=(2112)\mathbf{A^TA} = \left( \begin{array}{ccc} 0& 1 &1\\ 1&1& 0 \end{array} \right) \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1& 0 \end{array} \right) = \left( \begin{array}{ccc} 2& 1 \\ 1& 2 \end{array} \right)
AAT=(011110)(011110)=(110121011)\mathbf{AA^T} = \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1& 0 \end{array} \right) \left( \begin{array}{ccc} 0& 1 &1\\ 1&1& 0 \end{array} \right) = \left( \begin{array}{ccc} 1& 1 & 0\\ 1& 2 & 1\\ 0& 1& 1 \end{array} \right)
ATAA^TA进行特征分解,如下:
λ1=3;v1=(1/21/2);λ2=1;v2=(1/21/2)\lambda_1= 3; v_1 = \left( \begin{array}{ccc} 1/\sqrt{2} \\ 1/\sqrt{2} \end{array} \right); \lambda_2= 1; v_2 = \left( \begin{array}{ccc} -1/\sqrt{2} \\ 1/\sqrt{2} \end{array} \right)
AATAA^T进行特征分解,如下:
λ1=3;u1=(1/62/61/6);λ2=1;u2=(1/201/2);λ3=0;u3=(1/31/31/3)\lambda_1= 3; u_1 = \left( \begin{array}{ccc} 1/\sqrt{6} \\ 2/\sqrt{6} \\ 1/\sqrt{6} \end{array} \right); \lambda_2= 1; u_2 = \left( \begin{array}{ccc} 1/\sqrt{2} \\ 0 \\ -1/\sqrt{2} \end{array} \right); \lambda_3= 0; u_3 = \left( \begin{array}{ccc} 1/\sqrt{3} \\ -1/\sqrt{3} \\ 1/\sqrt{3} \end{array} \right)
利用第一种方法求解,即Avi=σiui,i=1,2Av_i=\sigma_i u_i,i=1,2求奇异值。
(011110)(1/21/2)=σ1(1/62/61/6)σ1=3\left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1& 0 \end{array} \right) \left( \begin{array}{ccc} 1/\sqrt{2} \\ 1/\sqrt{2} \end{array} \right) = \sigma_1 \left( \begin{array}{ccc} 1/\sqrt{6} \\ 2/\sqrt{6} \\ 1/\sqrt{6} \end{array} \right) \Rightarrow \sigma_1=\sqrt{3}
(011110)(1/21/2)=σ2(1/201/2)σ2=1\left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1& 0 \end{array} \right) \left( \begin{array}{ccc} -1/\sqrt{2} \\ 1/\sqrt{2} \end{array} \right) = \sigma_2 \left( \begin{array}{ccc} 1/\sqrt{2} \\ 0 \\ -1/\sqrt{2} \end{array} \right) \Rightarrow \sigma_2=1
故最终的奇异值分解结果如下:
A=UΣVT=(1/61/21/32/601/31/61/21/3)(300100)(1/21/21/21/2)A=U\Sigma V^T = \left( \begin{array}{ccc} 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{array} \right) \left( \begin{array}{ccc} \sqrt{3} & 0 \\ 0 & 1\\ 0 & 0 \end{array} \right) \left( \begin{array}{ccc} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{array} \right)

5.奇异值分解特性

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的kk个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:
Am×n=Um×mΣm×nVn×nTUm×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}
其中kk要比nn小很多,也就是一个大的矩阵AA可以用三个小的矩阵
Um×k,Σk×k,Vk×nTU_{m \times k},\Sigma_{k \times k} ,V^T_{k \times n}
正是由于这个性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。
补充:SVD用于PCA的案例参考:奇异值分解(SVD)原理与在降维中的应用

参考文献

打开App,阅读手记
10人推荐
发表评论
随时随地看视频慕课网APP