首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型稀疏矩阵分解

大型稀疏矩阵分解
EN

Stack Overflow用户
提问于 2015-01-03 16:32:40
回答 2查看 1.6K关注 0票数 2

我如何在一个非常稀疏的维数矩阵上运行svd和nmf,例如,70000 x 70000?此矩阵的稀疏版本可以存储为磁盘上小于700 m的二进制文件。我是否可以将其分解为稀疏格式(比如磁盘上的文件或内存中的可存储文件),而不需要重构整个矩阵,这将不可能存储在内存中(甚至很难存储在磁盘上)?

我知道R中有irlba,python中有sklearn和pymf。但他们似乎需要重建矩阵?svd的问题是,我不能保存矩阵S、V和D,但如果我指定一个K,只保存与k-最大特征值对应的矩阵S_k、V_k和D_k,又该怎么办?至于nmf,我想将它分解为秩= 100的W,它可以存储在内存中。

如果有特定的方法,那么计算svd和nmf的预期时间是多少?任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2015-01-28 15:47:34

您可以尝试使用rARPACK包,它提供了在稀疏矩阵上工作的svds()函数,并且只允许检索几个奇异值/向量。

有关一些示例,请参阅自述文件页面。

票数 0
EN

Stack Overflow用户

发布于 2021-08-26 17:42:07

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

GitHub: github.com/zdebruine/RcppML

代码语言:javascript
复制
install.packages("RcppML")
devtools::install_github("zdebruine/RcppML")

您并没有说矩阵有多稀疏,但是根据您引用的文件大小,我猜它可以在1到5分钟内分解到HPC上,具有很好的容忍度。

我一直在使用RcppML::nmf分解数以百万计的单个细胞的数据集,在一台HPC上用15,000个基因(95%稀疏)进行分解。它的速度几乎和等效的irlba一样快。

RcppML::nmf中,确实需要加载R矩阵,但不会再次在内存中复制(设置update_in_place = TRUE以避免转换并将副本存储在内存中)。正确的是,许多实现(包括python中的实现)创建了矩阵的副本。而且,使用RcppArmadillo或RcppEigen的任何R包都可能使用arma::SpMatEigen::SparseMatrix Rcpp类,这些类需要深入复制。在700 in时,您应该能够将矩阵存储在内存中,否则只需使用HPC即可。

我知道的下一个最佳算法是rsparse::WRMF R包。它也很好,但是把R向量的浅层拷贝到Armadillo向量中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27756962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档