【问题标题】:converting R code snippet to use the Matrix package?将 R 代码片段转换为使用 Matrix 包?
【发布时间】:2011-01-12 18:20:39
【问题描述】:

我不确定是否有任何 R 用户,但以防万一:

我是 R 的新手,被亲切地“传授”了以下 R 代码 sn-p:

Beta <- exp(as.matrix(read.table('beta.transpose')))
WordFreq <- read.table('freq-matrix')
WordProbs <- WordFreq$V1 / sum(WordFreq)

infile <- file('freq-matrix')
outfile <- file('doc_topic_prob_matrix', 'w')

open(infile)
open(outfile)

for (i in 1:93049) {
  vec <- t(scan(infile, nlines=1))
  topics <- (vec/WordProbs) %*% Beta
  write.table(topics, outfile, append=T, row.names=F, col.names=F)
  }

当我尝试在我的数据集上运行它时,系统像疯了一样颠簸和交换。现在我意识到这有一个简单的原因:文件 freq-matrix 包含一个大 (22GB) 矩阵,我试图将它读入内存。

有人告诉我使用 Matrix 包,因为 freq-matrix 到处都有很多很多零,它可以很好地处理这种情况。那会有帮助吗?如果是这样,任何有关如何更改此代码的提示都将受到欢迎。我没有 R 经验,刚开始阅读网站上提供的介绍 PDF。

非常感谢

~l

【问题讨论】:

  • 如果可能,您应该更改任何创建的频率矩阵以使用更稀疏的表示。例如,查看 Blei 的 LDA-C 包使用的格式。
  • @Jonathan:你也在这里 : )。谢谢你帮助我。 (我只习惯了 SAS 和更小的数据集。)这个巨人被我天真的写的 python 代码吐出来了。我正在阅读 Matrix 包手册,但无法理解如何在未对 22GB 文件执行 read.table() 的情况下构建稀疏矩阵 。 Matrix 构造函数(手册的第 73 页)将我想要稀疏的矩阵作为其参数!当然,我什至无法达到这一点,因为一旦我执行 read.table(),我的机器就会爆炸。
  • 理想情况下,您一开始就不会编写 22 GB 的文件 =)。但是,如果您真的想使用该文件,则必须绕过 read.table 并自己编写一些函数来一次读取几行并将每个块附加到稀疏矩阵。
  • 乔纳森,非常感谢。保证我不会再做22G的事情了。 : ) 这是我第一次。 Matrix 构造函数不允许我创建具有正确尺寸的稀疏矩阵;它抱怨“指定的元素太多”。我试过 m
  • 省略 NA。稀疏值始终为 0,因此如果将其设置为 NA,则会失去稀疏性。

标签: math r matrix sparse-matrix


【解决方案1】:

我的建议可能完全不成立,因为您没有提供有关文件内容的足够详细信息,我不得不从代码中猜测。不管怎样,就这样吧。

您没有说明,但我会假设您的代码在您阅读大矩阵时在第二行崩溃。循环一次读取一行,并且不应该崩溃。您需要这个大矩阵的唯一原因是计算 WordProbs 向量。那么为什么不使用scan 使用相同的循环重写该部分呢?事实上,您可能甚至不需要存储WordProbs 向量,只需存储sum(WordFreq) - 您可以使用初始运行通过hte 文件来获得它。然后重写循环内的公式,计算出当前的WordProb。

【讨论】:

    【解决方案2】:

    迟来的答案,但我建议使用 bigmemory 包将数据读入内存映射文件。之后,我会寻找非零条目,然后可以将其表示为 3 列矩阵:(ix_row, ix_col, value)。这称为坐标对象列表 (COO),尽管名称并不重要。从那里,Matrix 支持创建稀疏矩阵(通过sparseMatrix)。获得 COO 后,您就基本完成了 - 与稀疏矩阵格式的转换相当快。将矩阵乘以Beta 应该相当快。如果您需要更快的速度,您可以使用优化的 BLAS 库,但这会带来更多问题。 :)

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      相关资源
      最近更新 更多