小编sky*_*mma的帖子

R 优化:每次迭代时将值从函数传递到梯度

我有一个正在使用optimxR 中的函数进行优化的函数(我也愿意使用optim,因为我不确定它会对我想做的事情产生影响)。optimx与不使用梯度相比,我传递一个梯度是为了(希望)更快地收敛。函数和梯度都使用许多根据每个新参数集计算的相同量。其中一个量的计算成本非常高,并且每次迭代都必须计算该量两次(一次针对函数,另一次针对梯度),这是多余的。我试图找到一种方法来计算这个数量一次,然后将其传递给函数和梯度。

这就是我正在做的事情。到目前为止,这是可行的,但效率很低:

optfunc<-function(paramvec){
    quant1<-costlyfunction(paramvec) 
    #costlyfunction is a separate function that takes a while to run

    loglikelihood<-sum(quant1)**2 
    #not really squared, but the log likelihood uses quant1 in its calculation

    return(loglikelihood)
}

optgr<-function(paramvec){
    quant1<-costlyfunction(paramvec)
    mygrad<-sum(quant1) #again not the real formula, just for illustration
    return(mygrad)
}

optimx(par=paramvec,fn=optfunc,gr=optgr,method="BFGS")
Run Code Online (Sandbox Code Playgroud)

我试图找到一种方法,quant1每次迭代时只计算一次optimx。看来第一步是将fn和组合gr成一个函数。我认为这个问题的答案可能对我有帮助,所以我将优化重新编码为:

optfngr<-function(){
    quant1<-costlyfunction(paramvec)
    optfunc<-function(paramvec){
        loglikelihood<-sum(quant1)**2
        return(loglikelihood)
    }
    optgr<-function(paramvec){
        mygrad<-sum(quant1)
        return(mygrad)
    }
    return(list(fn = optfunc, gr = optgr))
}

do.call(optimx, …
Run Code Online (Sandbox Code Playgroud)

optimization r mathematical-optimization

5
推荐指数
1
解决办法
668
查看次数