【问题标题】:PCA output eigenvectors and eigenvaluesPCA 输出特征向量和特征值
【发布时间】:2015-08-31 14:29:22
【问题描述】:

我在 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 的输出。

谁能澄清我错过了什么?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 2019-04-16
      • 2015-11-01
      • 1970-01-01
      • 2016-10-11
      • 2021-07-30
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多