//主成分分析类
class CV_EXPORTS PCA
{
public:
PCA(); //默认构造函数
//构造函数
PCA(InputArray data, //进行PCA变换的数据矩阵
InputArray mean, //平均值(可选),如果此项为空,均值根据data计算。
int flags, //data的存储方式,为CV_PCA_DATA_AS_ROW每行为一个样本,为CV_PCA_DATA_AS_COL,每列为一个样本
int maxComponents=0); //计算时保留的最大主成分的个数。如果是缺省值,则表示所有的成分都保留
PCA(InputArray data, //同上
InputArray mean, //同上
int flags, //同上
double retainedVariance); //保留多少特征值,百分比,默认全保留
PCA& operator()(InputArray data, InputArray mean, int flags, int maxComponents=0);
PCA& computeVar(InputArray data, InputArray mean, int flags, double retainedVariance);
//该函数的作用是将输入的原始数据投影到PCA主成分空间中去,返回每一个样本主成分特征组成的矩阵。因为经过PCA处理后,原始数据的维数降低了,因此原始数据集中的每一个样本的维数都变了,由改///变后的样本集就组成了本函数的返回值。该方法将的一个或多个向量投影到主成分的子空间,每个矢量投影是由在主成分基的系数来表示。该方法的第一形式返回,第二种形式写入到结果矩阵。因此,第一//个形式可以用表达式的一部分,而第二形式可以是在一个处理循环时更有效。PCA::project()输出的结果,就是降维后的数据。
Mat project(InputArray vec) const;
void project(InputArray vec,
OutputArray result) const; //输出矩阵,如果值CV_PCA_DATA_AS_COL,输出矩阵与输入向量的的列数相同,这意味着,结果.列==原始数据.列;行数为主成分个数
//进行project之后的数据,反映摄到原始数据。 PCA::project()的逆运算。由主成成分向量重构原始数据集。只有当主成成分全部保留时,重构的数据和原始数据一样。但通常,如果主成成分数量是足 //够大,差别是很小的。
Mat backProject(InputArray vec) const; //vec为PCA::project()的输出结果
void backProject(InputArray vec,
OutputArray result) const;//重构的矩阵,大小与PCA::project() 输出结果一样
Mat eigenvectors; //协方差矩阵的特征向量
Mat eigenvalues; //协方差矩阵的特征值
Mat mean; //原始数据的均值(矩阵的每一行或列为一个样本)
};
主成成分的实现(opencv)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#define ROWS 6
#define COLS 7
void main()
{
//带降维的原始数据
Mat Data_mat=(Mat_<float>(ROWS,COLS)<<
10.5, 10.4, 4.0, 9.7, 10.8, 14.2, 14.2,
10.8, 9.5, 5.7, 1.7, 16.7, 14.6, 16.4,
10.8, 7.4, 5.2, 9.2, 9.5, 13.6, 12.3,
9.4, 6.0, 4.2, 7.8, 9.1, 9.3, 14.3,
11.8, 7.7, 5.0, 8.1, 9.4, 12.0, 13.6,
11.8, 9.8, 4.4, 2.7, 9.6, 11.3, 13.4 );
PCA pca(Data_mat,
cv::Mat(),
CV_PCA_DATA_AS_COL, //每一列为一个样本
0.9); //保留多少特征值,百分比,默认全保留
Mat dst=pca.project(Data_mat); // 数据降维,dst即为主成成分数据
Mat src=pca.backProject(dst); //重构原始数据,可以看出src与原始数据很相似
cout<<"dst:"<<dst<<endl;
cout<<"src:"<<src<<endl;
system("pause");
}
PCA算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵 C=1mXXT 注:这里的协方差矩阵指的是样本协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6) Y=PX 即为降维到k维后的数据
更多资源:
[1]PCA数学原理:http://blog.codinglabs.org/articles/pca-tutorial.html
[2]http://blog.csdn.net/yutianzuijin/article/details/10823985
[3]http://blog.csdn.net/porly/article/details/7874701