Ускорить это без Rcpp? - PullRequest
       1

Ускорить это без Rcpp?

4 голосов
/ 14 ноября 2011

Я хочу ускорить следующий алгоритм.Я даю функции временной ряд XTS, а затем хочу выполнить анализ главных компонентов для каждого временного отрезка в предыдущих точках X (сейчас я использую 500), а затем использую результаты этого PCA (5 основных компонентов вследующий код) для вычисления некоторого значения.Примерно так:

lookback <- 500
for(i in (lookback+1):nrow(x))
{   
        x.now <- x[(i-lookback):i]        
        x.prcomp <- prcomp(x.now)
        ans[i] <- (some R code on x.prcomp)
}

Я предполагаю, что для этого потребуется, чтобы я скопировал строки просмотра в виде столбцов, чтобы x был похож на cbind(x,lag(x),lag(x,k=2),lag(x,k=3)...lag(x,k=lookback)), а затем запустил prcomp в каждой строке?Это кажется дорогим, хотя.Возможно какой-то вариант apply?Я готов изучить Rcpp, но хотел, чтобы вы, ребята, до этого запускали его.

Редактировать: Ух, спасибо за все ответы.Информация о моем наборе данных / алгоритме:

  1. dim (x.xts) в настоящее время = 2000x24.Но в конечном итоге, если это показывает обещание, оно должно будет работать быстро (я дам ему несколько наборов данных).
  2. func (x.xts) занимает ~ 70 секунд.Это 2000-500 вызовов prcomp с 1500 500x24 созданиями данных.

Я попытался использовать Rprof, чтобы увидеть, какая часть алгоритма была самой дорогой, но я впервые использую Rprof, поэтому яМне нужен еще опыт работы с этим инструментом, чтобы получить понятные результаты (спасибо за предложение).

Я думаю, что сначала я попытаюсь свернуть это в цикл типа _apply, а затем взгляну на распараллеливание.

1 Ответ

2 голосов
/ 15 ноября 2011

На моем 4-ядерном рабочем столе, если это не будет выполнено в разумные сроки, я бы запустил блок, используя что-то вроде (не проверено):

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
lookback <- 500
sfExport(list = c("lookback", "x"))
sfLibrary(xts)

output.object <- sfSapply(x = (lookback+1):nrow(x),
    fun = function(i, my.object = x, lb = lookback) {
        x.now <- my.object[(i-lb):i]      
        x.prcomp <- prcomp(x.now)
        ans <- ("some R code on x.prcomp")

        return(ans)
    }, simplify = FALSE) # or maybe it's TRUE? depends on what ans is
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...