我正在尝试在OpenCv中使用PCA类在我的C ++应用程序中执行主成分分析操作。我是OpenCV的新手,我遇到了问题所以我希望有人可以提供帮助。
我正在Matlab和PCA课上尝试演示示例来检查答案
当我使用2 * 10数据数组和参数(CV_PCA_DATA_AS_COL)
时,这里我有两个维度,所以我希望有2个特征向量,每个都有2个元素,并且这个工作正常如预期的那样结果如Matlab。
但是在使用10 * 2数据阵列时(通常当样本数小于维数)时,我得到(2 * 10)eiegnvector数组。即:10个特征向量,每个有2个元素。这不是预期的,它不是Matlab给出的结果(Matlab给出了10 * 10个特征向量矩阵)。
我不知道为什么我有这些结果,因此我不能在我的应用程序中的主要组件上投射数据,有什么帮助吗?
P.S:我使用的代码:
Mat Mean ;
Mat H(10, 2, CV_32F); // then the matrix is filled by data
PCA pca(H,Mean,CV_PCA_DATA_AS_COL,0) ;
pca.operator()(H,Mean,CV_PCA_DATA_AS_COL,0) ;
cout<<pca.eigenvectors.rows // gives 2 instead of 10
cout<<pca.eigenvectors.cols // gives 10
答案 0 :(得分:1)
我说如下:
如果样本数小于数据维度,那么保留的组件数量将被限制为样本数量。
我们为uni的机械主题做了3x3 PCA,也有一些非线性控制算法使用了类似的方法 - 我的记忆很模糊,但它可能与关于伪逆和非平方矩阵的假设有关...
一旦你深入研究理论 - 网络搜索'pca的样本少于维度' - 它会变得很乱!