关于PCA算法的一点学习总结

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不熟,下面可能有错误,望各位大大指正

[python]  view plain copy print ?
  1. mat = np.load("data.npy")#每一行一个类别数字标记与一个特征向量  
  2. data = np.matrix(mat[:,1:])  
  3. avg = np.average(data,0)  
  4. means = data - avg  
  5.   
  6. tmp = np.transpose(means) * means / N #N为特征数量  
  7. D,V = np.linalg.eig(tmp)#DV分别对应特征值与特征向量组成的向量,需要注意下的是,结果是自动排好序的,再次膜拜numpy  OTL  
  8. #print V  
  9. #print D  
  10. E = V[0:100,:]#这里只是简单取前100维数据,实际情况可以考虑取前80%之类的  
  11. y = np.matrix(E) * np.transpose(means)#得到降维后的特征向量  
  12.   
  13. np.save("final",y)  


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

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


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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值