преобразование фрагмента кода R для использования пакета Matrix? - PullRequest
2 голосов
/ 03 февраля 2010

Я не уверен, что есть пользователи 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)
  }

Когда я попытался запустить это в моем наборе данных, система работала как сумасшедшая. Теперь я понимаю, что у этого есть простая причина: матрица файлов содержит большую (22 ГБ) матрицу, и я пытался прочитать ее в память.

Мне сказали использовать пакет Matrix , потому что freq-matrix имеет много-много нулей повсюду и хорошо обрабатывает такие случаи. Это поможет? Если это так, любые советы о том, как изменить этот код, будут приветствоваться. У меня нет опыта работы с R, и я только начал читать ознакомительный PDF-файл, доступный на сайте.

Большое спасибо

~ л

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Мое предложение может быть полностью отклонено, потому что вы не даете достаточно информации о содержимом ваших файлов, и мне пришлось угадывать из кода.В любом случае, здесь все идет.

Вы не заявляете об этом, но я предполагаю, что ваш код вылетает во второй строке, когда вы читаете в большой матрице.Цикл читает строки по одному, и не должен падать.Единственная причина, по которой вам нужна эта большая матрица - это вычисление вектора WordProbs.Так почему бы вам не переписать эту часть, используя тот же цикл, используя scan?На самом деле, вам, вероятно, даже не нужно хранить вектор WordProbs, просто sum(WordFreq) - вы можете получить это, используя первоначальный прогон файла hte.Затем перепишите формулу в цикле, чтобы вычислить текущий WordProb.

0 голосов
/ 02 ноября 2011

Запоздалый ответ, но я бы порекомендовал прочитать данные в отображенный в память файл, используя пакет bigmemory. После этого я буду искать ненулевые записи, которые затем можно представить в виде матрицы из 3 столбцов: (ix_row, ix_col, value). Это называется списком координатных объектов (COO), хотя имя не имеет значения. Оттуда Matrix поддерживает создание разреженных матриц (через sparseMatrix). После того, как вы получите COO, вы в значительной степени настроены - преобразование в формат с разреженной матрицей происходит достаточно быстро. Умножение матрицы на Beta должно быть достаточно быстрым. Если вам нужна еще большая скорость, вы можете использовать оптимизированную библиотеку BLAS, но это открывает больше вопросов. :)

...