zoukankan      html  css  js  c++  java
  • svd分解的深入理解

    svd指的是奇异值分解,也就是对奇异矩阵的分解,对于可逆矩阵,可以进行特征值分解。

    要想理解svd,需要先理解四个基本子空间,即行空间,列空间,零空间,左零空间。对于矩阵A,其行空间是由行向量线性组合而成的空间,也即由行向量张成的空间,同样的,列空间是由矩阵的列向量线性组合生成的空间。而零空间是Ax=0的解空间,Ax可以看成是矩阵A的所有的行向量分别和x做内积,而生成的向量是零向量,所以每一个行向量都和x是正交的,所以x所在的空间与行空间是正交的,也就是零空间与行空间正交。当零空间不为空时,也就是Ax=0中的x可以取到不为0的解时,表明A的各个列向量之间线性相关。

    svd就是在矩阵A的行空间中寻找相互正交的行向量,然后经过矩阵A变换到列空间之后,生成的列向量同样是相互正交的。

    对于$A=U Sigma V^T$,当矩阵A的秩小于列数时,V中的各个列向量不仅有来自于A的行空间的,也有来自于A的零空间中的,此时来自于行空间的向量一定和来自于零空间中的向量正交,因为行空间本身就和零空间正交,当A对零空间中的向量做变换后,生成的只有零向量,所以来自于零空间的向量并没有起到作用,当列满秩,行不满秩时,此时列向量线性无关,在零空间中只有零向量,所以V中的列向量都来自于行空间,而且经过矩阵A变换之后生成的向量必然在A的列空间中,因为相当于是将A的列向量做了线性组合,所以生成的向量必然在A的列空间中。

    好了,假设在矩阵A(m*n)的秩是k,那么在行空间中可以找到k个相互正交的向量,在零空间中可以找到 n-k 个相互正交的向量,即:

    $$V=[v_1 v_2 ... v_k | v_{k+1} ... v_n]$$

    对于行空间中的k个向量,经过A变换之后,生成了k个列向量,而且这k个列向量必然在A的列空间中,对于后面 n-k 个零空间中的向量,经过A变换之后都变成了零向量,消失不见了,所以只需要关心行空间中前k个向量即可。对于其中第i个向量$v_i$,有$Av_i=sigma_i u_i$,$Av_j=sigma_j u_j$,其中$u_i$,$u_j$是变换之后的向量,都在A的列空间中,且相互正交,即:

    $$egin{align*}(Av_i)^TAv_j=0 \ {v_i}^TA^TAv_j=0 end{align*}$$

    其中,$A^TA$是对称矩阵,其特征向量相互正交,所以只需要取$A^TAv_j=lambda_j v_j, A^TAv_i=lambda_i v_i$,则${v_i}^TA^TAv_j={v_i}^Tlambda_j v_j=0$

    利用这个条件,可以求出$v_i$,$v_j$都是$A^TA$的特征向量,$lambda_i, lambda_j$是其特征值,同样的,可以得到$u_i$,$u_j$是$AA^T$的特征向量。

    svd可以用来求解广义逆矩阵,要解广义逆矩阵,要知道什么是左逆矩阵和右逆矩阵。若矩阵A是列满秩的,那么列向量都是线性无关的,列向量线性组合成零向量的组合系数必须全部为0,也即零空间中只有零向量,此时若矩阵A行不满秩,则$AA^T$是一个奇异矩阵,而$A^TA$是可逆矩阵,其逆矩阵为$(A^TA)^{-1}$,所以$(A^TA)^{-1}A^TA=I$,$(A^TA)^{-1}A^T$就是A的左逆矩阵,因为在A左边。同样的,当矩阵A是行满秩的时候,$AA^T$是可逆矩阵,所以$AA^T(AA^T)^{-1}=I$,$A^T(AA^T)^{-1}$就是A的右逆矩阵。那么当矩阵A既不是列满秩又不是行满秩时,显然此时不管是$A^TA$还是$AA^T$都是奇异矩阵,所以不存在左逆或者右逆,但是此时将行空间中的向量x做Ax变换后成为列空间中的向量b=Ax,将行空间中另一向量y做Ay变换后成为列空间中的向量c=Ay,若$x e y$,则$Ax e Ay$(可以用反证法证明),说明x与Ax是一一对应的,也就是说存在某种可逆变换,可以将b再变回成x,将c再变回成y。但是若x在零空间中,那么做Ax变换之后得到Ax=0,就像扔进黑洞一样了,是无法将零向量再还原成x的。所以当行列都不满秩时,只能将行空间中的向量还原,而对于零空间中的向量无能为力,若行不满秩列满秩时,零空间中一无所有,矩阵的秩等于列数n,所有的n维向量都在行空间中,所以存在左逆矩阵可将Ax还原回去,同样右逆矩阵也可如是理解。

    当行列都不满秩时,既然可以将行空间中的向量经过Ax变换之后再还原回来,那么就存在一个可逆变换$A^+$,使得$A^+Ax=x$,之所以用加号,是因为只有当x在A的行空间中时才成立,若x在A的零空间中时则无能为力了,因为此时Ax=0。好了,如何来求$A^+$呢?此时便可利用svd了,将矩阵A写成$A=U Sigma V^T$,其中V的各个列向量不仅来自A的行空间,还可能来自A的零空间,若行空间的秩为r,矩阵A是m行n列的,那么每个行向量的维度是n维,V中有r个列向量来自A的行空间,有n-r个列向量来自A的零空间,U中有r个列向量来自A的列空间,有m-r个列向量来自A的左零空间,而$Sigma$中只有对角线上前r个奇异值是非零的,其余部分都是0,$U Sigma$将U中来自A的左零空间的m-r个列向量变成了0,之后再乘以$V^T$,又将V中来自A的零空间中的n-r个列向量变成了0,最后生成的矩阵是由秩为r的满秩矩阵和m-r行0与n-r列0补足的矩阵,因此A可由此分解为一个满秩矩阵。那么$A^+=(U Sigma V^T)^+=V Sigma^+ U^T$,其中$Sigma Sigma^+=I$


    去吧,去吧,到彼岸去吧,彼岸是光明的世界!
  • 相关阅读:
    两个服务器上SQLServer实例之间配置Service Broker示例
    处理数据库镜像问题的一个案例
    oracel修改密码
    Oracle报错
    如何创建ORACLE大文件表空间
    创建、删除表空间
    oracle中新建用户和赋予权限
    非常全的VsCode快捷键
    VS Code常用快捷键
    启动Weblogic问题集锦
  • 原文地址:https://www.cnblogs.com/lengyue365/p/7471608.html
Copyright © 2011-2022 走看看