当搜索间隔较宽时,R优化不给出有限最小值但是Inf

问题描述 投票:0回答:1

我有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);
r mathematical-optimization intervals
1个回答
2
投票

问题是你的功能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)没有(似乎......)有渐近线。

© www.soinside.com 2019 - 2024. All rights reserved.