2014-02-11 265 views
2

我试图运行大型(120k x 600k)和稀疏(非空值的0,1%)矩阵M的全SVD。由于内存限制,我之前的所有尝试都失败了(使用SVDLIBC,Octave和R),我几乎(已经)放弃了探索解决我的问题的其他方法(LSA)。然而,此刻,我只对对角矩阵S的特征值感兴趣,而不是在左/右奇异向量(矩阵U和V)中感兴趣。大型稀疏矩阵的全SVD(只需要特征值)

有没有一种方法来计算这些奇异值而不在存储器中存储密集矩阵M和/或奇异向量矩阵U和V?

任何帮助将不胜感激。

[编辑]我的服务器配置:3,5GHz/3,9GHz(6个核/ 12线程)的RAM

+1

您可以检查新的'rARPACK'包或'irlba'哪个适用于bigmemory :: big.matrix对象或稀疏矩阵。 – dickoa

+0

我已经检查过这些软件包,但它似乎只适用于需要几个奇异值时... – Pierre

回答

0

128GB寻找的,该含义维基值(从一个SVD decomposition矩阵S的元素)我们得到:

M(上Σ的对角线项中找到) 的非零奇异值都为M * M的非零特征值的平方根和MM *

所以你可以找当然,矩阵A * A'(120k x 120k)的特征值没有明确地建立矩阵。顺便说一句,我不认为你对这样一个尺寸的矩阵的所有特征值(或奇异值)感兴趣。我不认为任何算法会给出足够的准确结果。

+0

谢谢。问题是我正试图应用'特征值一标准'来找到LSA的最佳维度。这种方法需要所有的特征值来计算它们的均值。另外,我宁愿不自己实施所有的矩阵运算。 – Pierre

+1

如果您需要(方形)矩阵的特征值的均值,这很容易。它与矩阵的对角线元素的均值相同(在基础变化下的ivariant)请看这里http://en.wikipedia.org/wiki/Trace_(linear_algebra) – sebas

+0

感谢您指出这一点。它有帮助。然而,看起来,特征值一标准不适用于处理大矩阵(太多维度)。所以我需要尝试一些不同的东西。我正在考虑运行'Scree测试',但在这里我需要尽可能多的特征值... – Pierre

1

您对Fortran的使用感觉如何?我认为你应该可以使用预编译包here和/或here来完成计算。此外,如果您打算使用C++并使用随机和重新正交矩阵进行分解,则可以在名为redsvd的Google代码项目中尝试代码。 (我无法发布链接,因为我没有三个链接的必要声望,但是您可以搜索redsvd并随时查找。)

+0

thanx为您提供帮助。我没有使用Fortran的经验,但redsvd似乎值得一试,因为它非常简单。我会回来的。 – Pierre