2

如何在尺寸极其稀疏的矩阵(例如 70000 x 70000)上运行svdnmf ?该矩阵的稀疏版本可以存储为磁盘上小于 700M 的二进制文件。我可以将它分解为稀疏格式(如磁盘上的文件或可存储在内存中),而不重建无法存储在内存中(甚至难以存储在磁盘上)的整个矩阵吗?

我知道R中有irlbapython中有sklearnpymf。但似乎他们需要重建矩阵?svd的问题是我无法保存矩阵S,V 和 D,但是如果我指定一个 K 并且只保存对应于 k 最大特征值的矩阵S_k、V_k 和 D_k怎么办?至于nmf,我想将其分解为W秩 = 100,可以存储在内存中。

如果有某些方法可以做到这一点,计算svdnmf的预期时间是多少?任何帮助将不胜感激!

4

2 回答 2

0

您可以尝试使用该rARPACK包,它提供了svds()适用于稀疏矩阵的函数,并允许您仅检索几个奇异值/向量。

有关一些示例,请参阅README页面。

于 2015-01-28T15:47:34.127 回答
0

是的,我只是RcppML为此目的编写了 R RcppEigen 包。这是我所知道的稀疏矩阵最快的 NMF 实现。

GitHub:github.com/zdebruine/RcppML

install.packages("RcppML")
devtools::install_github("zdebruine/RcppML")

您没有说您的矩阵有多稀疏,但根据您引用的文件大小,我猜它可以在 HPC 上以非常好的容差在 1-5 分钟内分解。

我一直在使用RcppML::nmfHPC 在几分钟内将数百万个单细胞的数据集分解为 15,000 个基因(95% 稀疏)。它几乎和同等速度一样快irlba

RcppML::nmf中,确实需要加载 R 矩阵,但不会在内存中再次复制(设置update_in_place = TRUE以避免转置并将该副本存储在内存中)。许多实现(包括python中的实现)创建矩阵的副本是正确的。arma::SpMat此外,任何使用 RcppArmadillo或RcppEigen 的 R 包都可能使用Eigen::SparseMatrixRcpp 类,这需要深拷贝。在 700MB 时,您应该能够将矩阵保存在内存中,或者仅使用 HPC。

我知道的下一个最佳算法是rsparse::WRMFR 包。它也非常好,但是将 R 向量的浅拷贝复制到犰狳向量中。

于 2021-08-26T17:42:07.987 回答