Opencv之PCA篇

来源:互联网 发布:网络构建师 编辑:程序博客网 时间:2024/06/05 19:03

 

OpencvPCA

PCAprincipal component analysis)翻译过来就是主分量分析,是一种流行的数据降维方法。通过数据降维可以实现数据的压缩,同时方便数据分析和提高算法的处理速度。PCA的原理就是通过正交变换,最大化样本协方差阵的对角元素,最小化非对角元素。具体的介绍可以参考Shlens, J., A tutorial on principal component analysis. Systems Neurobiology Laboratory, University of California at San Diego, 2005.这个介绍的很不错,从信号处理的角度出发分析了PCA。由于PCA的计算简单,效果显著所以得到很多人的青睐,但是PCA应用本身是基于一定假设的:1.线性。即特征的变换是线性变换,作用有限,目前也有非线性的特征变换kernel PCA2.处理的数据分布式服从指数族概率密度函数,即能通过均值和协方差来表征数据的分布,因为只有在这个情况下信噪比和协方差矩阵才能表示噪声和数据冗余。好在实际应用时,我们碰到的大多数数据是服从高斯分布或近似高斯分布的(这得益与概率论理的中心极限定理,这个概念经常会碰到,多理解理解有好处)。

PCA是一个无参数的数据分析技术,所以变换结果只受样本影响,结果不受经验影响,与用户独立。就是说PCA无法判断哪个特征比较重要,虽然这个特征的方差比较小。所有特征都平等对待,不能发挥出先验知识的作用。而且经过变换后特征的含义也无法与实际相联系,仅仅是个数据上的表示。毕竟天下没有免费的午餐,有得必有失,PCA是得到的便捷多。

在这里顺便提下PCAKL变换、奇异值分解的关系,其实这三个变换殊途同归,都实现相类似的功能。在信号处理中都得到广泛应用,真要说有什么区别就是中间的过程细微区别。奇异值分解个人感觉是矩阵论上的一种矩阵分界方法,并不和实际工程性的技术挂钩,只是很多问题如PCA可以通过奇异值分解的方法得到相同的结果,同时奇异值分解也反映了PCA的不同维度的内在转换关系。这里我有个疑惑:网上有说用奇异值分解方法解PCA会提高速度,但是根据书上说的,用奇异值分解的方法必须先计算协方差矩阵,求解特征值和特征向量,相当于奇异值分解开始了一半就已经解了PCA,何来的奇异值分解更快之说,是不是有别的奇异值分解方法呢?

OPENCVPCA类里提供了PCA的功能,还提供向量投影,和重构的功能,具体可以参考opencv的函数手册,里面的特征向量都是归一化的。输入样本可以是一行一个样本也可以试一列一个样本,感觉行方便点。里面用到了OPENCV  C++接口里面MAT结构,这个挺好用的,大家可以看看,类似与matlab的矩阵,操作更灵活了。在OPENCV2.0里感觉C++接口的函数功能增强了好多,也可能以前没发现。我用PCA做了简单的特征脸提取的DEMO,由于特征向量被归一化了,显示的效果不是很好。如果要用的话,可以到函数里面去改。一张特征脸的图: