10

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

4

4 回答 4

9

irlba包稀疏矩阵有一个非常快速的 SVD 实现。

于 2013-04-30T20:09:49.473 回答
7

您可以使用http://arxiv.org/abs/0909.4061中所述的随机投影在 R 中做一些非常令人印象深刻的稀疏 SVD

这是一些示例代码:

# 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))
}
于 2011-05-07T20:48:49.550 回答
5

所以这就是我最终要做的。dgCMatrix编写一个将稀疏矩阵(类)转储到 SVDLIBC 的“稀疏文本”格式的文本文件的例程相对简单,然后调用svd可执行文件,并将三个生成的文本文件读回 R。

问题是它的效率非常低 - 我大约需要 10 秒来读取和写入文件,但实际的 SVD 计算只需要大约 0.2 秒左右。不过,这当然比根本无法执行计算要好得多,所以我很高兴。=)

于 2011-02-11T21:39:01.507 回答
3

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

于 2014-04-06T06:54:24.620 回答