计算矩形矩阵的 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
至于U
、S
和V
的含义,具体降维来说,V
的列就是所谓的主成分。 V
的排序方式是第一列是数据的第一轴,它描述了尽可能多的可变性。当您开始转到第二列直至第 n
列时,您开始在数据中引入更多轴,并且可变性开始降低。最终,当您点击第 n
列时,您实际上是在完整地描述您的数据,而没有减少任何维度。 S
的对角线值表示所谓的 variance explained,它遵循与 V
相同的顺序。当您逐步处理奇异值时,它们会告诉您数据中有多少可变性由每个相应的主成分描述。
要执行降维,您可以采用 U
并乘以 S
或采用 均值减去 的数据并乘以 V
。换句话说,假设 X
是矩阵 M
,其中每一列都计算了其平均值,并且从 M
的每一列中减去 ,以下关系成立:
US = XV
要实际执行最终的降维,您可以选择 US
或 XV
并保留前 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))
,其中 M2
是 M
的 0 均值版本,使用在实际应用中 ,这可能会帮助您获得更多上下文。
我有一个像 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
.
至于U
、S
和V
的含义,具体降维来说,V
的列就是所谓的主成分。 V
的排序方式是第一列是数据的第一轴,它描述了尽可能多的可变性。当您开始转到第二列直至第 n
列时,您开始在数据中引入更多轴,并且可变性开始降低。最终,当您点击第 n
列时,您实际上是在完整地描述您的数据,而没有减少任何维度。 S
的对角线值表示所谓的 variance explained,它遵循与 V
相同的顺序。当您逐步处理奇异值时,它们会告诉您数据中有多少可变性由每个相应的主成分描述。
要执行降维,您可以采用 U
并乘以 S
或采用 均值减去 的数据并乘以 V
。换句话说,假设 X
是矩阵 M
,其中每一列都计算了其平均值,并且从 M
的每一列中减去 ,以下关系成立:
US = XV
要实际执行最终的降维,您可以选择 US
或 XV
并保留前 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))
,其中 M2
是 M
的 0 均值版本,使用在实际应用中