Оптимизация кода R для сокращения времени итерации - PullRequest
0 голосов
/ 28 февраля 2019

Я написал код для числовой оптимизации трех параметров.Моя проблема в том, что код использует 1h30mins для одной итерации, и оптимизация не сходится до 150-200 итераций.Я попробовал следующее, чтобы оптимизировать код:

  1. Установить параметры для начального значения, которое находится "рядом" с оптимальным.
  2. Переписал все циклы for для sapply
  3. Скомпилированы все функции для увеличения скорости
  4. Читайте о векторизации, но не уверены, возможно ли это реализовать в моем коде.
  5. Загруженный AWS Viritual Machine.Я попытался добавить графические процессоры к виртуальной машине, но код все еще работает в течение 1 часа 30 минут.

Код, который я использую сейчас:

library(stats4)
library(gamlss.dist)
library(lmtest)
library(pbapply)
library(compiler)

bid <- runif(10000, 1.1,1.55)
participants <- round(runif(10000,5,9))
r = 0.5

foo_inner <- function(i, theta1, theta2, lambda){
    function(N){
    density = (
        (N) *
        (N-1) * 
        (pWEI2(bid[i], theta1, theta2))^(N-2) *
        pWEI2(bid[i], theta1, theta2, lower.tail = FALSE) *
        dWEI2(bid[i], theta1, theta2)) /
        (1-(pWEI2(r, theta1, theta2))^N)

    ngittN =
        dbinom(participants[i], size = N, 
               prob = pWEI2(r, theta1, theta2, lower.tail = FALSE))
    sN = 
        dpois(N, lambda)

    return(density * ngittN * sN)
    }}

foo_outer <- function(theta1, theta2, lambda){
            function(i){
            listeObs <- sapply(participants[i]:20000, foo_inner(i, theta1, theta2, lambda))
            return(sum(listeObs))
            }}

eqThree <- function(theta1, theta2, lambda){
    secondPart <- pbsapply(1:length(bid), foo_outer(theta1, theta2, lambda))

    LL <- -sum(log(secondPart))
    return(LL)
}

foo_inner <- cmpfun(foo_inner)
foo_outer <- cmpfun(foo_outer)
eqThree <- cmpfun(eqThree)
mle <- cmpfun(mle)

result_mle <- mle(minuslogl = eqThree, start=list(theta1 = 1,
                                                  theta2 = 2,
                                                  lambda = 7),
                  method="L-BFGS-B", lower=c(0.1,0.1,5),
                  nobs = length(bid))

Поскольку это одно-Время проекта (с ограниченным временем), я хотел бы избежать написания кода на новом языке (Fortran, C ++).Однако, если это мое единственное решение, у меня, очевидно, нет выбора.

Я хотел бы отметить, что у меня есть опыт написания на Python, но, основываясь на моем первоначальном анализе, Python и R сталкиваются с похожими проблемами, когда дело доходит до вычислительной мощности.

...