SVD矩阵奇异值分解

  参考文章:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

  不正之处,欢迎指正!

  矩阵的奇异值分解是线性代数中一种重要的矩阵分解,在信号处理,统计学等领域中有着重要的应用。在大学里面的线性代数的课程中一般都是会有SVD分解相关的知识的。但是往往只是涉及到理论上的知识体系,并没有多少实际应用的背景,所以结果就是学了没多久就会忘。奇异值分解可以将一个比较复杂的矩阵用几个小的简单的矩阵来表示,这些小的矩阵可以很好的表示原始矩阵的重要特性。在机器学习方面,很多的研究都是和奇异值分解有关的,典型的用于特征降维处理的PCA。在本文中我们会先介绍特征值得概念,由特征值引出奇异值分解,最后会给出实际中求解奇异值的方法。

1.特征值

  特征值在线性代数中是这样定义的,A为NxN矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量。一个矩阵的一组特征向量是正交的,所谓的特征值分解就是将一个方阵A分解成一下的形式:

                    

  其中Q是方阵A所有的特征向量组成的矩阵,Q中的每一列代表矩阵A的一个特征向量,Σ是一个对角矩阵,每一个对角线上的元素就代表一个特征值。也就是经过这样的一个变化将方阵A换了一个形式,那么这么做的一一是什么呢?

  首先我们要知道一个矩阵其实就是对应着一个固定的线性变换,在特征值的定义中,我们定义矩阵乘上一个向量最后得到一个实数和向量的乘积,其实就是对向量进行了一个变化,变换的幅度大小也就是我们的特征值。可以来看一个例子说明这个问题:比如说下面的矩阵

                   

   M乘以一个向量(x,y)的结果是:
                   

    向量(x,y)通过矩阵M作用之后变成了向量(3x,y)这个过程可以形象的用下面的图来展示:

           SVD矩阵奇异值分解_第1张图片

  矩阵M的作用就相当于将这个二维的向量横坐标拉伸了2倍,纵坐标没有做变化,这一点像高中学习波形函数时候的函数变换。当矩阵是高维的情况下,这个矩阵就是高维空间中的一个线性变换,通过特征值分解求得特征值和特征向量,可以用来表示这个矩阵的重要特征,其中特征向量表明了这个重要的特征是什么,而特征值表示了这个特征的重要程度。

  下面给出一个求解矩阵特征值的例子:

import numpy as np
>>> x=np.diag((1,2,3))
>>> x
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
>>> a,b=np.linalg.eig(x)
>>> a
array([ 1.,  2.,  3.])
>>> b
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

  在这个例子中,先生成一个对角矩阵,然后利用numpy中的方法直接求解得到矩阵的特征值和特征向量,其中a表示的是特征值,b表示的是特征值对应的特征向量。

2.奇异值分解

  由上面的例子讨论可以知道,通过特征值分解可以得到矩阵的特征值和特征向量有次来表示矩阵的主要特征,但是这是对于矩阵是方阵的情况下,但是在实际应用中,很难保证矩阵是方阵的情况,那么这种情况下有该怎么做呢?这个时候就用到了矩阵的奇异值分解。

  假设矩阵A是一个mxn的矩阵,如果存在这样的一个分解使得

                         

  其中U是一个mxm的矩阵,U的列组成一套对于A的正交输出的基向量,这些向量是A与其转置的特征向量,Σ是一个mxn的对角矩阵,对角线上的元素称为奇异值,V的转置是一个nxn的矩阵,里面的向量正交。可以用下图来表示:

              SVD矩阵奇异值分解_第2张图片

  利用矩阵的转置乘以其自身,可以得到一个方阵,求解这个方阵的特征值和特征向量

               

  利用这个公式求得的v就是上述中的列向量,也就是说中的列表示的是的特征向量,同理,U中的列表示的是的特征向量。特征值在中是按照从大到小的次数排列,很多情况下,前10%甚至1%的奇异值的和就占了全部奇异值和的99%,所以我们可以用前r大的奇异值来近似的描述矩阵,

                  

   这样,可以用右边三个矩阵来近似的描述左边的矩阵A.下面给出一个求解奇异值的过程:

from numpy import *
A=mat([[1,2,3],[4,5,6]])
U,sigma,VT=linalg.svd(A)
print(U)
print(sigma)
print(VT)

  对应的结果如下:

3.奇异值分解和PCA  SVD矩阵奇异值分解_第3张图片

利用PCA通过求解特征值和特征向量,选取前n个特征值对应的特征向量,可以对数据进行降维。PCA的为题其实一个基变换,使得变换之后的数据具有最大的方差,方差越大,数据也就越分散,这样也就越有利于进行分类。

假设现在有一个mxn的矩阵A,矩阵的每一行表示一个样本,矩阵的每一列表示一个特征维度,利用PCA的思想可以将一个n维的空间变换到另一个r维的空间,数学公式表达如下:

        

  但是这个跟我们的SVD有什么关系呢,上面讲到过,利用SVD分解得到的中的特征值是从大到小排列的。SVD分解可以近似的表示原始矩阵A

             

  在矩阵的两边同时乘以矩阵V,因为V是正交的,所以是单位矩阵,所以上面的式子就可以变形为:
            

  这里的V相当于我们上面的P,所以在原始的矩阵A上作用一个V后,矩阵可以表示为一个mxr的矩阵,将一个n维空间的数据投影到了r维空间,思想和PCA是一样的。


你可能感兴趣的:(机器学习)