2

そこに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)
  }

これを自分のデータセットで実行しようとすると、システムが狂ったようにスラッシングしてスワップしました。これには単純な理由があることに気付きました。ファイル freq-matrix には大きな (22GB) 行列が含まれており、それをメモリに読み込もうとしていたのです。

私はMatrixパッケージを使用するように言われました。なぜなら、freq-matrix には至る所に非常に多くのゼロがあり、そのようなケースをうまく処理できるからです。それは役に立ちますか?もしそうなら、このコードを変更する方法についてのヒントは大歓迎です。私は R の経験がなく、サイトで入手できる紹介 PDF を読み始めたところです。

どうもありがとう

~l

4

2 に答える 2

1

ファイルの内容について十分な詳細を提供していないため、私の提案は完全に外れている可能性があり、コードから推測する必要がありました。とにかく、ここに行きます。

あなたはそれを述べていませんが、大きなマトリックスを読み込むと、コードが2行目でクラッシュすると思います。ループは一度に 1 つずつ行を読み取り、クラッシュすることはありません。大きな行列が必要な唯一の理由は、WordProbs ベクトルを計算するためです。では、 を使用して同じループを使用して、その部分を書き直してはscanどうでしょうか。WordProbs実際、ベクトルを保存する必要さえないかもしれません。ただsum(WordFreq)、hte ファイルの最初の実行を使用して取得できます。次に、ループ内の式を書き直して、電流を計算しますWordProb

于 2010-02-04T16:21:21.307 に答える
0

遅ればせながら、bigmemoryパッケージを使用してデータをメモリ マップ ファイルに読み込むことをお勧めします。その後、3 列の行列 (ix_row, ix_col, value) として表すことができるゼロ以外のエントリを探します。名前は重要ではありませんが、これは座標オブジェクト リスト (COO) と呼ばれます。そこからMatrix、疎行列の作成をサポートします ( 経由sparseMatrix)。COO を取得した後は、ほとんど準備が整っています。スパース マトリックス形式との間の変換はかなり高速です。行列を乗算すると、Betaかなり高速になるはずです。さらに高速化が必要な場合は、最適化された BLAS ライブラリを使用できますが、それにはさらに疑問が生じます。:)

于 2011-11-01T21:29:01.260 に答える