PCA降维在MATLAB上的实现剖析
PCA PCA 降维在降维在 MATLABMATLAB 上的实现上的实现 学学院院计算机科学与技术计算机科学与技术 专专业业计算机科学与技术计算机科学与技术 年年级级20112011 级级 姓姓名名周忠儒周忠儒 / /王云标王云标 学学号号3011121605830111216058/ /051051 指导教师指导教师魏建国魏建国 20142014 年年5 5 月月2828 日日 PCA 降维在 MATLAB 上的实现 一 实验目的. 3 二 实验环境. 3 三 实验原理. 3 1、PCA 降维方法原理 3 2、MATLAB. 3 3、PCA 降维方法详解 4 1) 、原始数据. 4 2)、协方差矩阵的求法. 5 3)、计算协方差矩阵的特征向量和特征值 . 7 4)、选择成分组成模式矢量. 7 5)、得到降维后的数据. 7 四 实验代码详解. 8 五 实验结果. 9 六 实验总结. 9 PCAPCA 降维在降维在 MATLABMATLAB 上的实现上的实现 一一 实验目的实验目的 1 掌握 PCA 降维的基本内容 2 了解 MATLAB 的基本用法 3 用 PCA 降维算法处理图像数据 二二 实验环境实验环境 Matlab 7.0 三三 实验原理实验原理 1 1、、PCAPCA 降维方法原理降维方法原理 PCA 的原理就是将原来的样本数据投影到一个新的空间中,相 当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系 下。通过一个转换坐标,也可以理解成把一组坐标转换到另外一 组坐标系下,但是在新的坐标系下,表示原来的原本不需要那么 多的变量,只需要原来样本的最大的一个线性无关组的特征值对 应的空间的坐标即可。 PCA 即主成分分析,是图像处理中经常用到的降维方法,大家 知道,我们在处理有关数字图像处理方面的问题时,比如经常用 的图像的查询问题,在一个几万或者几百万甚至更大的数据库中 查询一幅相近的图像。这时,我们通常的方法是对图像库中的图 片提取响应的特征,如颜色,纹理,sift,surf,vlad 等等特征, 然后将其保存,建立响应的数据索引,然后对要查询的图像提取 相应的特征,与数据库中的图像特征对比,找出与之最近的图片。 2 2、、MATLABMATLAB MATLAB(矩阵实验室)是 MATrix LABoratory 的缩写,是一款 由美国 The MathWorks 公司出品的商业数学软件。MATLAB 是一种 用于算法开发、数据可视化、数据分析以及数值计算的高级技术 计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常 用功能外, MATLAB 还可以用来创建用户界面及与调用其它语言 (包 括 C,C和 FORTRAN)编写的程序。 3、PCA 降维方法详解 1) 、原始数据 由于本实验数据过于庞大, 为了方便, 我们假定数据是二维的, 借助网络上的一组数据,如下 x[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]Ty[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T 2) 、计算协方差矩阵 (1)协方差矩阵 以下是含有 n 个样本的集合中,一些数理统计的相关概念 均值 标准差 方差 在这里,标准差和方差一般是用来描述一维数据的,但现实生 活我们常常遇到含有多维数据的数据集,例如上学时免不了要统 计多个学科的考试成绩。面对这样的数据集,我们当然可以按照 每一维独立的计算其方差,但是通常我们还想了解这几科成绩之 间的关系,这时,我们就要用协方差,协方差就是一种用来度量 两个随机变量关系的统计量,其定义为 从协方差的定义上我们也可以看出一些显而易见的性质,如 1.covX,YvarX; 2.covX,YvarY,X; 需要注意的是,协方差也只能处理二维问题,那维数多了自然就 需要计算多个协方差,比如 n 维的数据集就需要计算个 协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给 出协方差矩阵的定义 这个定义还是很容易理解的,我们可以举一个简单的三维的例子, 假设数据集有三个维度,则协方差矩阵为 可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上 的方差。 2)、协方差矩阵的求法 协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之 间的。下面我们将在 matlab 中用一个例子进行详细说明 首先,随机产生一个 10*3 维的整数矩阵作为样本集,10 为样本的 个数,3 为样本的维数。MySample fixrand10,3*50 根据公式,计算协方差需要计算均值,那是按行计算均值还是按 列呢,我一开始就老是困扰这个问题。前面我们也特别强调了, 协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样 本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计 算均值。为了描述方便,我们先将三个维度的数据分别赋值 dim1 MySample,1; dim2 MySample,2; dim3 MySample,3; 计算 dim1 与 dim2,dim1 与 dim3,dim2 与 dim3 的协方差 sumdim1-meandim1.*dim2-meandim2/sizeMySample ,1-1 sumdim1-meandim1.*dim3-meandim3/sizeMySample ,1-1 sumdim2-meandim2.*dim3-meandim3/sizeMySample ,1-1 搞清楚了这个后面就容易多了,协方差矩阵的对角线就是各个维 度上的方差,下面我们依次计算 stddim12 stddim22 stddim32 这样,我们就得到了计算协方差矩阵所需要的所有数据,调用 Matlab 自带的 cov 函数进行验证 covMySample 可以看到跟我们计算的结果是一样的,说明我们的计算是正确的。 但是通常我们不用这种方法,而是用下面简化的方法进行计算 1,先让样本矩阵中心化,即每一维度减去该维度的均值。 2,然后直接用新的样本矩阵乘上它的转置。 3,然后除以N-1即可。其实这种方法也是由前面的公式通 道而来,只不过理解起来不是很直观而已。 其 Matlab 代码实现如下 X MySample – repmatmeanMySample,10,1; 中心化样本 矩阵 C X’*X./sizeX,1-1 其中 BrepmatA,m,n将矩阵 A 复制 mn 块。 即把 A 作为 B 的元 素,B 由 mn 个 A 平铺而成。B 的维数是[sizeA,1*m, sizeA,2*n] B meanA的说明 如果你有这样一个矩阵A [1 2 3; 3 3 6; 4 6 8; 4 7 7];用 meanA ( 默 认dim1 ) 就 会 求 每 一