我如何在一个非常稀疏的维数矩阵上运行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的预期时间是多少?任何帮助都将不胜感激!
发布于 2015-01-28 15:47:34
您可以尝试使用rARPACK包,它提供了在稀疏矩阵上工作的svds()函数,并且只允许检索几个奇异值/向量。
有关一些示例,请参阅自述文件页面。
发布于 2021-08-26 17:42:07
是的,我刚刚为这个目的编写了RcppML R RcppEigen包。它是我所知道的稀疏矩阵的最快的NMF实现。
GitHub: github.com/zdebruine/RcppML
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::SpMat或Eigen::SparseMatrix Rcpp类,这些类需要深入复制。在700 in时,您应该能够将矩阵存储在内存中,否则只需使用HPC即可。
我知道的下一个最佳算法是rsparse::WRMF R包。它也很好,但是把R向量的浅层拷贝到Armadillo向量中。
https://stackoverflow.com/questions/27756962
复制相似问题