PCA算法原理

来源:互联网 发布:淘宝1秒拦截软件有哪些 编辑:程序博客网 时间:2024/05/20 10:54

PCA算法原理

参考网址:
http://blog.csdn.net/liulina603/article/details/7912950
http://blog.csdn.net/panhao762/article/details/55273789
http://blog.csdn.net/zyh2004883/article/details/49765599


一. PCA算法简介:

主成分分析(PCA)是多元统计分析中用来分析数据的一种方法,它是用一种较少数量的特征对样本进行描述以达到降低特征空间维数的方法,它的本质实际上是K-L变换。PCA方法最著名的应用应该是在人脸识别中特征提取及数据维,我们知道输入200*200大小的人脸图像,单单提取它的灰度值作为原始特征,则这个原始特征将达到40000维,这给后面分类器的处理将带来极大的难度。著名的人脸识别Eigenface算法就是采用PCA算法,用一个低维子空间描述人脸图像,同时用保存了识别所需要的信息。

PCA ( Principal Component Analysis , PCA )是主成分分析,主要 用于数据降维,对于一系列例子的特征组成的多维向量,多维向量里的某些元素本身没有区分性,比如某个元素在所有的例子中都为1,或者与1差距不大,那么这个元素本身就没有区分性,用它做特征来区分,贡献会非常小。所以我们的目的是找那些变化大的元素,即方差大的那些维,而去除掉那些变化不大的维,从而使特征留下的都是“精品”,而且计算量也变小了。

所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。

举一个例子:

对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。

所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。

二. PCA算法步骤:

(1)原始特征矩阵归一化处理

假设待观察变量有M个,其实相当于一个数据在M维各维度上的坐标,我们的目标是在保证比较数据之间相似性不失真的前提下,将描述数据的维度尽量减小至L维
(L < M)。样本矩阵X在这里用x1,x2,…,xN共N个数据(这些数据都是以列向量的形式出现)来表示,那么X = [x1 x2 … xN]MxN显而易见。

首先要对训练样本的特征进行归一化, 特别强调的是, 归一化操作只能在训练样本中进行, 不能才CV集合或者测试集合中进行, 也就是说归一化操作计算的各个参数只能由训练样本得到, 然后测试样本根据这里得到的参数进行归一化, 而不能直接和训练样本放在一起进行归一化。
另外, 在训练PCA降维矩阵的过程中,也不能使用CV样本或者测试样本, 这样做是不对的。 有很多人在使用PCA训练降维矩阵的时候, 直接使用所有的样本进行训练, 这样实际上相当于作弊的, 这样的话降维矩阵是在包含训练样本和测试样本以及CV样本的情况下训练得到的, 在进行测试的时候, 测试样本会存在很大的优越性, 因为它已经知道了要降维到的空间情况。

这里的X是一个m * n 的矩阵, 有 m 个样本, 每个样本包含 n 个特征, 每一行表示一个样本。 X_norm是最终得到的特征, 首先计算了所有训练样本每个特征的均值, 然后减去均值, 然后除以标准差。

    function [X_norm, mu, sigma] = featureNormalize(X)      %FEATURENORMALIZE Normalizes the features in X       %   FEATURENORMALIZE(X) returns a normalized version of X where      %   the mean value of each feature is 0 and the standard deviation      %   is 1. This is often a good preprocessing step to do when      %   working with learning algorithms.      mu = mean(X);      X_norm = bsxfun(@minus, X, mu);      sigma = std(X_norm);      X_norm = bsxfun(@rdivide, X_norm, sigma);      % ============================================================      end  
(2)求取归一化处理后特征矩阵的协方差矩阵

矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。

协方差矩阵:

计算样本X的均值:
计算第m维(m=1,2,…,M)的均值如下: 向量u是均值

计算样本X与均值u的偏差
在每一列上,用当前值X[m,n]减去u[m],用矩阵运算表示如下: 矩阵B是偏差,明显,h是一行向量,u是一列向量。


A. 对于原始数据集X的样本是按列排列的,即:X = [x1 x2 … xN]MxN

B. 对于原始数据集X的样本是按行排列的,即:X = [x1; x2; … ;xN]NxM

不好意思,上述协方差公式错了,分母(m-1)应该是(n-1),是除以样本数目减一.协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / n,而不是 1 / (n - 1).

举个例子求协方差矩阵,矩阵 X 按行排列:

  1. 求每个维度的平均值
  2. 将 X 的每一列减去平均值

    其中:

  3. 计算协方差矩阵


(3)计算协方差矩阵的特征值及其对应的特征向量

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

求出协方差矩阵的特征向量D[i]和对应的特征值V[i],这些特征向量组成的矩阵就是人脸空间的正交基底,用它们的线性组合可以重构出样本中任意的人脸图像,(如果有朋友不太理解这句话的意思,请看下面的总结2。)并且图像信息集中在特征值大的特征向量中,即使丢弃特征值小的向量也不会影响图像质量。


(4)按照特征值从大到小排列特征向量D
(5)从大到小,挑选出前L个特征值对应的特征向量组成降维后的低维基向量矩阵W,即为所求。

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


(6)计算降维后的新样本矩阵

A. 对于原始数据集X的样本是按列排列的,即:X = [x1 x2 … xN]MxN

B. 对于原始数据集X的样本是按行排列的,即:X = [x1; x2; … ;xN]NxM

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

这样每一幅人脸图像都可以投影到W构成的特征脸子空间中,W的维数为M×L。有了这样一个降维的子空间,任何一幅人脸图像都可以向其作投影,即并获得一组坐标系数,即低维向量y,维数L×1,为称为KL分解系数。这组系数表明了图像在子空间的位置,从而可以作为人脸识别的依据。


总结下:
1、在人脸识别过程中,对输入的一个测试样本x,求出它与平均脸的偏差,则在特征脸空间U的投影,可以表示为系数向量y:

U的维数为M×d,X-^-^X的维数为M×1,y的维数d×1。若M为200*200=40000维,取200个主成分,即200个特征向量,则最后投影的系数向量y维数降维200维。
2、根据1中的式子,可以得出:

这里的x就是根据投影系数向量y重构出的人脸图像,丢失了部分图像信息,但不会影响图像质量。

注:在求取特征值和特征向量的过程中,借助了C++ Eigen库,需要自行安装和配置该库。

原创粉丝点击