文章来源:http://blog.csdn.net/xizhibei

=============================

PCA,也就是说,PrincipalComponents Analysis,主成份分析,是个非常优秀的算法。依照书上的说法:

寻找最小均方意义下,最能代表原始数据的投影方法

然后自己的说法就是:主要用于特征的降维

另外。这个算法也有一个经典的应用:人脸识别。这里略微扯一下,无非是把处理好的人脸图片的每一行凑一起作为特征向量。然后用PAC算法降维搞定之。

PCA的主要思想是寻找到数据的主轴方向,由主轴构成一个新的坐标系。这里的维数能够比原维数低,然后数据由原坐标系向新的坐标系投影,这个投影的过程就能够是降维的过程。

推导过程神马的就不扯了。推荐一个课件:http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf,讲得挺具体的

然后说下算法的步骤

1.计算全部样本的均值m和散布矩阵S。所谓散布矩阵同协方差矩阵;
2.计算S的特征值,然后由大到小排序;
3.选择前n'个特征值相应的特征矢量作成一个变换矩阵E=[e1, e2, …, en’]。
4.最后。对于之前每个n维的特征矢量x能够转换为n’维的新特征矢量y:

y = transpose(E)(x-m)

最后还得亲自做下才干记得住:用Python的numpy做的。用C做的话那就是没事找事。太费事了。由于对numpy不熟。以下可能有错误,望各位大大指正

mat = np.load("data.npy")#每一行一个类别数字标记与一个特征向量
data = np.matrix(mat[:,1:])
avg = np.average(data,0)
means = data - avg tmp = np.transpose(means) * means / N #N为特征数量
D,V = np.linalg.eig(tmp)#DV分别相应特征值与特征向量组成的向量,须要注意下的是,结果是自己主动排好序的,再次膜拜numpy OTL
#print V
#print D
E = V[0:100,:]#这里仅仅是简单取前100维数据,实际情况能够考虑取前80%之类的
y = np.matrix(E) * np.transpose(means)#得到降维后的特征向量 np.save("final",y)

另外,须要提一下的是OpenCV(无所不能的OpenCV啊OTL)中有PCA的实现:

void cvCalcPCA( const CvArr* data,//输入数据
CvArr* avg, //平均(输出)
CvArr* eigenvalues, //特征值(输出)
CvArr* eigenvectors, //特征向量(输出)
int flags );//输入数据中的特征向量是怎么放的,比方CV_PCA_DATA_AS_ROW

最后。说下PCA的缺点:PCA将全部的样本(特征向量集合)作为一个总体对待,去寻找一个均方误差最小意义下的最优线性映射投影,而忽略了类别属性,而它所忽略的投影方向有可能刚好包括了重要的可分性信息

嗯,最后的最后——好了,没了,的确是最后了

强烈推荐:一篇能把PAC说得非常透彻的文章《特征向量物理意义》:http://blog.sina.com.cn/s/blog_49a1f42e0100fvdu.html

最新文章

  1. 玩转spring boot——AOP与表单验证
  2. centos下ssh无密码验证
  3. Web 在线文件管理器学习笔记与总结(13)重命名文件夹(14)复制文件夹
  4. JS获取系统的指定定年月日
  5. Lucene使用IKAnalyzer分词实例 及 IKAnalyzer扩展词库
  6. 在SQL脚本中的注释引起的奇怪问题
  7. JQuery或JavaScript获取网页的宽度、高等
  8. jquery1.11做的改变
  9. virus.win32.parite.H查杀病毒的方法
  10. Spring Security(03)——核心类简介
  11. js实现分页
  12. 支付宝当面付开发(java)
  13. USB有时adb shell连不上设备
  14. AI之旅(2):初识线性回归
  15. PCL-Kinfu编译手册
  16. 使用DIV弹出框的代码示例,备忘。
  17. android touch事件分发流程
  18. CentOS7查看CPU个数
  19. 20155209 2016-2017-2 《Java程序设计》第十周学习总结
  20. 【JUC源码解析】ReentrantReadWriteLock

热门文章

  1. php用两个栈来实现队列
  2. 【转】HTML5移动端最新兼容问题解决方案
  3. linux 系统升级中的一些配置
  4. Java基本数据类型之间赋值与运算归纳
  5. source insight 添加自定义macro
  6. ITFriend创业败局(三):技术人员创业,需要尽可能避免,或者需要解决的5个重要问题
  7. sqlplus中登陆账户用@加上数据库sid
  8. c++ try catch 问题(没有throw就会被删除,加上/EHa这样就不会被删除)
  9. [GeekBand] C++继承关系下虚函数内存分布
  10. 【t059】序列