现在的位置: 首页 > 综合 > 正文

PCA的理解(KLT变换)

2019年01月06日 ⁄ 综合 ⁄ 共 3862字 ⁄ 字号 评论关闭

我个人在物理意义上的理解:

PCA之所以能够降维,是统计了向量中每个变量的变化率(多个样本的平均值与某一个样本的差值),变化率小(协方差矩阵的特征值小)的对判别没有太大的贡献,因此可以舍弃。而哪些变化率较大的变量对判别影响较大,所以需要保留特征值大的特征向量构成一个转换矩阵。

将新得到的一个观测值和保留下来的转换矩阵转置相乘就可以降低原始数据的维度,这个过程可以理解为就是一个投影变换,将原先的高维空间坐标投影到低维空间中。由于之前已经分析得到了贡献最大的几个特征值对应的特征向量构成的转化矩阵(这些特征向量可以理解为一个低维空间中的正交坐标轴向量),所以这一过程能够最大限度地保证数据信息量的不缺失。


具体的实现和说明转至 blue_lghttp://www.cnblogs.com/blue-lg/archive/2012/07/23/2604995.html

文章由两部分构成,第一部分主要讲解PCA算法的步骤,第二部分讲解PCA算法的原理。

 

那么首先进入第一部分

                                   --PCA算法的步骤




样本矩阵X的构成

    假设待观察变量有M个,其实相当于一个数据在M维各维度上的坐标,我们的目标是在保证比较数据之间相似性不失真的前提下,将描述数据的维度尽量减小至L维(L<M)。

    样本矩阵X在这里用x1,x2,...,xN共N个数据(这些数据都是以列向量的形式出现)来表示,那么X=[xx...
xN]MxN显而易见。

 


计算样本X均值

    计算第m维(m=1,2,...,M)的均值如下:

        

             

 


计算观察值与均值的偏差

    在每一维上,用当前值X[m,n]减去u[m],用矩阵运算表示如下:

    

       

    明显,h是一行向量,u是一列向量。

 


计算协方差矩阵

    根据协方差矩阵的计算定义wikihttp://en.wikipedia.org/wiki/Covariance_matrix

    我们认为bi代表B的第i行,那么由协方差矩阵

                  

 

    推知 

    <>表示向量的内积,也就是每一项的积之和。

 


计算协方差矩阵C的特征值和特征向量

    若XA=aA,其中A为一列向量,a为一实数。那么a就被称为矩阵X的特征值,而A则是特征值a对应的特征向量。    

    顺便扯一下,在matlab里面,求解上述A以及a,使用eig函数。如[D,V] = eig(C),那么D就是n个列特征向量,而V是对角矩阵,对角线上的元素就是特征值。

 


排序

    将特征值按从大到小的顺序排列,并根据特征值调整特征向量的排布。

    D'=sort(D);V'=sort(V);

 


计算总能量并选取其中的较大值

    若V'为C的对角阵,那么总能量为对角线所有特征值之和S。

    由于在步骤⑥里面已对V进行了重新排序,所以当v'前几个特征值之和大于等于S的90%时,可以认为这几个特征值可以用来"表征"当前矩阵。

    假设这样的特征值有L个。

 


计算基向量矩阵W

    实际上,W是V矩阵的前L列,所以W的大小就是 MxL 。

 


计算z-分数(这一步可选可不选)

     Z[i,j]=B[i,j]/sqrt(D[i,i])

 


计算降维后的新样本矩阵

 

                

     W*表示W的转置的共轭矩阵,大小为 LxM , 而Z的大小为 MxN , 所以Y的大小为 LxN , 即降维为 N 个 L 维向量。

如果上述的M值非常大,比如一个N*N的图像,那么他的向量为N^2,这种情况下的特征值计算非常困难,而在边肇其老师写的《模式识别》p224

介绍了一种SVD分解算法,可以减轻特征值和特征向量的求解难度。也就是KLT算法。

     

现在进入第二部分

                                   --PCA算法的原理



 首先让我们来了解一下特征值和特征向量的几何意义

 

根据上面步骤⑤的说法,很明显的发现一个特定的变换,它的特征向量是这样一种向量,它经过这种特定的变换后保持方向不变,只是进行长度上的伸缩而已(再想想特征向量的原始定义Ax=cx,
cx是方阵A对向量x进行变换后的结果,但显然cx和x的方向相同)。

一个变换(矩阵)可由它的所有特征向量完全表示,而每一个向量所对应的特征值,就代表了矩阵在这一向量上的贡献率——说的通俗一点就是能量(power)。

请看,当x=c1·x1+c2·x2时,而x1和x2均为矩阵A的特征向量(λ1和λ2分别为他们的特征值),那么Ax=c1·λ1·x1+c2·λ2·x2
,只不过是在两基方向上的投影长度发生了变化。

 

我们知道,一个变换可由一个矩阵乘法表示,那么一个空间坐标系也可视作一个矩阵,而这个坐标系就可由这个矩阵的所有特征向量表示,用图来表示的话,可以想象就是一个空间张开的各个坐标角度,这一组向量可以完全表示一个矩阵表示的空间的“特征”,而他们的特征值就表示了各个角度上的能量(可以想象成从各个角度上伸出的长短,越长的轴就越可以代表这个空间,它的“特征”就越强,或者说显性,而短轴自然就成了隐性特征),因此,通过特征向量/值可以完全描述某一几何空间这一特点,使得特征向量与特征值在几何(特别是空间几何)及其应用中得以发挥。

 
                                     

假设2x2矩阵的两个特征向量如上图红色虚线和绿色线所示,那么当椭圆的长轴远大于短轴时,可以将2维的点降维成一维,及当前向量在长轴上的投影值。

 

大家可以看看这篇blog,写的蛮不错的。http://blog.csdn.net/hexbina/article/details/7525850

 这里罗列一下博客中重要的观点:

所以一个特定的变换特征向量是这样一种向量,它经过这种特定的变换后保持方向不变,只是进行长度上的伸缩而已(再想想特征向量的原始定义Ax=cx,
cx是方阵A对向量x进行变换后的结果,但显然cx和x的方向相同)。

特征值只不过反映了特征向量在变换时的伸缩倍数而已,对一个变换而言,特征向量指明的方向才是很重要的。

一个变换(矩阵)可由它的所有特征向量完全表示,而每一个向量所对应的特征值,就代表了矩阵在这一向量上的贡献率——说的通俗一点就是能量(power)。

我们知道,一个变换可由一个矩阵乘法表示,那么一个空间坐标系也可视作一个矩阵,而这个坐标系就可由这个矩阵的所有特征向量表示,用图来表示的话,可以想象就是一个空间张开的各个坐标角度,这一组向量可以完全表示一个矩阵表示的空间的“特征”,而他们的特征值就表示了各个角度上的能量(可以想象成从各个角度上伸出的长短,越长的轴就越可以代表这个空间,它的“特征”就越强,或者说显性,而短轴自然就成了隐性特征),因此,通过特征向量/值可以完全描述某一几何空间这一特点,使得特征向量与特征值在几何(特别是空间几何)及其应用中得以发挥。

线性变换的缺点:线性变换PCA可以用来处理图像。如2维的人像识别:
1. 我们把图像A看成矩阵,进一步看成线性变换矩阵,把这个训练图像的特征矩阵求出来(假设取了n个能量最大的特征向量)。用A乘以这个n个特征向量,得到一个n维矢量a,也就是A在特征空间的投影。
2. 今后在识别的时候同一类的图像(例如,来自同一个人的面部照片),认为是A的线性相关图像,它乘以这个特征向量,得到n个数字组成的一个矢量b,也就是B在特征空间的投影。那么a和b之间的距离就是我们判断B是不是A的准则。
        不过,PCA有天生的缺点,就是线性矢量的相关性考察有"平移无关性"优点的同时,也完全忽略了,2维图形中,矢量分量之间的顺序是有意义的,顺序不同可以代表完全不同的信息。还有,就是图像B必须是A的某种伸缩(由特征向量空间决定的),才能被很好的投影到A的特征向量空间里面,如果B包含了A中的某种旋转因素,那么PCA可以彻底失效。所以实际应用中PCA的方法做图像识别,识别率并不高,它要求图像有某种严格的方向对齐和归一化。所以PCA一般不用来做直接的特征提取而是用来做特征矩阵的降维。当然,降维的结果用于分类并不理想,我们可以进一步做最小二承法拉开类间距离的Fisher变换。但是Fisher变换会引入新的弱点,那就是对于训练类别的数据变得更敏感了,分类效果上升的代价是通用性下降,当类型数量急剧膨胀的时候,分类效果的函数仍然是直线下降的----但是还是比直接PCA的分类效果好得多。PCA"主观"的认为,一个类型的第N+1个矩阵可以由之前已知的[1,N]个矩阵通过拉成向量来线性表出。显然这只是一个美好的主观愿望,因为即使新的输入矩阵是原有矩阵作了一些行列的初等变换如交换等,这种拉直以后的线性表出也可能根本就不存在(2维的PCA同样无法克服这个客观不存在的设定),于是,当应用到实际的时候,只能试图做优化没,用最小二乘距离来判定,"认为"那个矩阵就是属于某个分类。由于PCA训练的特征矩阵是一个类别一个矩阵,这些矩阵构成的子空间之间又无法保证正交,于是投影的结果也不具有根本意义上的分类特性。这个算法是个实用的算法,但是理论上根本就是无解。

再举一个例子,如果大家再引入一个M维的向量p和已经降维过后的向量q比较的话,需要先减去②里面每一维的均值,然后除以每一维的特征值的平方根,再乘以W*就OK了。

用公式表示为:

                                     

LDA也可以进行降维和预测判别

可以参考 http://blog.csdn.net/itplus/article/details/12038357

抱歉!评论已关闭.