【问题标题】:SVD for sparse matrix in RR中稀疏矩阵的SVD
【发布时间】:2011-06-24 11:46:06
【问题描述】:

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

【问题讨论】:

  • 我找不到 R 的任何东西。C、Fortran、Python 等的东西很多。
  • 也许我会试试 SVDLIBC。它构建为一个 C 库,所以如果它运行良好,我将来可以将它包装为一个模块(尽管我的野心可能不会持续那么久,如果历史可以作为指导......)。
  • 这个cran.r-project.org/web/packages/irlba 怎么样?一种快速且节省内存的方法,用于计算大型矩阵的一些近似奇异值和奇异向量。

标签: r sparse-matrix svd


【解决方案1】:

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

【讨论】:

  • 2017 年,rArpack 的 v0.11.0 描述文件说:现在 rARPACK 成为 RSpectra 包的简单外壳。
  • 再过几年,我不得不说 rARPACK 和 RSpectra 是很棒的软件包。 irlba 在我心中占有特殊的位置,但 RSpectra 速度惊人
【解决方案2】:

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

【讨论】:

  • 提到包裹irlba(问题下的第三个)的评论在发布时晚了一年。您的回答重复了 另一年 后的评论...
  • @Ferdinand.kraft 我很抱歉,因为我错过了评论。此页面是搜索“R svd sparse”时的第一个结果,并且考虑到irlba 是稀疏 svd 的最佳 R 包,这似乎是一个合适的答案。如果评论的作者想发表答案,我很乐意投票并删除我的答案。
【解决方案3】:

您可以使用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))
}

【讨论】:

  • 所以我尝试了它,看起来它并没有给出很好的结果,除非我将p 顶起来,在这种情况下它不会节省太多资源。作为测试,我制作了一个随机稀疏的 10000x12000 矩阵,其中 1000 个非零条目采样为 runif(1000),其特征值应该在 0.999 或 1 左右。但是这种方法将前几个特征值显示为 0.8461391, 0.8423876, 0.8353727, 0.8321352, 0.8271768, 0.8203687
  • 阅读原论文。如果您的特征值都大致相同,那么它不会为您节省太多。在这种情况下,您需要对源矩阵进行几次迭代,以获得更好的分布。
  • 在秩有限的测试矩阵上再试一次。
【解决方案4】:

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

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

【讨论】:

  • 在不提供任何示例数据或解决方案代码的情况下给自己打勾似乎违反了 SO 的原则。
  • 我不再在我做这件事的公司工作,所以我无法访问该代码。我的意思是复选标记的意思是“这是我实际最终使用的解决方案”。它与其他建议完全不同,而且实施起来非常简单。要启动,这确实是“错误”的方式,因为它需要编写表示数字矩阵的文本文件。所以我不知道它是否真的值得复制作为例子。
  • 这是一个老问题了。建议现在进入同一领域的任何人都遵循 Zach 在下面使用 irlba 的建议,忽略此答案上的复选标记。
猜你喜欢
  • 2014-07-14
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2013-11-29
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多