我有一个像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]
的含义是什么?
答案 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会占用更多内存的原因是因为你有大量具有少量特征的数据点。协方差矩阵找到特征对之间的协方差。如果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之间的链接的更多信息,请参阅此帖子的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 mapping的this post,可能会帮助您获得更多背景信息。