zoukankan      html  css  js  c++  java
  • 『科学计算_理论』SVD奇异值分解

     转载请声明出处

    SVD奇异值分解概述

    SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如前面讲的PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪,将它应用于推荐系统的是Netflix大奖的获得者Koren,可以在Google上找到他写的文章;用SVD可以很容易得到任意矩阵的满秩分解,用满秩分解可以对数据做压缩。可以用SVD来证明对任意M*N的矩阵均存在如下分解:


    这个可以应用在数据降维压缩上!在数据相关性特别大的情况下存储X和Y矩阵比存储A矩阵占用空间更小!

       在开始讲解SVD之前,先补充一点矩阵代数的相关知识。

    正交矩阵

       正交矩阵是在欧几里得空间里的叫法,在酉空间里叫酉矩阵,一个正交矩阵对应的变换叫正交变换,这个变换的特点是不改变向量的尺寸和向量间的夹角,那么它到底是个什么样的变换呢?看下面这张图


    假设二维空间中的一个向量OA,它在标准坐标系也即e1、e2表示的坐标是中表示为(a,b)'(用'表示转置),现在把它用另一组坐标e1'、e2'表示为(a',b')',存在矩阵U使得(a',b')'=U(a,b)',则U即为正交矩阵。从图中可以看到,正交变换只是将变换向量用另一组正交基表示,在这个过程中并没有对向量做拉伸,也不改变向量的空间位置,加入对两个向量同时做正交变换,那么变换前后这两个向量的夹角显然不会改变。上面的例子只是正交变换的一个方面,即旋转变换,可以把e1'、e2'坐标系看做是e1、e2坐标系经过旋转某个角度得到,简单的几何学推导可得旋转矩阵:

                                         

    正交阵U行(列)向量之间都是单位正交向量。上面求得的是一个旋转矩阵,它对向量做旋转变换!也许你会有疑问:刚才不是说向量空间位置不变吗?怎么现在又说它被旋转了?对的,这两个并没有冲突,说空间位置不变是绝对的,但是坐标是相对的,加入你站在e1上看OA,随着e1旋转到e1',看OA的位置就会改变。如下图:


    如图,如果我选择了e1'、e2'作为新的标准坐标系,那么在新坐标系中OA(原标准坐标系的表示)就变成了OA',这样看来就好像坐标系不动,把OA往顺时针方向旋转了,这个操作实现起来很简单:将变换后的向量坐标仍然表示在当前坐标系中。

    旋转变换是正交变换的一个方面,这个挺有用的,比如在开发中需要实现某种旋转效果,直接可以用旋转变换实现。正交变换的另一个方面是反射变换,也即e1'的方向与图中方向相反,这个不再讨论。

    总结:正交矩阵的行(列)向量都是两两正交的单位向量,正交矩阵对应的变换为正交变换,它有两种表现:旋转和反射。正交矩阵将标准正交基映射为标准正交基(即图中从e1、e2到e1'、e2')

    特征值分解——EVD

        在讨论SVD之前先讨论矩阵的特征值分解(EVD),在这里,选择一种特殊的矩阵——对称阵(酉空间中叫hermite矩阵即厄米阵)。

     对称阵有一个很优美的性质:

    它总能相似对角化,对称阵不同特征值对应的特征向量两两正交。

     一个矩阵能相似对角化即说明其特征子空间即为其列空间,若不能对角化则其特征子空间为列空间的子空间。现在假设存在mxm的满秩对称矩阵A,它有m个不同的特征值,设特征值为

    对应的单位特征向量为

    则有

                                                                     

    进而

                                                                   

                                                      

                                                        

    所以可得到A的特征值分解(由于对称阵特征向量两两正交,所以U为正交阵,正交阵的逆矩阵等于其转置

                                                            

    这里假设A有m个不同的特征值,实际上,只要A是对称阵其均有如上分解。

    矩阵A分解了,相应的,其对应的映射也分解为三个映射。现在假设有x向量,用A将其变换到A的列空间中,那么首先由U'先对x做变换:

                                                                                  

    U是正交阵U'也是正交阵,所以U'对x的变换是正交变换,它将x用新的坐标系来表示,这个坐标系就是A的所有正交的特征向量构成的坐标系。比如将x用A的所有特征向量表示为:

                                             

    则通过第一个变换就可以把x表示为[a1 a2 ... am]':

                               

    紧接着,在新的坐标系表示下,由中间那个对角矩阵对新的向量坐标换,其结果就是将向量往各个轴方向拉伸或压缩:

                                  

    从上图可以看到,如果A不是满秩的话,那么就是说对角阵的对角线上元素存在0,这时候就会导致维度退化,这样就会使映射后的向量落入m维空间的子空间中。

    最后一个变换就是U对拉伸或压缩后的向量做变换,由于U和U'是互为逆矩阵,所以U变换是U'变换的逆变换。

    因此,从对称阵的分解对应的映射分解来分析一个矩阵的变换特点是非常直观的。假设对称阵特征值全为1那么显然它就是单位阵,如果对称阵的特征值有个别是0其他全是1,那么它就是一个正交投影矩阵,它将m维向量投影到它的列空间中(列反映了特征向量,进而反映了特征空间的维度)。

    根据对称阵A的特征向量,如果A是2*2的,那么就可以在二维平面中找到这样一个矩形,是的这个矩形经过A变换后还是矩形:

                                          

    这个矩形的选择就是让其边都落在A的特征向量方向上,如果选择其他矩形的话变换后的图形就不是矩形了!联系之前的PCA主成分分析,求协方差矩阵的原因之一也应该就是利用协方差矩阵的对称性进行特征值分解。

    奇异值分解——SVD

       上面的特征值分解的A矩阵是对称阵,根据EVD可以找到一个(超)矩形使得变换后还是(超)矩形,也即A可以将一组正交基映射到另一组正交基!那么现在来分析:对任意M*N的矩阵,能否找到一组正交基使得经过它变换后还是正交基?答案是肯定的,它就是SVD分解的精髓所在。

       现在假设存在M*N矩阵A,事实上,A矩阵将n维空间中的向量映射到k(k<=m)维空间中,k=Rank(A)。现在的目标就是:在n维空间中找一组正交基,使得经过A变换后还是正交的。假设已经找到这样一组正交基:

                                                                   

    则A矩阵将这组基映射为:

                                                                

    如果要使他们两两正交,即

                                          

    根据假设,存在

                                          

    所以如果正交基v选择为A'A的特征向量的话,由于A'A是对称阵,v之间两两正交,那么

                                                      

    这样就找到了正交基使其映射后还是正交基了,现在,将映射后的正交基单位化:

    因为

                      

    所以有

                                    

    所以取单位向量

                                            

    由此可得

                    

    当k < i <= m时,对u1,u2,...,uk进行扩展u(k+1),...,um,使得u1,u2,...,um为m维空间中的一组正交基,即


    同样的,对v1,v2,...,vk进行扩展v(k+1),...,vn(这n-k个向量存在于A的零空间中,即Ax=0的解空间的基),使得v1,v2,...,vn为n维空间中的一组正交基,即


    则可得到


    继而可以得到A矩阵的奇异值分解:

                                                     

                    

    现在可以来对A矩阵的映射过程进行分析了:如果在n维空间中找到一个(超)矩形,其边都落在A'A的特征向量的方向上,那么经过A变换后的形状仍然为(超)矩形!

    vi为A'A的特征向量,称为A的右奇异向量,ui=Avi实际上为AA'的特征向量,称为A的左奇异向量。

    文首满秩分解证明

    下面利用SVD证明文章一开始的满秩分解:


    利用矩阵分块乘法展开得:


    可以看到第二项为0,有

                                   


               

    则A=XY即是A的满秩分解。

    整个SVD的推导过程就是这样。

    python实现

    import numpy as np
    from matplotlib import pyplot as plt
    
    A=np.array([[-0.2,-1],[1.1,0.5]])
    U,s,V=np.linalg.svd(A)
    
    # S=np.array([[s[0],0],[0,s[1]]])
    # modified by conkang
    S=np.diag(s)
    
    fig = plt.figure()
    ax0 = fig.add_subplot(221)
    ax1 = fig.add_subplot(222)
    ax2 = fig.add_subplot(223)
    ax3 = fig.add_subplot(224)
    
    def plot_2D_mat(M,ax,text=""):
        ax.plot([0,M[0,0]],[0,M[1,0]],'b-o')
        ax.plot([0,M[0,1]],[0,M[1,1]],'r-o')
        ax.set_title(text)
        ax.axis('equal')
        ax.set_xlim([-1.5,1.5])
        ax.set_ylim([-1.5,1.5])
        ax.grid(True)
        
    
    plot_2D_mat(np.eye(2),ax0,"origin")
    plot_2D_mat(A,ax1,"A (USV) Matrix")
    plot_2D_mat(V.T,ax2,"V Matrix")
    plot_2D_mat(S.dot(V.T),ax3,"SV Matrix")
    
    plt.show()
    

    图展示了SVD分解后各个矩阵的几何意义,左上是向量,右上是A*原向量,左下表明V阵转置的旋转作用,右下表明S点乘V转置的旋转作用

  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/hellcat/p/7132480.html
Copyright © 2011-2022 走看看