An example showing that a seemingly simple optimization problem can be tricky.
f <- function (x) {
y = -cos(3*pi*x)/x
return(y)
}
This is our fake log-probability function.
plotf <- function() {
xs <- (0:2000)/1000
plot(xs, f(xs), t="l", lwd=2, xlab="x", ylab="log-probability", ylim=c(-6,6))
}
plotf()
brent1.5 <- optim(par=1.5, fn=f, method="Brent", lower=0, upper=2, control=list(fnscale=-1))
brent0.5 <- optim(par=0.5, fn=f, method="Brent", lower=0, upper=2, control=list(fnscale=-1))
NelderMead1.5 <- optim(par=1.5, fn=f, method="Nelder-Mead", control=list(fnscale=-1))
## Warning in optim(par = 1.5, fn = f, method = "Nelder-Mead", control = list(fnscale = -1)): l'optimisation de Nelder-Mead unidimensionnelle est instable :
## use "Brent" or optimize() directement
NelderMead0.5 <- optim(par=0.5, fn=f, method="Nelder-Mead", control=list(fnscale=-1))
## Warning in optim(par = 0.5, fn = f, method = "Nelder-Mead", control = list(fnscale = -1)): l'optimisation de Nelder-Mead unidimensionnelle est instable :
## use "Brent" or optimize() directement
plotf <- function() {
jit_factor = 100
xs <- (0:2000)/1000
plot(xs, f(xs), t="l", lwd=2, xlab="x", ylab="log-probability", ylim=c(-6,6))
segments(x0=1.5, x1=1.5, y0=-6, y1=f(1.5), col="grey", lwd=2, lty=2)
segments(x0=0.5, x1=0.5, y0=-6, y1=f(0.5), col="darkgrey", lwd=2, lty=2)
}
plotf()
plotf <- function() {
jit_factor = 100
xs <- (0:2000)/1000
plot(xs, f(xs), t="l", lwd=2, xlab="x", ylab="log-probability", ylim=c(-6,6))
segments(x0=1.5, x1=1.5, y0=-6, y1=f(1.5), col="grey", lwd=2, lty=2)
segments(x0=0.5, x1=0.5, y0=-6, y1=f(0.5), col="darkgrey", lwd=2, lty=2)
points((brent1.5$par), jitter(brent1.5$value, factor=jit_factor), col="red", pch=20, cex=2)
points((brent0.5$par), jitter(brent1.5$value, factor=jit_factor), col="darkred", pch=20, cex=2)
points((NelderMead1.5$par), jitter(NelderMead1.5$value, factor=jit_factor), col="blue", pch=20, cex=2)
points((NelderMead0.5$par), NelderMead0.5$value, col="darkblue", pch=20, cex=2)
legend(legend=c("Brent starting at 1.5", "Brent starting at 0.5", "Nelder-Mead starting at 1.5", "Nelder-Mead starting at 0.5"), col=c("red", "darkred", "blue", "darkblue"), "topright", pch=20)
}
plotf()