2016-08-28 63 views
0

我有以下一组功能。性能分析功能,已经优化过了优化

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采取估算的参数值,如果功能optimizied本地或全球最小的路径。

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

回答

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不会得到更新。)由于optim调用funk反复,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迭代次数:

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

下面是这两个地块。 paramter path plots

+0

感谢您的答案,并使其真正理解。我正在寻找其他东西,但我用完全相同的逻辑找到了答案。万分感谢! – VitalSigns