【问题标题】:PCA computation on 2D vectors of type double双精度型二维向量的 PCA 计算
【发布时间】:2015-05-03 01:44:41
【问题描述】:

我正在尝试在一个数据集上运行 PCA,该数据集已从文件存储到 2D 矢量中,如下所示:

std::vector<std::vector<double> > tmpVec;
while(std::getline(file, numStream))
{
    std::istringstream buffer(numStream);
    std::vector<double> line((std::istream_iterator<double>(buffer)),
                         std::istream_iterator<double>());
    tmpVec.push_back(line);
    i++;
}

现在我需要对此运行 PCA,据我了解,我需要将其转换为 cv::Mat 类型。这是按如下方式完成的:

cv::Mat dst(row, col, CV_64F, &tmpVec);

然后我在其上运行 PCA:

cv::PCA pca(dst, cv::Mat(), CV_PCA_DATA_AS_ROW, 2);

当我在 PCA 计算后尝试在屏幕上打印出来时,我最终得到了垃圾值。 我只需要弄清楚如何在 2D 双向量上运行 PCA。 对此的任何帮助或指出我正确的方向都会很棒。 提前致谢。

【问题讨论】:

  • "(std::istream_iterator(buffer)), std::istream_iterator()" 看起来不一致。您是否打印了向量和矩阵中的值?
  • 是的,那里的代码运行良好。产生正确的输出。导致问题的是 pca 计算和转换为 cv::Mat。
  • 只是说,std::vector 的地址不是第一个元素的地址...

标签: c++ opencv pca


【解决方案1】:

这个:

cv::PCA pca(dst, cv::Mat(), CV_PCA_DATA_AS_ROW, 2);

期望 cv::Mat 以 连续 数据作为输入,std::vector&lt;std::vector&lt;double&gt; &gt; tmpVec; 不满足这一要求

试试看:

cv::Mat tmp;
while(std::getline(file, numStream))
{
    ...
    cv::Mat m = cv::Mat(line).t();  // we need a row-vec
    tmp.push_back(m);
}
cv::PCA pca(tmp, cv::Mat(), CV_PCA_DATA_AS_ROW, 2);

【讨论】:

  • 您好,感谢您的回答。我还有一个小小的疑问。如果我没记错的话,运行 PCA 应该会减少我的功能集。在这种情况下,我该如何取回减少的特征集数据?
  • 你必须使用 pca.project(features) 来获得减少的功能
  • 所以基本上类似于 pca.project(3)?我想要多少功能?非常感谢您的帮助..
  • cmon, rtfm ;) 输入应该是单行 Mat
猜你喜欢
  • 2017-10-04
  • 2016-11-22
  • 1970-01-01
  • 2021-11-18
  • 2011-03-18
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多