目前在项目中需要对模型的位置进行矫正,想到了使用主成分分析,提取主方向,将模型方向进行变换得到正确的方向。以下对PCA过程首先在matlab中进行实现,然后在C++矩阵库Eigen中实现,总体较为简单。
PCA实现和应用
PCA理论
PCA(Principal component analysis)
主成分分析, 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分[参考百度百科]。通俗来讲,PCA就是将数据从一个空间映射到一个各个维度不相关的一个空间,这样就提取了主方向。
比如下面的数据:
如果以xy两维【垂直和水平的轴】,来描述数据,我们发现数据相差较近,方差较小,不易区分。因此我们求取主成分,变换后的空间的主轴是如图所示的椭圆的两个轴。如果压缩到一维的空间,我们可以只选取长轴,这样也尽可能多的表达原数据的方差;如果选取两个轴,我们将各个方向的方差达到了最大,将原数据尽可能区分。
计算协方差矩阵
进行PCA计算的第一步是计算协方差矩阵,协方差是数据每一个维度之间的相互关系,计算公式如下:
我们可以应用以上任意一个公式进行计算,但注意样本方差和总体方差的转化【会在后面代码中提示,但博主也不完全清楚其中的理论==】
PCA过程
- 计算协方差矩阵的特征向量和特征值
- 对特征向量进行排序,降序排序
- 按照特征值的顺序对特征向量进行排序,组成变换矩阵【这里我们可以选取需要保留的维度个数】
- 对原数据进行变换
MATLAB实现
求协方差矩阵
这里提供了三种方式:
1. 使用matlab自带的求协方差矩阵
2. 分别使用以上的两个公式
// 初步展示
data = rand(