【问题标题】:PCA for data set using Emgu使用 Emgu 进行数据集的 PCA
【发布时间】:2013-02-08 19:39:42
【问题描述】:

我正在尝试对一个数据集执行 PCA,目前我有 8 组数据,对于每条数据,我有 618 条关于它的信息。以下是我到目前为止尝试过的代码:

        double[,] RawData = new double[8, 618];

        for (int i = 0; i < 8; i++)//Copies Data to Emgu Matrix
        {
            for (int j = 0; j < 618; j++)
            {
                double val = Convert.ToDouble(DataList[i][j]);
                RawData.SetValue(val, i, j);
            }
        }

        Matrix<Double> DataMatrix = new Matrix<Double>(RawData);
        Matrix<Double> Mean = new Matrix<Double>(1, 618);
        Matrix<Double> EigenValues = new Matrix<Double>(1, 618);
        Matrix<Double> EigenVectors = new Matrix<Double>(618, 618);

        CvInvoke.cvCalcPCA(DataMatrix, Mean, EigenValues, EigenVectors, Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL);

        Matrix<Double> PC1 = new Matrix<Double>(1, 618);
        for (int i = 0; i < 618; i++)
             PC1[0, i] = EigenVectors[0, i];

        Matrix<Double> Results = new Matrix<Double>(8, 1);

        CvInvoke.cvProjectPCA(DataMatrix, Mean, PC1, Results);

        TestStatus.Items.Add("PCA Projection Results = ");
        for (int i = 0; i < 8; i++)
        {
            TestStatus.Items.Add(Convert.ToString(DataMatrix[i, 0]));
        }

Emgu.CV.Util.CvException: OpenCV: (evals0.cols == 1 || evals0.rows == 1) && ecount0

在 Emgu.CV.CvInvoke.CvErrorHandler(Int32 status, String funcName, String errMsg, String fileName, Int32 line, IntPtr userData)

在 Emgu.CV.CvInvoke.cvCalcPCA(IntPtr 数据,IntPtr avg,IntPtr 特征值,IntPtr 特征向量,PCA_TYPE 标志) 在 f:\Project\Project 3.0\Project 3.0\MainWindow.xaml.cs:line 516 中的 Project_3._0.MainWindow.Capture_3D_Face_Click(Object sender, RoutedEventArgs e) 处

这是由以下行引起的:(在上面的代码中)

        CvInvoke.cvCalcPCA(DataMatrix, Mean, EigenValues, EigenVectors, Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL);

如何正确设置矩阵以使 PCA 发挥作用?

【问题讨论】:

    标签: c# opencv emgucv


    【解决方案1】:

    在你提供的代码中,不应该是这样

    Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_ROW
    

    而不是

    Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL
    

    (注意每个句子的最后 3 个字符)

    【讨论】:

      【解决方案2】:

      您可以查看 emguCV 的源代码并查看错误中提到的行中的哪些条件被触发。由于我只有 OpenCV,我无法提供更多帮助,因为我的 PCA 版本没有这样的断言。

      可能还涉及一些魔术,例如“您必须使用 float 而不是 double”。

      【讨论】:

      • 双打似乎工作正常。我发现这些括号 (1, 618) 应该是 (1,8) 而 (618, 618) 应该是 (8,8)。虽然现在我遇到了 CvInvoke.cvProjectPCA(Data, Mean, EigenVectors, Results); 的问题。你不知道结果矩阵的大小应该是多少?
      • 你的意思是投影矩阵?在OCV PCA Docs 中,它说它将具有与输入矩阵一样多的列,并且行由 maxComponents 或用于创建 PCA 的坐标数绑定,所以我打赌 618。
      • 是的,很抱歉投影矩阵,我尝试创建大小为 (8,8)、(1,8)、(1,618)、(8,618) 和 (618,618) 的矩阵以及所有矩阵的倒数这些。但似乎没有一个工作。到目前为止,我让它工作的唯一方法是作为一个方阵,将所有 618 替换为 8 的值,并将原始特征向量矩阵放入 Project 函数中。
      • 投影矩阵将有 8 列(与数据相同的向量数量)。 documentation 表示结果的列数必须与特征向量相同且行数不得少于特征向量。如我所见,您正试图通过武力解决该问题。您对 PCA 的工作有基本的了解吗?另外,尝试转置特征向量矩阵。文档说它们应该是每行一个向量,并且您从 CalcPCA() 中逐列获取它们。
      • 查看文档,您应该有 eVals(1,8)、eVecs(8,8)、mean(1,618) 到 CalcPCA,并按原样放置均值、eVecs^T 和 eVals进行投影。
      猜你喜欢
      • 2012-09-22
      • 2022-01-11
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多