2

I have a matrix M of m*n dimension. M contains n number of data each has m dimension and m is very very large than n.

Now my question is, how to compute or what are the steps or procedure to find PCA of M using SVD in OpenCV keeping only those eigenvectors containing 99% of total load or energy ?

4

2 回答 2

4

您需要首先从数据矩阵 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 即 99% 的方差/能量的前 k 个。

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

于 2013-04-18T08:26:47.750 回答
2

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

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

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

对于使用 OpenCV 的 PCA,Google 提供了一些非常有用的示例

于 2013-04-18T06:12:39.817 回答