机器学习算法(六):奇异值分解SVD

目录

1 特征值(EVD)

2 奇异值(SVD)

2.1 右奇异向量(列变化)V

2.2 左奇异向量(行变换)U

2.3 奇异值矩阵Σ

2.4 A的满秩分解A=XY

3 奇异值与主成分分析(PCA)


      奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)。奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵更小更简单的几个子矩阵相乘来表示,这些小矩阵描述的是矩阵的重要的特性。

        特征值分解奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。

1 特征值(EVD

        如果说一个向量v方阵A的特征向量,将一定可以表示成下面的形式:

                

        这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量

        矩阵特征值的求法:矩阵特征值_百度百科

        矩阵的行列式求法:矩阵行列式怎么算?_百度知道

        特征值分解是将一个矩阵分解成下面的形式:

                

         其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:

               

        它对应的线性变换是下面的形式:

                机器学习算法(六):奇异值分解SVD_第1张图片

          因为这个矩阵M乘以一个向量(x,y)的结果是:

              

         上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短)。当矩阵不是对称的时候,假如说矩阵是下面的样子:

                 

        它所描述的变换是下面的样子:

                 机器学习算法(六):奇异值分解SVD_第2张图片

        这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。

        当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。

        局限:特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。方阵可以做特征值分解的充要条件是其有  个线性无关的特征向量。即  有  个线性无关的特征向量时,  才可以做特征值分解。

奇异值(SVD)

       特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有m个学生,每个学生有n科成绩,这样形成的一个m×n的矩阵就不可能是方阵,奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法

                

         假设A是一个m×n的矩阵,那么得到的U是一个m×m方阵(里面的向量是正交的(若内积空间中两向量的内积为0,则称它们是正交的。如果能够定义向量间的夹角,则正交可以直观的理解为垂直。),U里面的向量称为左奇异向量),Σ是一个m×n的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值)V’(V的转置)是一个n×n的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量。U和V都是酉矩阵,即满足。从图片来反映几个相乘的矩阵的大小可得下面的图片

              机器学习算法(六):奇异值分解SVD_第3张图片

       机器学习算法(六):奇异值分解SVD_第4张图片

      对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:       

                     

      其中k要比n小很多,也就是一个大的矩阵A可以用三个小的矩阵来表示。如下图所示,现在我们的矩阵A只需要灰色的部分的三个小矩阵就可以近似描述了。

机器学习算法(六):奇异值分解SVD_第5张图片

        由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。

        那么奇异值和特征值是怎么对应起来的呢?

2.1 右奇异向量(列变化)V

       首先,我们将一个矩阵A的转置 *×A,将会得到一个n×n方阵,既然是方阵,我们求特征值可以得到:

         

        这样我们就可以得到矩阵n个特征值对应的n个特征向量v了。将的所有特征向量张成一个n×n的矩阵V,就是我们SVD公式里面的V矩阵了。一般我们将V中的每个特征向量叫做A右奇异向量

         的特征向量组成的就是SVD中的V矩阵证明:

        

        上式证明使用了: 

2.2 左奇异向量(行变换)U

        如果我们将A和A的转置做矩阵乘法,那么会得到m×m的一个方阵。既然是方阵,那么我们就可以进行特征分解,得到的特征值特征向量满足下式:

          

        这样我们就可以得到矩阵m个特征值和对应的m个特征向量u了。将的所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A左奇异向量

        的特征向量组成的就是SVD中的U矩阵证明可参考上文“   的特征向量组成的就是SVD中的V矩阵证明”。

2.3 奇异值矩阵Σ

(1)方 法一:

        由于Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值σ就可以了。

         因为:

         

        这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵Σ

(2)方法二: 

       特征值分解的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之间两两正交,那么

               

        因为

              

        所以有

                

         所以取单位向量

                 

        由此可得

                

       可以看出我们的特征值矩阵等于奇异值矩阵的 平方,也就是说特征值和奇异值满足如下关系:

       

       这样也就是说,我们可以不用来计算奇异值,也可以通过求出特征值取平方根来求奇异值

2.4 A的满秩分解A=XY

满秩分解的定义、证明、求法(矩阵分解——1. 满秩分解) - 知乎

       当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变换后的形状仍然为(超)矩形

        viA'A的特征向量,称为A的右奇异向量ui=Avi实际上为AA'的特征向量,称为A的左奇异向量。下面利用SVD证明文章一开始的满秩分解:

             

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

             

        可以看到第二项为0,有

            

        令

           

        

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

奇异值与主成分分析(PCA)

      这里主要谈谈如何用SVD去解PCA的问题。PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。以下面这张图为例子:

          机器学习算法(六):奇异值分解SVD_第6张图片

        这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的),如果我们使用原来的xy坐标系去看这些点,容易看不出来这些点真正的方向是什么。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则就很容易发现什么方向的方差大,什么方向的方差小了。

        一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,我们在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果我们只保留signal方向的数据,也可以对原数据进行不错的近似了。

       PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

        还是假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n矩阵A的进行坐标轴的变化,P就是一个变换的矩阵从一个N维的空间变换到另一个N维的空间,在空间中就会进行一些类似于旋转、拉伸的变化。

           

        而将一个m * n矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是:

             

        之前谈到,SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…我们回忆一下之前得到的SVD式子:

               

    (1)对列压缩

      PCA仅仅使用了我们SVD的右奇异矩阵。在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子

                

        将后面的式子与A * P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。这里是将一个m * n 的矩阵压缩到一个m * r的矩阵,也就是对列进行压缩

      (2)对行压缩

        如果我们想对行进行压缩(在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉)怎么办呢?同样我们写出一个通用的行压缩例子:

                

       这样就从一个m行的矩阵压缩到一个r行的矩阵了,对SVD来说也是一样的,我们对SVD分解的式子两边乘以U的转置U'

                 

        这样我们就得到了对行进行压缩的式子。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了。而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对A’A进行特征值的分解,只能得到一个方向的PCA。

参考:奇异值分解(SVD)原理详解及推导_y1535766478的博客-CSDN博客

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园

奇异值分解(SVD)原理与在降维中的应用 - 刘建平Pinard - 博客园

机器学习之旅---奇异值分解_Where there is life, there is hope-CSDN博客

你可能感兴趣的:(机器学习,机器学习算法,linux,python,机器学习)