zoukankan      html  css  js  c++  java
  • PCA算法

    本文出处:http://blog.csdn.net/xizhibei

    http://www.cnblogs.com/bourneli/p/3624073.html

    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 plaincopyprint?
     
    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将所有的样本(特征向量集合)作为一个整体对待,去寻找一个均方误差最小意义下的最优线性映射投影,而忽略了类别属性,而它所忽略的投影方向有可能刚好包含了重要的可分性信息

    PCA假设

    1. 变量符合高斯分布(正太分布)

    2. 变量之间的影响是线性的,也就是可以通过线性变化将数据还原成主要因数

    3. 协方差最大的元素对应的转换向量越重要

    4. 转换矩阵是正交的

    PCA的整个推导过程都是遵循上面的四条假设,如果违反了这些假设,PCA可能作用不大,甚至有反作用,所以使用PCA时需要谨慎。

    PCA最佳实践

    1. 压缩数据,主成份一般在90%,95%和99%几档,根据实际需要选取
    2. 加速模型建模,缩短时间(PCA处理后,建模,需要保留转换向量P,并用P处理预测数据)
    3. 可视化,如果前两个或三个数据可以表示90%以上的成分,那么可以进行可视化
    4. PCA处理数据之前需要去报每个列的均值为0(mean normalization),同时需要确保量纲相同(scaling),否则数值较大的几个变量会占据主要成分。
    5. 不要将PCA作为解决过拟合的方法,虽然使用PCA后,确实可以减少过拟合,但是原因可能是feature减少了。采用regulations缓解过拟合。
    6. 设计ML系统时,不要一开始就期望使用PCA,提高模型性能。只有当所有非PCA方法无法达到效果时,在使用PCA。PCA处理数据时没有考虑到y,会损失部分有价值信息

    参考资料

    [1]       PCA维基百科

    [2]       PCA R示例(英文)

    [3]       PCA数学原理:深入浅出,值得一读

    [4]       最后那幅宇宙图片的例子很形象

    [5]       Google研究员Jon Shlens的PCA原理介绍论文(英文)

    [6]       Week 8 in Machine Learning, by Andrew NG, Coursera

  • 相关阅读:
    如何得到运行程序的路径,以及如何得到路径的文件夹,文件名,以及类型等等信息
    STL的心得(4)运用(MFC)
    STL的心得(3)---运用(控制台)
    【Css】清除浮动,独占一行
    [Html]加链接提示
    【JS】清除子节点
    【CSS】使Div在父元素中水平居中
    [JS]回前页
    【JS】鼠标移动到链接上变手型
    【jQuery】改变控件的使能状态
  • 原文地址:https://www.cnblogs.com/viviancc/p/4139201.html
Copyright © 2011-2022 走看看