PCA降维算法总结以及matlab实现PCA(个人的一点理解)

Matlab中特征降维主成分分析(PCA)使用方法(整套流程) PCA(Principal Component Analysis)主成分分析方法是一种常见的数据降维方法。数据维度过高可能会使得模型效果不佳。PCA主要原理是将高维原数据通过一个转换矩阵,映射到另一组低维坐标系下,从而实现数据降维。... 阅读详情
AI摘要

本文深入浅出地介绍了PCA(主成分分析)的原理及其在人脸识别中的应用,详细解析了MATLAB中princomp函数的使用方法及注意事项。

转载请声明出处。by watkins song

鉴于本文比较混乱, 所以写了一个新的PCA的详细介绍, 请参见: http://blog.youkuaiyun.com/watkinsong/article/details/38536463 

两篇文章各有侧重, 对照看效果更加 o(∩∩)o..


PCA的一些基本资料

最近因为最人脸表情识别,提取的gabor特征太多了,所以需要用PCA进行对提取的特征进行降维。


本来最早的时候我没有打算对提取的gabor特征进行降维,但是如果一个图像时64*64,那么使用五个尺度八个方向的gabor滤波器进行滤波,这样提取的特征足足有64*64*5*8这么多,如果图像稍微大一点,比如128*128的图像,那么直接提取的特征就会几十万,所以不降维的话直接用SVM训练分类器是非常困难的。


所以在这段时间我就学习了一下PCA降维的基本原理和使用方法,网上给出的资料都比较乱,而且很不清楚,经过这几天的学习和测试,终于把调理弄清楚了,给大家分享一下,下面只是我对于PCA的个人理解,肯定有不对的地方,还请各位大牛多多指教。


下面先给出一下PCA的资料地址,都是我收集的:

http://hi.baidu.com/yicomrdztxbeiwd/item/913f28c05cf7ebc4994aa06f

http://blog.sciencenet.cn/blog-265205-544681.html

http://blog.youkuaiyun.com/mpbchina/article/details/7384425

http://blog.sina.com.cn/s/blog_6833a4df0100pvk7.html

http://stackoverflow.com/questions/4991343/matlab-principal-component-analysis-eigenvalues-order

http://stackoverflow.com/questions/10400230/what-is-score-in-princomp

http://www.mathworks.com/matlabcentral/newsreader/view_thread/152608

http://stats.stackexchange.com/questions/27572/matlab-princomp-latent

http://www.nlpca.org/pca-principal-component-analysis-matlab.html

http://www.matlabsky.com/thread-11751-1-1.html

http://stackoverflow.com/questions/10818718/principal-component-analysis

http://www.mathworks.cn/cn/help/stats/princomp.html

http://www.mathworks.cn/cn/help/stats/pca.html#bti6n7k-2

http://lovelittlebean.blog.163.com/blog/static/116582186201181213911729/

http://www.ilovematlab.cn/thread-54493-1-1.html

http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=146626

http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=204069

http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=54600

http://search.discuz.qq.com/s/aa8585553/princomp+%E9%99%8D%E7%BB%B4.html

http://www.ilovematlab.cn/thread-68796-1-1.html

http://www.ilovematlab.cn/thread-209229-1-1.html

http://www.ilovematlab.cn/thread-209229-1-1.html

http://blog.sina.com.cn/s/blog_61c0518f0100f4mi.html

http://blog.youkuaiyun.com/haitao111313/article/details/7875392

http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter11/chapt11_ahz.htm

http://hi.baidu.com/845777018/item/7438e555df1138404fff2011

http://en.wikipedia.org/wiki/Principal_component_analysis

http://baike.baidu.com/view/852194.htm

http://wenku.baidu.com/view/bd9284fcfab069dc51220107.html

http://wenku.baidu.com/view/c0bde56da98271fe910ef9b8.html

http://wenku.baidu.com/view/9f69930790c69ec3d5bb75d3.html

http://www.ilovematlab.cn/thread-54600-1-1.html

http://www.cnblogs.com/sunwufan/archive/2011/08/31/2159952.html

http://zhidao.baidu.com/question/416895922.html

上面的网址都是一些pca原理啊,实现什么的介绍。


具体的PCA的算法的理论基础呢,我这里就不详细说了,因为我也没有看具体详细,所以如果想要彻底的弄明白PCA的工作原来,还是请到wiki上看吧,写的非常清晰,我因为临时用一下,就写个大致的原理就可以了。


PCA原理:


PCA的原理就是将原来的样本数据投影到一个新的空间中,相当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系下。通过一个转换坐标,也可以理解成把一组坐标转换到另外一组坐标系下,但是在新的坐标系下,表示原来的原本不需要那么多的变量,只需要原来样本的最大的一个线性无关组的特征值对应的空间的坐标即可。

比如,原来的样本是30*1000000的维数,就是说我们有30个样本,每个样本有1000000个特征点,这个特征点太多了,我们需要对这些样本的特征点进行降维。那么在降维的时候会计算一个原来样本矩阵的协方差矩阵,这里就是1000000*1000000,当然,这个矩阵太大了,计算的时候有其他的方式进行处理,这里只是讲解基本的原理,然后通过这个1000000*1000000的协方差矩阵计算它的特征值和特征向量,最后获得具有最大特征值的特征向量构成转换矩阵。比如我们的前29个特征值已经能够占到所有特征值的99%以上,那么我们只需要提取前29个特征值对应的特征向量即可。这样就构成了一个1000000*29的转换矩阵,然后用原来的样本乘以这个转换矩阵,就可以得到原来的样本数据在新的特征空间的对应的坐标。30*1000000 * 1000000*29 = 30 *29, 这样原来的训练样本每个样本的特征值的个数就降到了29个。


一般来说,PCA降维后的每个样本的特征的维数,不会超过训练样本的个数,因为超出的特征是没有意义的。


下面是百度百科中对pca降维的一段解释,还是挺清晰的:

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

  当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。”


我对 PCA的一些了解

我的pca迷惑

迷惑一


 刚开始接触PCA的时候,咨询了一个浙大的博士朋友,这朋友告诉我,如果对训练样本进行降维,那么样本的数量必须大于特征的维数,然后我当时就迷惑了,那我怎么办啊,我的人脸表情图像顶多有几百张就算多的了,但是每个图像提取的特征的维数将近有几十万,我不可能找那么多样本去啊。当时有这个迷惑也是因为matlab给出的一个实现在pca降维的函数的说明,就是princomp,这个函数的说明也是用的样本的个数多余特征的维数。后来经过试验是证实,证实了那个浙大的博士的认识是错误的,pca降维肯定不需要样本的个数大于特征的维数,要不然还降维个什么意思。比如我有30*1000000的特征矩阵,那么降维后肯定是每个样本在新的空间中的表示的特征维数不超过30.

迷惑二

   
另外一个迷惑,在最初刚开始做的时候,就是为什么这么大的数据,比如30*1000000直接就降到了30*29,这不是减少的数据有点太多了么,会不会对性能造成影响。之所以有这个迷惑,是因为最初并不了解pca的工作方式。 pca并不是直接对原来的数据进行删减,而是把原来的数据映射到新的一个特征空间中继续表示,所有新的特征空间如果有29维,那么这29维足以能够表示非常非常多的数据,并没有对原来的数据进行删减,只是把原来的数据映射到新的空间中进行表示,所以你的测试样本也要同样的映射到这个空间中进行表示,这样就要求你保存住这个空间坐标转换矩阵,把测试样本同样的转换到相同的坐标空间中。

    有些同学在网上发帖子问对训练样本降维以后,怎么对测试样本降维,是不是还是使用princomp这个函数进行降维,这个是错误的。如果你要保证程序运行正常,就要保证训练样本和测试样本被映射到同一个特征空间,这样才能保证数据的一致性。

迷惑三


网上有不同的pca降维的代码,每个代码也实现的不一样,那么对于同一个数据是否是pca降维以后都是获得相同的数据呢,也就是说不管你用哪种方式进行pca降维,不管你是从哪里下载到的或者自己根据算法实现的pca降维,同样的矩阵降维以后的数据是否一致?这个我个人认为,不同的算法最后导致的pca降维的数据肯定不一致。因为pca降维以后,只是把原来的数据映射到新的特征空间,所以如果你的算法不同,那么选择的协方差矩阵肯定就不同,最后获得的转换矩阵肯定也不一样。那么训练样本和测试样本和不同的转换矩阵相乘以后最终肯定会获得不同的降维坐标。所以使用不同的算法应该最后不会有相同的坐标结果,这个也是我一直实验的结果,我也使用了matlab自带的princomp降维,并且使用相同的数据使用网上下载的一些降维方法进行降维,得到的数据都不一致。

比如说princomp这个matlab自带的函数,在降维之前就将每一个样本减去了一个所有样本的平均值,也可能有很多样本没有减去平均值。princomp这里使用一行表示一个样本,每行包括这个样本的所有的特征值。而网上大部分都是每一列表示一个样本,这样这一列的所有行都表示这个样本的特征值。网上的程序使用列表示样本是有一定好处的,比如我的样本是1000000*30,总共有30个训练样本,每个样本的特征值个数是1000000,那么这个矩阵获得的协方差矩阵是30*30,计算起来非常的方便,不想30*1000000这样的矩阵获得到的协方差矩阵式1000000*1000000,直接就内存溢出了,不过matlab有自己的实现方式,巧妙的解决了这个问题。


pca的实现(matlab)


我在网上看了很多pca降维的例子,都大同小异,原理差不多,都是活的原来矩阵的协方差矩阵,然后计算协方差矩阵的特征值和特征向量,最后通过特征向量的根据特征值由大到小的排序进行KL变换神马的获得一个转换矩阵。

1. matlab自带的实现方式


 PCA在matlab中的实现举例
  以下资料来自matlab的help,翻译和注解部分由笔者添加:(重点部分添加了翻译!)
   princomp-----函数名称
  Principal component analysis (PCA) on data
  Syntax------函数调用语法
  [COEFF,SCORE] = princomp(X)
  [COEFF,SCORE,latent] = princomp(X)
  [COEFF,SCORE,latent,tsquare] = princomp(X)
  [...] = princomp(X,'econ')
   Description -----函数描述
   COEFF = princomp(X)  performs principal components analysis (PCA) on the n-by-p data matrix X, and returns the principal component coefficients, also known as loadings. Rows of X correspond to observations, columns to variables. COEFF is a p-by-p matrix, each column containing coefficients for one principal component. The columns are in order of decreasing component variance.
  在n行p列的数据集X上做主成分分析。返回主成分系数。X的每行表示一个样本的观测值,每一列表示特征变量。COEFF是一个p行p列的矩阵,每一列包含一个主成分的系数,列是按主成分变量递减顺序排列。(按照这个翻译很难理解,其实COEFF是X矩阵所对应的协方差阵V的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,COEFF每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序,后面有具体例子解释,见 说明1 )
  princomp centers X by subtracting off column means, but does not rescale the columns of X. To perform principal components analysis with standardized variables, that is, based on correlations, use princomp(zscore(X)). To perform principal components analysis directly on a covariance or correlation matrix, use pcacov.
  计算PCA的时候,MATLAB自动对列进行了去均值的操作,但是并不对数据进行规格化,如果要规格化的话,用princomp(zscore(X))。另外,如果直接有现成的协方差阵,用函数pcacov来计算。
   [COEFF,SCORE] = princomp(X)  returns SCORE, the principal component scores; that is, the representation of X in the principal component space. Rows of SCORE correspond to observations, columns to components.
  返回的SCORE是对主分的打分,也就是说原X矩阵在主成分空间的表示。SCORE每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。
   [COEFF,SCORE,latent] = princomp(X)  returns latent, a vector containing the eigenvalues of the covariance matrix of X.
  返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量。
   [COEFF,SCORE,latent,tsquare] = princomp(X)  returns tsquare, which contains Hotelling's T2 statistic for each data point.
  返回的tsquare,是表示对每个样本点Hotelling的T方统计量(我也不很清楚是什么东东)。
  The scores are the data formed by transforming the original data into the space of the principal components. The values of the vector latent are the variance of the columns of SCORE. Hotelling's T2 is a measure of the multivariate distance of each observation from the center of the data set.
  所得的分(scores)表示由原数据X转变到主成分空间所得到的数据。latent向量的值表示SCORE矩阵每列的方差(见 说明2 )。Hotelling的T方是用来衡量多变量间的距离,这个距离是指样本观测值到数据集中心的距离。
  When n <= p, SCORE(:,n:p) and latent(n:p) are necessarily zero, and the columns of COEFF(:,n:p) define directions that are orthogonal to X.
   [...] = princomp(X,'econ')  returns only the elements of latent that are not necessarily zero, and the corresponding columns of COEFF and SCORE, that is, when n <= p, only the first n-1. This can be significantly faster when p is much larger than n.
  当维数p超过样本个数n的时候,用[...] = princomp(X,'econ')来计算,这样会显著提高计算速度
   Examples--举例
  (上面说了那么多废话,看了还不一定懂,还不如举例容易理解,下面样本数据集为ingredients,这个数据集是matlab自带的)
  Compute principal components for the ingredients data in the Hald data set, and the variance accounted for by each component.
  load hald; %载入matlab内部数据
  [pc,score,latent,tsquare] = princomp(ingredients); %调用pca分析函数
  ingredients,score,pc,latent,tsquare %显示得到的结果
  ingredients =
  7 26 6 60
  1 29 15 52
  11 56 8 20
  11 31 8 47
  7 52 6 33
在matlab中实现PCA算法 SCORE是对主成分的打分,也就是说原X矩阵在主成分空间的表示。每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。(相当于上面程序中的S)COEFF是X矩阵所对应的协方差阵的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序。latent是一个向量,它是X所对应的协方差矩阵的特征值向量。计算PCA的时候,如果直接有现成的协方差阵,用函数pcacov来计算。相当于上面程序中的V,它表示的是主成分的系数。 阅读详情

相关推荐

Java数组

Java数组

m0_64879847的博客 1005

Vivado新手必看:5分钟搞定FPGA程序固化到Flash(附MCS文件生成全流程)

本文为FPGA新手详细解析了如何将程序固化到Flash存储器的完整流程。核心在于理解SRAM工艺FPGA断电易失的特性,并利用Vivado工具将比特流文件转换为Flash可识别的MCS文件。文章重点拆解了生成MCS文件的关键配置步骤、硬件连接要点,以及通过JTAG烧写Flash的实战操作,并提供了常见启动失败问题的排查清单,帮助开发者实现设计从调试到产品部署的关键跨越。

weixin_29230901的博客 350

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 401

Android 12.0 系统开机设置默认横屏显示

在12.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从两部分来实现,一部分是开机动画横屏显示,另一部分是系统显示横屏显示,从这两方面就可以做到开机默认横屏显示了。

安卓兼职framework和app工程师的博客 3743

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1388

【实战教程】OpenClaw接入MySQL数据库实战指南

本文介绍了在虚拟机Ubuntu中访问宿主机Win11中MySQL数据库的配置方法,重点包括创建远程用户、权限配置和安全设置。首先在MySQL中创建具有只读权限的用户并刷新权限,然后调整服务器设置允许远程连接。文章还提供了某金融机构财富管理系统的数据库设计方案,包含理财产品表、客户表和份额表的核心结构,其中金额字段使用DECIMAL类型确保精度,并设置唯一键约束。文末强调测试环境配置完成后应恢复安全更新模式以保障生产环境安全。

海兰 8696

华为OD机考双机位C卷 - 构成正方形的数量 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 成正方形的数量 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 5938

手把手教你学SOME/IP「1.0•概述」

本文介绍了SOME/IP协议的基本概念和主要特点。SOME/IP全称为"Scalable service-Oriented MiddlewarE over IP",是一种面向服务的车载嵌入式通信协议,支持远程过程调用、事件通知等功能。文章指出SOME/IP是AUTOSAR标准的一部分,在车载以太网架构中处于应用层位置,负责服务调度和通信封装。协议具有可扩展性强、资源消耗低、兼容性好等优势,能满足汽车电子领域对实时性、可靠性的严格要求。同时,文章也说明了SOME/IP的正确书写规范,并解释

nihaoljq2010的博客 676

“/usr/lib/wsl/wsl-setup“ failed, exiting

WSL2安装Ubuntu时出现"wsl-setup failed"错误的解决方法 摘要:当Windows用户名包含中文字符时,安装WSL2+Ubuntu会出现"wsl-setup failed"错误。本文提供两种解决方案:1)修改中文用户名(风险较大);2)通过命令手动配置。推荐第二种方法:先使用"wsl -l -v"查看Ubuntu名称,再通过"wsl -d Ubuntu20.04 -e /bin/bash"命令启动WSL2系

猿小白的博客 993

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 使用matlab对训练样本图像降维,并对测试图像使用变换矩阵降维并重构
下一篇: 整理一些网络上的PCA算法,供大家参考
watkins
博客等级 码龄18年 1277粉丝 246原创
评论 81
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值