【问题标题】:Computing the SVD of a rectangular matrix计算矩形矩阵的 SVD
【发布时间】:2016-07-17 18:21:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab svd


    【解决方案1】:

    求协方差矩阵的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 的排序方式是,第一列是数据的第一个轴,它描述了可能的最大可变性。当您开始进入第二列直至nth 列时,您开始在数据中引入更多轴,并且可变性开始减少。最终,当您点击nth 列时,您实际上是在完整地描述您的数据,而不会减少任何维度。 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

    【讨论】:

    • @kaleem 不客气。如果您不需要更多帮助,请考虑接受我的回答。这可以通过单击我帖子顶部的复选标记图标来完成,该图标位于向上和向下箭头按钮下方的左侧。谢谢,祝你好运!
    • 请回答这个问题 f=sin(2*pi*1000/fsn)+sin(2*pi*2000/fsn)+sin(2*pi *3000/fsn)+sin(2*pi*4000/fsn);其中 fs=9000 和 n=[1:9000]。我的第一个问题是在这种特殊情况下如何限制信号带宽,第二个问题是 n 的长度有什么意义。
    • 我不明白你的问题。该信号理论上是带限的。带宽是具有最大频率的正弦曲线。 n 的重要性允许您生成输出信号。我建议您在提出更多问题之前阅读 MATLAB 教程。
    【解决方案2】:

    而不是 [U, S, V] = svd(M),它会尝试构建矩阵 U,即 49152 x 49152(= 18 GB ?!),请使用 svd(M, 'econ')。这将返回 “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) 是 Hermitian 矩阵,它的左奇异向量和右奇异向量是相同,实际上也是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 均值版本,用于color-to-grayscale mapping 的实际应用,这可能会有所帮助你会得到更多的上下文。

    【讨论】:

    • 您可以将bsxfun 调用更改为使用@minus 而不是@plus。这不是必需的,但对我来说,使用带有负数的 @plus 似乎很奇怪。
    • @rayryeng 我明白你的意思——我一直使用@plus@times 因为我不想跟踪@minus@rdivide 和@ 的方向987654356@ 工作?。我会将答案修改为minus,以鼓励读者不要比我懒惰。它也更快,因为它避免了创建另一个中间数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2014-02-26
    • 2014-07-14
    相关资源
    最近更新 更多