PCA与SVD的数学原理

     PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

数据的向量表示及降维问题

      一般情况下,在数据挖掘和机器学习中,数据被表示为向量。例如某个淘宝店交易情况可以看成一组记录的集合,其中每一天的数据是一条记录,格式如下:(浏览量, 访客数, 下单数, 成交数, 成交金额)

    每条记录可以被表示为一个五维向量,这里我们习惯上使用列向量表示一条记录(后面会看到原因),本文后面也会遵循这个准则。我们说到向量默认都是指列向量。

     我们当然可以对这一组五维向量进行分析和挖掘,但是实际机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。

      例如上面淘宝店铺的数据,从经验我们可以知道,“浏览量”和“访客数”往往具有较强的相关关系,而“下单数”和“成交数”也具有较强的相关关系。可以直观理解为“当某一天这个店铺的浏览量较高(或较低)时,我们可以认为这天的访客数也较高(或较低)”。

    这种情况表明,如果我们删除浏览量或访客数其中一个指标,我们应该并不会丢失太多信息。因此我们可以删除一个,以降低机器学习算法的复杂度。

    上面给出的是降维的朴素思想描述,可以有助于直观理解降维的动机和可行性,但并不具有操作指导意义。例如,我们到底删除哪一列损失的信息才最小?亦或根本不是单纯删除几列,而是通过某些变换将原始数据变为更少的列但又使得丢失的信息最小?到底如何度量丢失信息的多少?如何根据原始数据决定具体的降维操作步骤?

     要回答上面的问题,就要对降维问题进行数学化和形式化的讨论。而PCA是一种具有严格数学基础并且已被广泛采用的降维方法。下面我不会直接描述PCA,而是通过逐步分析问题,让我们一起重新“发明”一遍PCA。

向量的表示及基变换

内积与投影

两个维数相同的向量的内积被定义为:

                                                             

      内积运算将两个向量映射为一个实数。下面我们分析内积的几何意义。假设A和B是两个n维向量,我们知道n维向量可以等价表示为n维空间中的一条从原点发射的有向线段,为了简单起见我们假设A和B均为二维向量,则在二维平面上A和B可以用两条发自原点的有向线段表示,见下图:

                                  

      现在我们从A点向B所在直线引一条垂线。我们知道垂线与B的交点叫做A在B上的投影,再设A与B的夹角是a,则投影的矢量长度为|A|cos(a),其中|A|是向量A的模,也就是A线段的标量长度。到这里还是看不出内积和这东西有什么关系,不过如果我们将内积表示为另一种我们熟悉的形式:

                                                             A\cdot B=|A||B|cos(a)

      A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度!这就是内积的一种几何解释,也是我们得到的第一个重要结论。在后面的推导中,将反复使用这个结论。

     上文说过,一个二维向量可以对应二维笛卡尔直角坐标系中从原点出发的一个有向线段。例如下面这个向量:

                                       

   我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2),这是我们再熟悉不过的向量表示。不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的。我们仔细看一下,这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是说在x轴投影为3而y轴的投影为2。注意投影是一个矢量,所以可以为负。

更正式的说,向量(x,y)实际上表示线性组合:

                                                       \begin{pmatrix} x\\ y \end{pmatrix}=x*\begin{pmatrix} 1\\ 0 \end{pmatrix}+y*\begin{pmatrix} 0\\ 1 \end{pmatrix}

不难证明所有二维向量都可以表示为这样的线性组合。此处(1,0)和(0,1)叫做二维空间中的一组基。

                                        

     所以,要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了。只不过我们经常省略第一步,而默认以(1,0)和(0,1)为基。

     我们之所以默认选择(1,0)和(0,1)为基,当然是比较方便,因为它们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不在一条直线上的向量。

      例如,(1,1)和(-1,1)也可以成为一组基。一般来说,我们希望基的模是1,因为从内积的意义可以看到,如果基的模是1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了!实际上,对应任何一个向量我们总可以找到其同方向上模为1的向量,只要让两个分量分别除以模就好了,变为,

      现在,我们想获得(3,2)在新基上的坐标,即在两个方向上的投影矢量值,那么根据内积的几何意义,我们只要分别计算(3,2)和两个基的内积,不难得到新的坐标为。下图给出了新的基以及(3,2)在新基上坐标值的示意图:

                                             

      另外这里要注意的是,我们列举的例子中基是正交的(即内积为0,或直观说相互垂直),但可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的。不过因为正交基有较好的性质,所以一般使用的基都是正交的。

基变换的矩阵表示

       下面我们找一种简便的方式来表示基变换。还是拿上面的例子,想一下,将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。实际上,我们可以用矩阵相乘的形式简洁的表示这个变换:

                                                          

     其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。可以稍微推广一下,如果我们有m个二维向量,只要将二维向量按列排成一个两行m列矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值。例如(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:

                                                        

于是一组向量的基变换被干净的表示为矩阵的相乘。

      一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果

数学表示为:

                                             

    其中p_{i}是一个行向量,表示第i个基,a_{j}是一个列向量,表示第j个原始数据记录。

    特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。因此这种矩阵相乘的表示也可以表示降维变换。

     最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说,一个矩阵可以表示一种线性变换。很多同学在学线性代数时对矩阵相乘的方法感到奇怪,但是如果明白了矩阵相乘的物理意义,其合理性就一目了然了。 

协方差矩阵及优化目标

     上面我们讨论了选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量本身的维数,则可以达到降维的效果。但是我们还没有回答一个最最关键的问题:如何选择基才是最优的。或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?以一个具体的例子展开。假设我们的数据由五条记录组成,将它们表示成矩阵形式:

                                                                        

      其中每一列为一个样本,我们首先将每个样本内所有值都减去均值,其结果是将每个(行)字段都变为均值为0(这样做的道理和好处后面会看到)。我们看上面的数据,第一行均值为2,第二行均值为3,所以变换后:

                                                                       

我们可以看下五条数据在平面直角坐标系内的样子:

                               

    现在问题来了:如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。

那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。我们直观目测,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。

方差和协方差

     我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:

                                                       

      对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。

      如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段(行,特征)不是完全独立,必然存在重复表示的信息。数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
                                                                 
       可以看到,在均值为0时,两个样本的协方差表示为其内积除以元素数m。当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的

      至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)

协方差矩阵

     假设我们只有a和b两个样本,那么我们将它们按行组成矩阵X:

                                               
    然后我们用X乘以X的转置,并乘上系数1/m:

                               

       这个矩阵对角线上的两个元素分别是两个样本的方差,而其它元素是a和b的协方差。

协方差矩阵对角化

       根据上述推导,我们发现要达到优化目标,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:

     设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:

                                                                        

        现在事情很明白了!我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足PCP^T是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件

     协方差矩阵C是一个是对称矩阵,有一系列非常好的性质:

1)实对称矩阵不同特征值对应的特征向量必然正交。

2)设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。

     由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en,我们将其按列组成矩阵:

                                                                         

   则对协方差矩阵C有如下结论:

                                                       

其中Λ为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。到这里,我们发现我们已经找到了需要的矩阵P:
                                                                     
       P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照Λ中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。

算法及实例

总结一下PCA的算法步骤:设有m个n维数据

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

3)求出协方差矩阵

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)Y=PX即为降维到k维后的数据

实例

这里以上文提到的

  

为例,我们用PCA方法将这组二维数据其降到一维。

因为这个矩阵的每行已经是零均值,这里我们直接求协方差矩阵:

          

然后求其特征值和特征向量,具体求解方法不再详述,可以参考相关资料。求解后特征值为:

    

其对应的特征向量分别是:

    

其中对应的特征向量分别是一个通解,c1c1和c2c2可取任意实数。那么标准化后的特征向量为:

          

因此我们的矩阵P是:

   

可以验证协方差矩阵C的对角化:

  

最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:

降维投影结果如下图:

                                              

PCA推导:

      PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据(x(1),x(2),...,x(m))。我们希望将这m个数据的维度从n维降到n'维,希望这m个n'维的数据集尽可能的代表原始数据集。我们知道数据从n维降到n'维肯定会有损失,但是我们希望损失尽可能的小。

 将数据从二维降维到一维,如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,u1和u2,从直观上也可以看出,u1比u2好。

                                

  为什么u1比u2好呢?可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。我们把n'从1维推广到任意维,则我们的希望降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。基于上面的两种标准,我们可以得到PCA的两种等价推导。

     这里我们基于最大投影方差对PCA进行推导:

                   

      做一些解释:上式中x^{(i)}表示第i个样本,它表示为一个n*1的列向量;w_{j}代表新的坐标系的一个坐标轴,表示为一个n*1的列向量,所以z^{(i)}_j=w^T_jx^{(i)}是一个行向量乘一个列向量,结果是一个标量,代表x(i)在低维坐标系{w_1,w_2,...w_n}里第j维的坐标.,用矩阵形式表示就是:一个样本x(i),在新的坐标系中的投影后的坐标为z^{(i)}=W^Tx^{(i)},W=(w_1,w_2,...w_n),它是n*n的矩阵,每一列是一个w_{j}PCA的目标就是求出矩阵W!

   样本的投影方差体现了样本相对均值的偏离程度,我们要是所有样本的投影方差最大,即将每个样本的投影方差加在一起求和,使和最大。

这句话是什么意思???

理解是这样的:我们先求一个样本的方差:W^Tx^{(i)}是一个新的坐标,表示为一个列向量,样本的方差求法为(W^Tx^{(i)})^{T}(W^Tx^{(i)})=x^{(i)}^TWW^Tx^{(i)},结果是一个标量值,然后所有样本的方差为:\sum_{i=1}^{m} (W^Tx^{(i)})^{T}(W^Tx^{(i)})=\sum_{i=1}^{m}x^{(i)}^TWW^Tx^{(i)},这里我们发现怎么我们求得结果和上图的结果反过来了!其实两个都是对的,因为(W^Tx^{(i)})^{T}(W^Tx^{(i)})=x^{(i)}^TWW^Tx^{(i)}的值就是W^Tx^{(i)}x^{(i)}^TW矩阵的迹(矩阵对角元素的和)

PCA的推导:基于最小投影距离参见:https://www.cnblogs.com/pinard/p/6239403.html

最小平方误差理论 :

PCA理解第二层境界:最小重建误差

    什么是重建, 那么就是找个新的基坐标, 然后减少一维或者多维自由度。 然后重建整个数据。 好比你找到一个新的视角去看这个问题, 但是希望自由度小一维或者几维。那么目标就是要最小重建误差,同样我们可以根据最小重建误差推导出类似的目标形式。

    在高维空间中,我们需要找到一个d维超平面,使得数据点到这个超平面的距离平方和最小。我们假设该超平面由d个标准正交基W=\left\{ w_{1},...,w_{d}\right\},那么数据点x_k投影到该超平面可以表示成,以下为例:
                            

重建也可以写成:\bar{x}=Wx'

现在我们考虑整个样本集,我们希望所有的样本到这个超平面的距离足够近,即最小化下式:

                                                            

                         

最小化上式等价于:

                                    

            

 


SVD

奇异值与特征值基础知识:

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

   1)特征值:

    如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式:Av=\lambda v,  这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:,其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。

    首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。

比如一个矩阵:    它其实对应的线性变换是下面的形式:
   
因为这个矩阵M乘以一个向量(x,y)的结果是:,上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵:,它所描述的变换是下面的样子:

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

    当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。

奇异值:

     特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法:

    假设A是一个N * M的矩阵,那么得到的U是一个N * N的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量):

                             

    那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:    这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:

                                                                

A^TA=(U\Sigma V^T)^T(U\Sigma V^T)=V\Sigma ^TU^TU\Sigma V^T=V\Sigma ^2V^T

A^TAv_i=\lambda _iv_i=V\Sigma ^2V^Tv_i=\Sigma ^2V,所以

A=U\Sigma V^T,U=AV/\Sigma

    这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:

r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:

                                     

    右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。

我们定义矩阵A的SVD为:
                                                  
   其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足U^TU=V^TV=I

                         


PCA必须是对称矩阵。(由于对称阵特征向量两两正交,所以U为正交阵,正交阵的逆矩阵等于其转置)

用矩阵A对X做变换:

U’(表示U的转置)是正交矩阵,后半部分U’X就是我们上面讨论的正交变换,于是我们可以用新的基来表示X,得到X的新的坐标(注意:X还是这个X,只是在U’这个坐标系下表示罢了),上式右边则可表示为

                               

其中,a1,a2,…,am,为X的新坐标,在U’这组基(这个坐标系)下的坐标值。再继续往左变换:

                           

这一步变换好理解,就是对X在新坐标下的拉伸。此时又回到了正交变换,这次是拉伸后的坐标用U变换,而UU’互为逆矩阵,所以第三次变换和第一次变换互为逆变换。

总结:

一个向量X,被对称矩阵A变换,有三步:

1.A特征向量U’的正交变换

2.A特征值\lambda的伸缩变换

3.A特征向量U的正交变换(第1步的逆变换)

站在基的角度,X还是那个X,是基被A变换了,所以对X才有了不同的表示。因为U和U’都是正交基,所以被A变换前的基是正交基,变换后的基还是正交基。

     上面的分析都是针对对称矩阵,拆的是对称矩阵。再回顾一下我们要做什么:把大矩阵拆成多个不相关的小矩阵。说起不相关,就想到了正交。于是目的变成了:怎样把大矩阵A拆成小矩阵A1.A2.A3...,而A1,A2,A3…还是正交的。

怎样判断小矩阵是正交的呢?我们想到了,正交矩阵将标准正交基映射为另一组标准正交基

最后,我们的目的就变成了:找到一组正交基,经过矩阵变换后还是正交基

from:https://www.jianshu.com/p/103466ec983e

那么现在来分析:对任意M*N的矩阵,能否找到一组正交基使得经过它变换后还是正交基?答案是肯定的,它就是SVD分解的精髓所在。

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

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

我们需要让他们两两正交,即

我们之前已经假设是正交基,则

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

                                            

这样就找到了正交基使其映射后还是正交基了,即 A'A的特征向量作为正交基,经过A变换后,还是正交的。

现在,将映射后的正交基单位化:因为|Av_i|^2=(Av_i)^TAv_i=v_i^TA^TAv_i=v_i^T\lambda v_i=\lambda

所以取单位向量:

由此可得

           

当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维空间中的一组正交基.

SVD用于PCA(不用再求协方差矩阵

  在主成分分析(PCA)原理总结中,我们讲到要用PCA降维,需要找到样本协方差矩阵的最大的d个特征向量,然后用这最大的d个特征向量张成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵,当样本数多样本特征数也多的时候,这个计算量是很大的。

  我们的SVD也可以得到协方差矩阵最大的d个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不求先求出协方差矩阵,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。

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

     假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩,P就是一个变换的矩阵从一个N维的空间变换到另一个R维的空间,用数学语言表示就是:

                                                         

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

                                           

       在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子

                                            

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

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

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

                                            

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

左奇异矩阵可以用于行数的压缩,右奇异矩阵可以用于列数即特征维度的压缩,即PCA降维

from:https://www.cnblogs.com/pinard/p/6251584.html

PCA的求解方法

    求特征值分解。如果人脸的特征维度d很大,例如256x256的人脸图像,d就是65536了。那么协方差矩阵C的维度就是dxd=65536x65536。对这个大矩阵求解特征值分解是很费力的。那怎么办呢?如果人脸的样本不多,也就是N不大的话,我们可以通过求解C’=ΦTΦ矩阵来获得同样的特征向量。可以看到这个C’=ΦTΦ只有NxN的大小哦。如果N远远小于d的话,那么这个力气就省得很值了。那为什么求解C’=ΦTΦ矩阵的特征向量可以获得C=ΦΦT的特征向量?万众瞩目时刻,数学以完美舞姿登上舞台。证明如下:

                        

      其中,ei是C’=ΦTΦ的第i个特征向量,vi是C=ΦΦT的第i个特征向量,由证明可以看到,vi=Φei。所以通过求解C’=ΦTΦ的特征值分解得到ei,再左乘Φ就得到C=ΦΦT的特征向量vi了。也就是我们想要的特征脸。

进一步讨论

      根据上面对PCA的数学原理的解释,我们可以了解到一些PCA的能力和限制。PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。

      因此,PCA也存在一些限制,例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了,对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关,关于这点就不展开讨论了。另外,PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。

from:http://blog.codinglabs.org/articles/pca-tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值