优化R代码以减少迭代时间

时间:2019-02-28 13:18:29

标签: r optimization parallel-processing query-optimization compiler-optimization

我已经编写了一个代码来对三个参数进行数值优化。我的问题是,代码使用1h30mins进行一次迭代,并且优化直到150-200次迭代才收敛。我尝试了以下方法来优化代码:

  1. 将参数设置为最佳值“附近”的起始值。
  2. 重写所有for循环以应用
  3. 编译了所有功能以提高速度
  4. 阅读矢量化知识,但不确定是否可以在我的代码中实现。
  5. 已加载的AWS Viritual Machine。我曾尝试在虚拟机上添加GPU,但是代码仍在1h30min上运行。

我现在正在使用的代码:

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在计算能力方面也存在类似的问题。

0 个答案:

没有答案