已经使用optim优化的分析功能

时间:2016-08-28 18:56:00

标签: r optimization functional-programming

我有以下功能集。

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的新手并且不知道如何去做。欢迎所有建议。

1 个答案:

答案 0 :(得分: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。请注意,我们必须使用<<-而不是<-来更新par.path,因为它超出了funk的范围。 (如果我们使用<-,那么funk将创建一个名为par.path的新局部变量,并且函数外部的par.path将不会更新。)自{{ 1}}重复调用optimfunk将逐渐变长(更多行)。

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

par.path

第二行添加绿色和红色点以指示路径的开始和停止。更灵活地,我们可以将plot(par.path, type='l') points(par.path[c(1,nrow(par.path)),], col=c("green","red"), cex=2, pch=16) 的所有列与par.path的迭代次数进行绘制:

optim

以下是这两个图。 paramter path plots