gpt4 book ai didi

c++ - PCA 输出特征向量和特征值

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:05 25 4
gpt4 key购买 nike

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

谁能澄清我遗漏了什么?

最佳答案

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

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

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

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

关于c++ - PCA 输出特征向量和特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com