PCA输出特征向量和特征值

时间:2015-08-31 14:29:23

标签: c++ opencv

我在Matlab中创建了一个PCA解决方案。我现在正在将它转换为c ++,我使用OpenCV的函数cv::PCA。我在链接中找到的位置可以使用以下方法提取均值,特征值和特征向量:

// Perform a PCA:
cv::PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW, num_components);

// And copy the PCA results:
cv::Mat mean = pca.mean.clone();
cv::Mat eigenvalues = pca.eigenvalues.clone();
cv::Mat eigenvectors = pca.eigenvectors.clone();

编译并运行。但是当我想使用这些值并查看大小和分配时,我得到一个输入data的大小,这似乎很奇怪,即。

cv::Size temp= eigenvectors.size();
//temp has the same size as data.size();

在我看来,特征向量应该由num_components定义,在我的3D空间中,应该只有3x3大小,即9个元素。任何人都可以解释pca.x.clone()的数据大小背后的原因吗?

在opencv和c ++中进行矩阵运算的正确方法是什么,基于文档看起来你可以使用cv::Mat的运算符。使用上面提取的pca信息,你可以这样做:

cv::Mat Z = data - mean; //according to documentation http://stackoverflow.com/questions/10936099/matrix-multiplication-in-opencv
cv::Mat res = Z*eigenvectors;

它在运行时的测试中崩溃了,可能是因为大小的“误解”/“解释”问题。

问题 基本问题是如何正确使用pca opencv函数?

修改 我测试的另一种方法是使用以下代码:

cv::PCA pca_analysis(mat, cv::Mat(), CV_PCA_DATA_AS_ROW, num_components);
cv::Point3d cntr = cv::Point3d(static_cast<double>(pca_analysis.mean.at<double>(0, 0)),
        static_cast<int>(pca_analysis.mean.at<double>(0, 1)), static_cast<double>(pca_analysis.mean.at<double>(0, 2)));
//Store the eigenvalues and eigenvectors
vector<cv::Point3d> eigen_vecs(num_components);
vector<double> eigen_val(num_components);
for (int i = 0; i < num_components; ++i)
{
    eigen_vecs[i] = cv::Point3d(pca_analysis.eigenvectors.at<double>(0, i*num_components),
            pca_analysis.eigenvectors.at<double>(0, i * num_components + 1), pca_analysis.eigenvectors.at<double>(0, i*num_components + 2));
    eigen_val[i] = pca_analysis.eigenvalues.at<double>(0,i);
}

当我将上述代码的结果与我的Matlab实现进行比较时,cntr似乎是合理的(在百分比差异下)。但是当我在调试器中查看它们时,特征向量和特征值只是零。这似乎可以追溯到我最初的如何提取和理解pca输出的问题。

任何人都可以澄清我错过的东西吗?

1 个答案:

答案 0 :(得分:1)

我在搜索如何访问特征值和特征向量时遇到了您的问题。

我个人需要查看完整的信息并希望自己。因此,开发人员可能希望我的用例比您的更有可能。

在任何情况下,当它们被排序时,你可以将第一个'num_components'特征值/特征向量作为你所追求的信息。

此外,从您的角度来看 - 即如果它按预期工作 - 考虑相反:如果您想查看完整信息,您会怎么做?开发人员必须实现一个新参数......