【问题标题】:profiling function which has been optimized with optim已使用 optim 优化的分析功能
【发布时间】:2017-01-04 19:18:51
【问题描述】:

我有以下一组函数。

funk <- function(x,b) { 10^b * exp(-x/10) }

lambda <- function(y,k) { exp(-k*y) }

funk1 <- function(y,x,xb,b,k) { 
funk(x-xb-y,b) *exp(- integrate(lambda, lower=0, upper = y, k=k)$value) }

funk2 <-function(x,xb,b,k) { 
integrate(funk1, lower= 0, upper=x-xb, x=x,xb=xb, b=b,k=k)$value }

funk2_vc <- Vectorize(funk2)

optim_funk2 <- function(param) { 
b <-param[1]
k <- param[2]             
R1 <- sum((y - funk2_vc(xx,xb,b,k))^2)
-log(R1) } 

fit <- optim(par=c(5, 0.05), fn=optim_funk2)

xx <- seq(0,500,5)
xb <- seq(0,100,1)
y <- seq(1000,0,-10)

我希望分析函数 funk2 以找出 optim 用于估计参数值的路径以及该函数是否针对局部或全局最小值进行了优化。

我是 R 的新手,不知道如何去做。欢迎所有建议。

【问题讨论】:

    标签: r optimization functional-programming


    【解决方案1】:

    这是一种跟踪参数路径的简单方法。我将以线性回归为例。假设我们的数据是

    x <- 1:10
    y <- -3 + 2 * x + rnorm(length(x))
    plot(x, y)
    

    所以yx 加上一些噪声的线性函数。我们的目标是找到参数 a 和 b 使得误差平方和sum((y - (a + b * x))^2) 最小化。 (这当然可以通过代数来解决,但为了说明,我们将使用optim() 来解决它。)

    这是进行优化和跟踪参数的代码:

    par.path <- matrix(nrow=0, ncol=2, dimnames=list(NULL, c("a","b")))
    
    funk <- function(par) {
      a <- par[1]; b <- par[2]
      par.path <<- rbind(par.path, par)
      sum((y - (a + b * x))^2)
    }
    
    optim(par=c(0,0), fn=funk)
    

    第一行创建一个名为par.path 的0 行矩阵来存储参数路径。在目标函数funk 中,我们将par 的当前值添加到par.path。请注意,我们必须使用&lt;&lt;- 而不是&lt;- 来更新par.path,因为它位于funk 的范围之外。 (如果我们使用&lt;-,那么funk 将创建一个新的局部变量,也称为par.path,并且函数外部的par.path 不会被更新。)由于optim 反复调用funk,@ 987654343@ 将逐渐变长(更多行)。

    有多种方法可以绘制矩阵par.path。由于在这种情况下只有两个参数,我们可以将它们相互绘制:

    plot(par.path, type='l')
    points(par.path[c(1,nrow(par.path)),], col=c("green","red"), cex=2, pch=16)
    

    第二行添加了绿点和红点来指示路径的起点和终点。更灵活的是,我们可以针对optim的迭代次数绘制par.path的所有列:

    matplot(par.path, type='l', col=c("black","red"), lty=1)
    legend("bottomleft", c("a","b"), col=c("black","red"), lty=1)
    

    这是这两个地块。

    【讨论】:

    • 感谢您的回答并使其真正易于理解。我一直在寻找其他东西,但我使用完全相同的逻辑找到了答案。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2022-01-23
    相关资源
    最近更新 更多