计算矩形矩阵的 SVD

Computing the SVD of a rectangular matrix

我有一个像 M = K x N 这样的矩阵,其中 k 是 49152,是问题的维度,N 是 52,是观察的数量。

我曾尝试使用 [U,S,V]=SVD(M),但这样做我得到的内存较少 space。

我找到了另一个使用 [U,S,V]=SVD(COV(M)) 的代码,它运行良好。我的问题是在 SVD 中使用 COV(M) 命令的含义是什么,结果 [U,S,V] 的含义是什么?

求协方差矩阵的SVD是执行Principal Components Analysis or PCA for short. I won't get into the mathematical details here, but PCA performs what is known as dimensionality reduction. If you like a more formal treatise on the subject, you can read up on my post about it here: 的一种方法。但是,只需将降维将存储在矩阵 M 中的数据投影到具有最少投影误差的低维表面上。在这个矩阵中,我们假设每一列是一个特征或维度,每一行是一个数据点。我怀疑你通过在实际数据矩阵 M 本身而不是协方差矩阵上应用 SVD 来占用更多内存的原因是因为你有大量的数据点和少量的特征。协方差矩阵找到特征对之间的协方差。如果 M 是一个 m x n 矩阵,其中 m 是数据点的总数,n 是特征的总数,那么 cov(M) 实际上会给你n x n 矩阵,因此与 M.

相比,您在少量内存上应用 SVD

至于USV的含义,具体降维来说,V的列就是所谓的主成分。 V 的排序方式是第一列是数据的第一轴,它描述了尽可能多的可变性。当您开始转到第二列直至第 n 列时,您开始在数据中引入更多轴,并且可变性开始降低。最终,当您点击第 n 列时,您实际上是在完整地描述您的数据,而没有减少任何维度。 S 的对角线值表示所谓的 variance explained,它遵循与 V 相同的顺序。当您逐步处理奇异值时,它们会告诉您数据中有多少可变性由每个相应的主成分描述。

要执行降维,您可以采用 U 并乘以 S 或采用 均值减去 的数据并乘以 V。换句话说,假设 X 是矩阵 M,其中每一列都计算了其平均值,并且从 M 的每一列中减去 ,以下关系成立:

US = XV

要实际执行最终的降维,您可以选择 USXV 并保留前 k 列,其中 k 是您的维度总数想保留。 k 的值取决于您的应用程序,但许多人选择 k 作为解释数据中一定百分比变异性的主成分总数。

有关 SVD 和 PCA 之间 link 的更多信息,请参阅交叉验证上的 post:https://stats.stackexchange.com/q/134282/86678

而不是 [U, S, V] = svd(M),它试图构建一个矩阵 U,即 49152 x 49152(= 18 GB!),请执行 svd(M, 'econ')。即 returns “economy-class” SVD,其中 U 将是 52 x 52,S 是 52 x 52,而 V 也是 52 x 52。

cov(M) 将删除每个维度的均值并计算内积,得到一个 52 x 52 的协方差矩阵。您可以实施自己的 cov 版本,称为 mycov,如

function [C] = mycov(M)
  M = bsxfun(@minus, M, mean(M, 1)); % subtract each dimension’s mean over all observations
  C = M' * M / size(M, 1);

(您可以通过查看 mycov(randn(49152, 52)) 来验证它是否有效,它应该接近 eye(52),因为该数组的每个元素都是 IID-Gaussian。)

SVD 和 EVD 之间有许多神奇的线性代数性质和关系(即,奇异值与特征值分解):因为协方差矩阵 cov(M) 是厄米特矩阵,所以它是左和右 -奇异向量是 相同的 ,实际上也是 cov(M) 的特征向量。此外,cov(M) 的奇异值也是它的特征值:因此 svd(cov(M)) 只是获得 eig(cov(M)) 的一种昂贵方式,直到 ±1 并重新排序。

正如@rayryeng 详细解释的那样,通常人们看 svd(M, 'econ') 是因为他们想要 eig(cov(M)) 而不需要评估 cov(M),因为你 永远不会 想要计算 cov(M):它在数值上不稳定。我最近写了一个答案,在 Python 中显示了如何使用 svd(M2, 'econ') 计算 eig(cov(M)),其中 M2M 的 0 均值版本,使用在实际应用中 ,这可能会帮助您获得更多上下文。