【问题标题】:PCA using SVD in OpenCV在 OpenCV 中使用 SVD 的 PCA
【发布时间】:2013-04-18 06:00:51
【问题描述】:

我有一个 m*n 维度的矩阵 M。 M 包含 n 个数据,每个数据有 m 个维度,并且 m 比 n 非常非常大。

现在我的问题是,如何在 中使用 SVD 计算或找到 M 的 PCA 的步骤或过程是什么OpenCV 只保留那些包含 99% 总负载或能量的特征向量?

【问题讨论】:

    标签: opencv image-processing artificial-intelligence emgucv


    【解决方案1】:

    您需要首先从数据矩阵 M 计算协方差矩阵 C。您可以使用 OpenCV 的 calcCovarMatrix 函数或简单地计算 C = (M - mu)' x (M - mu),其中我假设您的数据样本存储为 M 中的行,mu 是数据样本的平均值,A' 是矩阵 A 转置。

    接下来,对 C 执行 SVD 得到 USU' = SVD(C),其中 U' 是 U 转置。在这种情况下,来自 SVD 的 V' 与 U' 相同,因为 C 是对称的并且是正定的(如果 C 是满秩的)或半定的(如果它是秩不足的)。 U 包含 C 的特征向量。

    您想要做的是保留 k 个特征向量,即 k 个列(或行?您必须检查 OpenCV 文档是否将特征向量作为行或列返回),其对应的奇异值在矩阵中S 对应于 k 个最大奇异值,它们的总和除以所有奇异值的总和 >= 0.99。基本上,这里的奇异值对应于特征向量中每个对应特征的方差,并且您保留保留 0.99 的前 k 个,即 99% 的方差/能量。

    这些特征向量组合成一个矩阵,比如 Uk,就是你的 PCA 基数。因为这些特征向量也恰好相互正交,所以 Uk 的转置,Uk',就是投影矩阵。要得到一个新的测试样本x的降维点,只需计算x_reduced = Uk'*(x - mu);

    【讨论】:

      【解决方案2】:

      通常,对于 PCA(即不特定于 OpenCV),您将从协方差矩阵开始。因此,在您的情况下,输入将是由原始样本的组件方差形成的 m*m 方阵。

      然后你对(非常大的)方形对称矩阵进行特征向量分解,并且可以提取你需要的最上面的特征向量。使用相应的特征值来确定您的百分比方差覆盖率。

      如果您的原始变量的比例不相似 - 即您没有对数据进行归一化 - 您可以使用相关矩阵而不是协方差矩阵。

      对于使用 OpenCV 的 PCA,Google 给出了some very usefule examples

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 2012-08-15
        • 1970-01-01
        • 2018-03-06
        相关资源
        最近更新 更多