我有optimize()
的问题。
当我将搜索限制在零周围的小间隔(例如,(-1,1))时,优化算法给出具有有限目标函数值的有限最小值。
但是当我将间隔扩大到(-10,10)时,最小值是在间隔的边界上,目标是Inf,这对我来说真的很令人费解。
怎么会发生这种情况以及如何解决这个问题?非常感谢提前。
以下是我的代码。
set.seed(123)
n <- 120
c <- rnorm(n,mean=1,sd=.3);
eps <- rnorm(n,mean=0,sd=5)
tet <- 32
r <- eps * c^tet
x <- matrix(c(c,r), ncol=2)
g <- function(tet, x){
matrix((x[,1]^(-tet))*x[,2],ncol=1)
}
theta <- 37
g_t <- g(theta,x)
f.tau <- function(tau){
exp.tau.g <- exp(g_t %*% tau)
g.exp <- NULL; i <- 1:n
g.exp <- matrix(exp.tau.g[i,] * g_t[i,], ncol=1)
sum.g.exp <- apply(g.exp,2,sum)
v <- t(sum.g.exp) %*% sum.g.exp
return(v)
}
band.tau <- 1;
f <- optimize(f.tau, c(-band.tau, band.tau), tol=1e-20)
print("interval=(-1, 1)"); print(f);
band.tau <- 10;
f <- optimize(f.tau, c(-band.tau, band.tau), tol=1e-20)
print("interval=(-10, 10)"); print(f);
问题是你的功能f.tau(x)
表现不佳。你可以在这里看到:
vect.f <- Vectorize(f.tau)
z1 <- seq(-1,1,by=0.01)
z10 <- seq(-10,10,by=0.01)
par(mfrow=c(2,1), mar=c(2,2,1,1))
plot(z1, log(vect.f(z1)), type="l")
plot(z10,log(vect.f(z10)),type="l")
请注意,这些是log(f.tau)
的情节。所以有两个问题:f.tau(...)
在最小值的两侧都有一个非常大的斜率,而f.tau = Inf for x<-0.6 and x>1.0
,其中Inf意味着f.tau(...)
大于可以在该系统上表示的最大数量。当您将范围设置为(-1,1)时,您的起点足够接近optimize(...)
设法收敛的最小值。将限制设置为(-10,10)时,起点太远。文档中的示例显示了与f.tau几乎没有不良行为的函数类似的问题。
编辑(回应OP的评论)
主要问题是您正在尝试优化在感兴趣的区间中具有计算无穷大的函数。这是解决这个问题的方法。
band.tau <- 10
z <- seq(-band.tau,band.tau,length=1000)
vect.f <- Vectorize(f.tau)
interval <- range(z[is.finite(vect.f(z))])
f <- optimize(f.tau, interval, tol=1e-20)
f
# $minimum
# [1] 0.001615433
#
# $objective
# [,1]
# [1,] 7.157212e-12
这将在f.tau(x)
上的1000个等距点处评估(-band.tau,+band.tau)
,确定x
有限的f.tau
的所有值,并使用该范围作为optimize(...)
的增量。这适用于你的情况,因为f.tau(x)
没有(似乎......)有渐近线。