PCA 原理:为什么用协方差矩阵

PCA的理论知识以及与K-L变换的关系

PCA是主成分分析(Principal Components Analysis)的简称。这是一种数据降维技术,用于数据预处理。一般我们获取的原始数据维度都很高,那么我们可以运用PCA算法降低特征维度。这样不仅可以去除无用的噪声,还能减少很大的计算量。

K-L转换(Karhunen-Loève Transform)是建立在统计特性基础上的一种转换,它是均方差(MSE, Mean Square Error)意义下的最佳转换,因此在资料压缩技术中占有重要的地位。K-L转换是对输入的向量x,做一个正交变换,使得输出的向量得以去除数据的相关性。

不过在图像处理上,K-L变换即是PCA变换,两者可以说是没有区别的。(待考证)

 

PCA的主要步骤

1、输入样本矩阵,大小:m*n。每一行为一个n维样本,共m个,如下图:

样本矩阵X=

取第一行为例,它的下标含义是 行表示样本序号,列表示样本维度。

         

 

2、对样本矩阵进行中心化(取均值);

 

3、计算样本的协方差矩阵;

 

4、计算协方差矩阵的特征值并取出最大的k个特征值所对应的特征向量,构成一个新的矩阵;

若使用matlab的话直接利用函数eig即可求得,若是用python3的话,借助numpy.linalg.eig函数即可。

 

5、这个矩阵就是我们要求的特征矩阵(也称特征脸),里面每一列就为样本的一维主成分。把样本矩阵投影到以该矩阵为基的新空间中,便可以将n维数据降低成k维数据。

为了让大家对特征脸有个直观印象,下面将展示提取出来的特征脸结果,略恐怖,注意! (:P)

 

 

使用的是ORL人脸库中的实例:共40个人的人脸图片,每人有10张。

 

PCA的设计思路

从上面PCA的实现步骤可以发现,它的关键步骤便是求出样本协方差矩阵C的特征向量矩阵。可是,为什么要这么做呢?为什么这么做就可以把人脸特征提取出来呢?这是我在学习PCA算法过程中一直思考的问题,经过多方查找资料,对比分析、思考,终于有了一个初步的理解。下面就让我们来一探究竟吧。

 

上文中提到过,PCA变换其实就是一种降维技术。

什么是降维?降维就是指通过矩阵乘法运算后,把原来的矩阵维度减少。比如

 

维数减少了,虽然可以大大减少算法的计算量,但是若对基矩阵P选择不当的话就很有可能会导致信息量的缺失。

因此我们要选择哪K个基(这里还不知道是特征向量)才能保证降维后能最大程度保留原有的信息,是进行设计的主方向。

 

什么是信息呢?根据信息论的定义,我们可以知道信息来源于未知。也就是说如果不同样本的同一维度的值差异特别大,那该维度带给我们的信息量就是极大的。转换成数学语言,也就是说某维度的方差越大,它的信息量越大。

举个例子:假如你有3个人的人脸特征数据,他们均有3个维度:眼睛、鼻子、嘴巴。如果他们鼻子这一维度的数据都是一样的,如下图中,三个人都是大鼻子(方差=0)。那么我们从鼻子这一维度获得的信息量就是为零,因为无法从该维度得知该人脸图像到底属于谁的。

那如果他们鼻子这一维度的数据各不相同,如下图中,三个人分别是大、中、小鼻子(方差很大)。那么我们从鼻子这一维度获得的信息量就很大了,甚至直接用这一个维度就可以识别出是谁的人脸图像。

综上,我们就可以很容易联想到  第一个优化目标:降维后各维度的方差尽可能大。

既然有了第一个,当然就会有第二个啦(我说的是优化目标,别想多啦),我们的第二个优化目标便是保证不同维度之间的相关性为0(其实就是让基向量互相正交)。

 

因为如果某2个维度间存在相关性,就说明从一个维度的值可以推测出另一个维度的值。说明该维度中有一个是多余的,对我们识别特征帮助不大,那自然可以把其中一个维度舍去。

比如说:如果上面例子中嘴巴与鼻子这两个维度之间存在线性关系(相关性为1,完全相关):对于格式:(y)嘴巴、(x)鼻子,有y=x,x∈[大,中,小]。那么嘴巴这一维度在这里是不是就是冗余的?有它没它都一个样,完全可以通过鼻子的大小推测出嘴巴的大小,进而判断出人脸的身份。

综上所述,

PCA算法的优化目标就是:    ① 降维后同一纬度的方差最大

                                          ② 不同维度之间的相关性为0

 

根据线性代数,我们可以知道同一元素的协方差就表示该元素的方差,不同元素之间的协方差就表示它们的相关性。因此这两个优化目标可以用协方差矩阵来表示,如下图:

 

如下图,根据矩阵的迹的定义:

 

可以知道优化目标一便是令Cy矩阵的对角线元素之和最大。即max tr(Cy)

 

-------------------------------------------------------------------------------------------------------------

知道了目标,接下来就好办,我们要做的就是想尽一切办法去达到我们的优化目标。

下面便是推导过程:

 

PS:拉格朗日乘子法定义如下

		<p><img alt="" class="has" src="https://img-blog.csdn.net/20180512100145486?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMDc2Nzg5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70"></p>
		</td>
	</tr></tbody></table></div><p><br><span style="color:#000000;"><img alt="" class="has" src="https://img-blog.csdn.net/20180512100435471?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMDc2Nzg5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70"></span></p>

 

 

 

根据:

 

可以看到,最终求得的结果满足特征向量的关系式,因此由C矩阵的特征向量所构成的基矩阵,就是我们要求的变换矩阵。

由该矩阵降维得到的新样本矩阵可以最大程度保留原样本的信息。

 

 

至此,问题都已经解决了:信息量保存能力最大的基向量一定是样本矩阵X的协方差矩阵的特征向量,并且这个特征向量保存的信息量就是它对应的特征值的绝对值。这个推导过程就解释了为什么PCA算法要利用样本协方差的特征向量矩阵来降维。
我觉得这正是理解PCA算法的关键点,只要理解了这一点,对PCA算法也就基本掌握了,之后要自己编程实现PCA

 

人脸识别系统,也就只是按部就班的事了。

 

这是我用python3.6写的参考代码(基于PCA的人脸识别系统):https://github.com/LJRice/KL-PAC-_face

大家有兴趣的话可以研究一下,若是文章、代码中有哪里不对还请私信我,谢谢观看:D

 

(PS:该文章只是讲解了PCA的工作原理,不涉及它的具体实现方法。等以后有时间,还会对代码进行详细介绍的。)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值