对于一个k维的特征来说,相当于它的每一维特征与其他维都是正交的(相当于在多维坐标系中,坐标轴都是垂直的),那么我们可以变化这些维的坐标系,从而使这个特征在某些维上方差大,而在某些维上方差很小。例如,一个45度倾斜的椭圆,在第一坐标系,如果按照x,y坐标来投影,这些点的x和y的属性很难用于区分他们,因为他们在x,y轴上坐标变化的方差都差不多,我们无法根据这个点的某个x属性来判断这个点是哪个,而如果将坐标轴旋转,以椭圆长轴为x轴,则椭圆在长轴上的分布比较长,方差大,而在短轴上的分布短,方差小,所以可以考虑只保留这些点的长轴属性,来区分椭圆上的点,这样,区分性比x,y轴的方法要好!
所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。
举一个例子:
对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。
当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。
所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。
在opencv里面有专门的函数,可以得到这个这个投影矩阵(特征矩阵)。
void cvCalcPCA( const CvArr* da
来源:http://supeng411.blog.163.com/blog/static/50661522009112292847265/
补充:
It is a way of identifying patterns indata, and expressing the data in such a way as to highlight theirsimilarities and difference.
Method:
step1: Get some data
输入数据
step2:Subtract the mean
将输入的数据,减去均值。这样做使得数据集在各个维度上的均值为零。
step3:Calculate the covariance matrix
计算协方差矩阵
注意,通过这一步计算,可以查看非对角线元素的正负性,他们反映的是维度间的相关性。同时可以发现,计算出来的协方差矩阵是一个对称矩阵。
step4:Calculate the eigenvectors and eigenvalues of thecovariance matrix
计算协方差矩阵的特征向量和特征值
step5:Choosing components and forming a feature vector
将计算得到的特征值排序,选择特征值大的作为主成分,构造一个特征矩阵
In fact, it turns out that the eigenvector with thehighest eigenvalue is the principle component of the data set.
step6:Deriving the new data set
计算得到新 的数据集(即源数据集的投影数据集)
将计算得到的主成分特征向量左乘以原始数据集向量,得到新的(投影后的)数据集。
FinalData = RowFeatureVector*RowDataAdjust
数据恢复:
从上面,最后的数据降维运算等式可知,如果想要恢复数据,那么需要进行如下的操作:
RowDataAdjust = RowFeatureVector^(-1)*FinalData
由于特征向量间是相互正交的一组正交基,因此,对于特征向量的求逆运算,正好等于求转置运算。(可以理解,只有自己与自己相互乘的位置,才不为零。即只有对角线位置的元素乘,不为零)
RowDataAdjust = RowFeatureVector^(T)*FinalData
由于在最初计算的时候,对数据是进行了减去均值操作,因此,想要恢复原始数据,需要在计算出上面的结果后,加上均值矩阵。
RowDataAdjust = RowFeatureVector^(T)*FinalData+ OriginalMean
重要的参考文献;
"Face Recognition:Eigenface, Elastic Matching, andNeural Nets" Digital Image Processing . RafaelC.Gonzalez and Paul Wintz.
PCA的应用
1、模式识别
在模式识别的时候,比如在人脸的识别的时候,可以先将人图像图像的元素构造成一个N^2维的一个行向量,这样可以将获取到的M幅图像,组合成为一个M*N^2的原始图像数据矩阵。这样可以求解得到N^2个特征向量,选取这些特征向量构造成一个特征向量矩阵,然后将这个特征矩阵左乘以原始图像数据矩阵,可以降维得到投影后的图形数据矩阵。然后,在这个投影后的空间中,计算新输入的人脸图像与空间中哪个图像最近,这样实现模式匹配。
因此,在这里,进行PCA降维的目的是为了将获取到的不同人脸数据整体投影到一个新的低维空间中。在新的空间中,比较距离。
2、数据压缩
在进行图像数据压缩的时候,构造的数据矩阵与模式识别时不一样的。因为在这个,需要对不同图像同一位置的像素点所在空间进行投影,因此,如果有M幅图像,那么构造的数据向量每一行的维度为M,表示的是在每个样本图像中的对应于同一点的数据值。那么总共就可以得到N^2个这样的向量,表示出图像中对于任何一点的数据分布。
进行PCA降维的时候,是将每一点的可能分布,从原来的M维降低到新的维度,减少每一个像素点的可能分布空间,从而实现数据的压缩操作。