【发布时间】: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