PCA实际上是一个求主成分的算法。short for Principal Component Analysis,主成分分析。
周末看了几篇英文的论文关于PCA的解释,我觉得写的很不错,和大家分享一下:
首先我们先给出待处理的数据X矩阵,
输入:X是,m行n列,这里申明一下,基本上论文里默认的是m是数据样本的个数,n是样本数据的特征个数。
输出:Y是我们希望得到的是各不相关的X的成分,当然一般是取协方差特征值比较大的那几个特征向量
下面是简单的推到:
假设一个矩阵P,使得Y = XP,注意,本质上PCA并没有对矩阵X的数据信息有所衰减。
现在就是要求取矩阵P,提前说一下,其实P的本质是所有的列向量都是正交的,且所有的列向量都是X的协方差矩阵的特征向量。P本身是一个正交矩阵()
求解X的协方差矩阵(理解协方差矩阵的关键就在于牢记它的计算是不同维度之间的协方差,而不是不同样本之间)
,公式里的X是已经经过每一个维度的0均值化了:
由此看出S的n×n的一个方阵。
得到协方差矩阵,下面就是求解协方差矩阵的特征值特征向量了。
可以通过SVD进行求解,关于SVD以后再写一篇文章。
假设此时已经求解出,那么特征值组成的一个对角矩阵,
对角矩阵为D,特征向量组成的矩阵是P
此时相当于对S进行对角化,满足:
,P是正交矩阵(针对于复数领域就是酉矩阵)
因为求解出的D的特征值是按照从上到下,或者从左到右,按照递减排序,所以比如要求解输入X的前p个主成份,那么只需要取出P的前p个特征向量,对X进行投影即可
Y = XP,
如果P是所有的成分,那么PCA的功能就是将一组数据解除其内部的相关性,然后输出数据的所有正交基。
以上是最新,下面是之前写的,待更新
算法的过程其实不难,opencv里面其实有详细的讲解,这是链接,可以自己推一遍,我这里就是要写一下我的理解,主要是根据这几篇文章的总结,文章末尾会贴。
首先了解一下KLT(Karhunen-Loeve Transform)
http://fourier.eng.hmc.edu/e161/lectures/klt/node3.html
涉及到的矩阵知识,酉矩阵,厄密矩阵性质:
实际上PCA可以用KLT来完成:
给定样本:X ,所需要得到的低维度的本征向量Y
Y = (KLT)X;
找到协方差矩阵的特征向量和特征值,
取特征值最大的前几位作为主成分
最后是PCA的推导以及计算方式
https://docs.opencv.org/3.4/d1/dee/tutorial_introduction_to_pca.html
最后是基于opencv的源码以及计算结果
细节暂时还没有整理,等到有空再详细整理一遍