我有以下功能集。
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的新手并且不知道如何去做。欢迎所有建议。
答案 0 :(得分:1)
这是一种跟踪参数路径的简单方法。我将以线性回归为例。说我们的数据是
x <- 1:10
y <- -3 + 2 * x + rnorm(length(x))
plot(x, y)
所以y
是x
的线性函数加上一些噪音。我们的目标是找到参数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}}重复调用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