博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于PCA算法的一点学习总结
阅读量:7058 次
发布时间:2019-06-28

本文共 1419 字,大约阅读时间需要 4 分钟。

本文出处: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 - avgtmp = np.transpose(means) * means / N #N为特征数量D,V = np.linalg.eig(tmp)#DV分别相应特征值与特征向量组成的向量,须要注意下的是,结果是自己主动排好序的,再次膜拜numpy  OTL#print V#print DE = 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说得非常透彻的文章《特征向量物理意义》:

你可能感兴趣的文章
安卓开发中的一些经验总结
查看>>
GAN
查看>>
文件操作
查看>>
Eclipse对于多个Java项目的支持并不友好!
查看>>
Pandas Series数据结构基本操作
查看>>
ubuntu桌面环境配置及切换
查看>>
oracle常用查询三
查看>>
码字定式之SQL(6)
查看>>
命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)...
查看>>
【转】Scheme 编程环境的设置
查看>>
异常分类,异常抛出位置
查看>>
需求分析与原型设计
查看>>
敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
查看>>
代码赏析——史丰收速算
查看>>
oracle恢复误删除表
查看>>
Navicat for MySQL常见命令
查看>>
Threading and Tasks in Chrome
查看>>
七、Maven依赖管理
查看>>
Android 学习
查看>>
工厂模式
查看>>