2011-02-09 131 views
10

我在R中有一个稀疏的Matrix,它对我来说运行as.matrix()显然太大了(尽管它也不是超级巨大的)。有问题的as.matrix()调用在svd()函数中,所以我想知道是否有人知道不需要先转换为密集矩阵的SVD的不同实现。用于R中稀疏矩阵的SVD

+0

R找不到任何东西。C,Fortran,Python等有很多东西。 – 2011-02-09 22:38:42

+0

也许我会试用SVDLIBC。它构建为一个C库,所以如果它运行良好,我将来可以将它作为一个模块来包装(尽管我的雄心可能不会持续那么久,如果历史是任何指导的话)。 – 2011-02-10 17:32:25

+2

这个http://cran.r-project.org/web/packages/irlba/如何计算一个快速和有效的记忆方法来计算一些近似奇异值和大矩阵的奇异向量。 – 2012-02-23 08:29:31

回答

10

irlba包具有非常快的SVD实现稀疏矩阵。

6

这就是我最终做的。这是比较简单的编写转储稀疏矩阵(类dgCMatrix)在SVDLIBC的“疏文本”格式的文本文件的程序,然后调用svd可执行文件,并阅读这三个结果的文本文件放回R.

的赶上它是相当低效的 - 我需要大约10秒才能读取&写入文件,但实际的SVD计算仅需要大约0.2秒左右。尽管如此,这当然比不能完成计算要好得多,所以我很高兴。 =)

+0

后续问题张贴在http://stackoverflow.com/questions/5009026/extract-long-from-r-object。 – 2011-02-15 21:11:45

+1

在不提供任何示例数据或解决方案代码的情况下给自己一个复选标记似乎与SO的原理相悖。 – 2012-09-29 15:29:49

8

可以使用随机投影做稀疏SVD的非常可观的位中的R为在http://arxiv.org/abs/0909.4061

这里描述是一些示例代码:

# computes first k singular values of A with corresponding singular vectors 
incore_stoch_svd = function(A, k) { 
    p = 10    # may need a larger value here 
    n = dim(A)[1] 
    m = dim(A)[2] 

    # random projection of A  
    Y = (A %*% matrix(rnorm((k+p) * m), ncol=k+p)) 
    # the left part of the decomposition works for A (approximately) 
    Q = qr.Q(qr(Y)) 
    # taking that off gives us something small to decompose 
    B = t(Q) %*% A 

    # decomposing B gives us singular values and right vectors for A 
    s = svd(B) 
    U = Q %*% s$u 
    # and then we can put it all together for a complete result 
    return (list(u=U, v=s$v, d=s$d)) 
} 
3

rARPACK是您需要的软件包。像魅力一样工作,超快,因为它通过C和C++并行化。