计算矩形矩阵的{S

时间:2016-07-17 18:21:18

标签: matlab svd

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

我曾尝试使用[U,S,V]=SVD(M),但这样做会减少内存空间。

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

2 个答案:

答案 0 :(得分:2)

找到协方差矩阵的SVD是一种简单地执行Principal Components Analysis或PCA的方法。我不会在这里了解数学细节,但PCA执行所谓的dimensionality reduction。如果您想要更正式的论文,请在此处阅读我的帖子:What does selecting the largest eigenvalues and eigenvectors in the covariance matrix mean in data analysis?。但是,只需将维度减少项目存储在矩阵M中的数据放在具有最小投影误差的较低维度表面上。在此矩阵中,我们假设每列是要素或维度,每行都是数据点。我怀疑你在实际数据矩阵M本身而不是协方差矩阵上应用SVD会占用更多内存的原因是因为你有大量具有少量特征的数据点。协方差矩阵找到特征对之间的协方差。如果Mm 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之间的链接的更多信息,请参阅此帖子的Cross Validated:https://stats.stackexchange.com/q/134282/86678

答案 1 :(得分:0)

而不是[U, S, V] = svd(M),尝试构建49152乘49152(= 18 GB!)的矩阵U,而不是svd(M, 'econ')U。这将返回“economy-class” SVD,其中S将是52乘52,V是52乘52,cov(M)也是52乘52。

cov将移除每个维度的均值并评估内积,为您提供52乘52的协方差矩阵。您可以将自己的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)验证此方法,该cov(M)应该接近cov(M),因为该数组的每个元素都是IID-Gaussian。)

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

正如@rayryeng详细解释的那样,通常人们会看cov(M),因为他们需要cov(M)而不需要评估eig(cov(M)),因为从不想要计算svd(M2, 'econ'):它在数值上不稳定。我最近写了一个答案,在Python中,如何使用M2计算M,其中<div> <p> <strong>Title inside paragraph</strong> </p> <p> some resular text.... </p> </div> <strong>Title</strong> p strong{ padding-top: 50px; padding-right: 30px; padding-bottom: 50px; padding-left: 80px; } 的0均值版本,在实际应用中使用color-to-grayscale mappingthis post,可能会帮助您获得更多背景信息。