一、简介
PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,在一个大规模数据库中查询一幅相近的图像。通常的方法是对图像库中的图片提取特征,如颜色,纹理,sift,surf,vlad等等,然后将其保存,建立相应的数据索引,然后对要查询的图像提取相应的特征,与数据库中的图像特征对比,找出与之最近的图片。为了提高查询的准确率,通常会提取一些较为复杂的特征,如sift,surf等,一幅图像有很多个这种特征点,每个特征点又有一个相应的描述该特征点的128维的向量,设想如果一幅图像有300个这种特征点,那么该幅图像就有300*vector(128维)个,如果我们数据库中有一百万张图片,这个存储量是相当大的,建立索引也很耗时。因此若我们对每个向量进行PCA处理,将其降维为64维,就能实现节约存储空间啊,加快检索速度的目的。
二、PCA详解
1、原始数据:
假定一组二维数据,如下:
x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]T
y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T
2、计算协方差矩阵
(1)协方差矩阵:
首先给出一个含有n个样本的集合,依次给出数理统计中的一些相关概念:
均值: 标准差: 方差:
标准差和方差一般是用来描述一维数据的,但实际工作中常遇到含有多维数据的数据集,协方差就是一种用来度量两个随机变量关系的统计量,其定义为:
性质:
(X的方差)
需要注意的是,协方差只能处理二维问题,维数多了就需要计算多个协方差,如n维的数据集就需要计算个协方差,因此使用矩阵来组织这些数据。协方差矩阵的定义:
设数据集有三个维度,则协方差矩阵为
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。
(2)协方差矩阵的求法:
协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。下面在matlab中用一个例子进行详细说明:
首先随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。 MySample = fix(rand(10,3)*50)
协方差矩阵是计算不同维度间的协方差。样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:
dim1 = MySample(:,1);
dim2 = MySample(:,2);
dim3 = MySample(:,3);
计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:
sum( (dim1-mean(dim1)) .* (dim2-mean(dim2)) ) / ( size(MySample,1)-1 ) % 得到 74.5333
sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 -10.0889
sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 -10***000
协方差矩阵的对角线就是各个维度上的方差
依次计算:
std(dim1)^2 % 得到 108.3222
std(dim2)^2 % 得到 260.6222
std(dim3)^2 % 得到 94.1778
或调用Matlab自带的cov函数:
cov(MySample)
通常我们使用以下简化方法进行计算:
先让样本矩阵中心化,即每一维度减去该维度的均值,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可。其Matlab代码实现如下:
X = MySample – repmat(mean(MySample),10,1); % 中心化样本矩阵 C = (X’*X)./(size(X,1)-1)
求出样本的协方差矩阵为:
3、计算协方差矩阵的特征向量和特征值
计算特征向量和特征值:
[eigenvectors,eigenvalues] = eig(cov)
4、选择成分组成模式矢量
求出协方差矩阵的特征值及特征向量之后,按照特征值由大到小进行排列,选择了前k个主要成分,降维后的数据仅有k维。
将两个特征矢量两个特征矢量组成模式矢量:
忽略其中较小特征值的一个特征矢量,从而得到如下模式矢量:
5、得到降维后的数据
其中rowFeatureVector是由模式矢量作为列组成的矩阵的转置,因此它的行就是原来的模式矢量,而且对应最大特征值的特征矢量在该矩阵的最上一行。rowdataAdjust是每一维数据减去均值后,所组成矩阵的转置,即数据项目在每一列中,每一行是一维,即,第一行为x维上数据,第二行为y维上的数据。FinalData是最后得到的数据,数据项目在它的列中,维数沿着行。