Я написал код для числовой оптимизации трех параметров.Моя проблема в том, что код использует 1h30mins для одной итерации, и оптимизация не сходится до 150-200 итераций.Я попробовал следующее, чтобы оптимизировать код:
- Установить параметры для начального значения, которое находится "рядом" с оптимальным.
- Переписал все циклы for для sapply
- Скомпилированы все функции для увеличения скорости
- Читайте о векторизации, но не уверены, возможно ли это реализовать в моем коде.
- Загруженный 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 сталкиваются с похожими проблемами, когда дело доходит до вычислительной мощности.