Math 将R代码片段转换为使用矩阵包?

Math 将R代码片段转换为使用矩阵包?,math,r,matrix,sparse-matrix,Math,R,Matrix,Sparse Matrix,我不确定是否有R用户,但以防万一: 我是R方面的新手,并被亲切地“传授”了以下R代码片段: 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

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

我是R方面的新手,并被亲切地“传授”了以下R代码片段:

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)
  }

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


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

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

如果可能,您应该更改创建的频率矩阵以使用更稀疏的表示。例如,请查看Blei的LDA-C软件包使用的格式。@Jonathan:您也在这里:)。谢谢你帮助我。(我只习惯于SAS和更小的数据集)这个巨人是由我天真地编写的python代码吐出来的。我正在阅读Matrix软件包手册,但如果没有对22GB文件执行read.table()操作,就无法理解如何构建稀疏矩阵。矩阵构造器(手册第73页)将我想要稀疏的矩阵作为其参数!当然,我甚至不能做到这一点,因为我的机器在我读了read.table()之后就坏了。理想情况下,您不会首先编写一个22 gb的文件=)。但是如果你真的想处理这个文件,你必须绕过read.table,自己编写一些函数,一次读取几行,然后将每个块附加到稀疏矩阵中。Jonathan,非常感谢。保证我不会再做22克的事了。:)这是我第一次。矩阵构造函数不允许我创建具有正确维度的稀疏矩阵;它抱怨“指定的元素太多”。我试着把NA删掉。稀疏值始终为0,因此如果将其设置为NA,则会丢失稀疏性。