[R] Maximum number of iterations (maxit) does not work in hydroPSO-modFit-optimr in r
ProfJCNash
pro|jcn@@h @end|ng |rom gm@||@com
Wed Oct 3 19:45:05 CEST 2018
As the author of optimx (there is a new version just up), I can say that
maxit only "works" if the underlying solver is set up to use it.
You seem to be mistaken, however, in this case, as the following example
shows.
> library(optimx)
> library(adagio)
> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 18.3
Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.18.so
locale:
[1] LC_CTYPE=en_CA.UTF-8 LC_NUMERIC=C
LC_TIME=en_CA.UTF-8
[4] LC_COLLATE=en_CA.UTF-8 LC_MONETARY=en_CA.UTF-8
LC_MESSAGES=en_CA.UTF-8
[7] LC_PAPER=en_CA.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=en_CA.UTF-8
LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] adagio_0.7.1 optimx_2018-7.10
loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1 numDeriv_2016.8-1
> test <- optimr(c(-1.2, 1), fn=fnRosenbrock, method="L-BFGS-B",
control=list(maxit=2, trace=2))
Parameter scaling:[1] 1 1
N = 2, M = 5 machine precision = 2.22045e-16
This problem is unconstrained.
final value 4.120516
stopped after 3 iterations
So it seems to have worked, albeit one iteration later than specified
(the test is not always immediate).
Note optimr() is just a wrapper. There may be improvements that could be
made to use maxit and similar controls. Note that the code is in plain R
and optimr() was written in a way that allows it to be maintained. The
most difficult problem -- which may be related to the OP's complaint in
some cases -- is translating maxit to whatever is used by the solver,
then copying back the relevant information about number of iterations.
John Nash
On 2018-10-03 01:30 PM, Ahmed Attia wrote:
> The argument maxit used in libraries optimr, hydroPSO, and FME to
> control the maximal number of iterations to be performed does not work
> at ALL!!
>
> This needs to be fixed...
>
>
>
> mysamp <- function(n, m, s, lwr, upr, nnorm) {
> samp <- rnorm(nnorm, m, s)
> samp <- samp[samp >= lwr & samp <= upr]
> if (length(samp) >= n) {
> return(sample(samp, n))
> }
> stop(simpleError("Not enough values to sample from. Try increasing nnorm."))
> }
>
> x <- mysamp(1000,0.8117648,0.1281839,0,1,1000000)
> y <- mysamp(1000,0.7530346,0.1865946,0,1,1000000)
>
> n <- length(x)
> xgroup <- c('a','b')
> ygroup <- c('c','d')
>
> for (i in c(2:n)){
> xgroup[i] <- c('b')
> ygroup[i] <- c('d')
> }
>
> dataset <- data.frame(x = x, y = y, xgroup = as.factor(xgroup),
> ygroup = as.factor(ygroup))
> dataset$ObsNo <- 1:n
> dataset <- dataset[order(dataset$x,decreasing=F),]
>
> xopt <- c(dataset$x[1],0.95) #Initial critical x,y values
>
>
> my.function <- function(xopt){
> for (i in c(1:n)){
> dataset$xgroup[i] <- if(dataset$x[i] < xopt[1]) 'a' else 'b'
> dataset$ygroup[i] <- if(dataset$y[i] < xopt[2]) 'c' else 'd'
> dataset$q.i[i] <- with(dataset, ifelse
> (dataset$xgroup[i]=='a' &
> dataset$ygroup[i]=='d', 1, 0))
> dataset$q.ii[i] <- with(dataset, ifelse
> (dataset$xgroup[i]=='b' &
> dataset$ygroup[i]=='d', 1, 0))
> dataset$q.iii[i] <- with(dataset, ifelse
> (dataset$xgroup[i]=='b' &
> dataset$ygroup[i]=='c', 1, 0))
> dataset$q.iv[i] <- with(dataset, ifelse
> (dataset$xgroup[i]=='a' &
> dataset$ygroup[i]=='c', 1, 0))
>
> dataset$q.err[i] <- sum(dataset$q.i[i] + dataset$q.iii[i])
> }
> min.qerr <- sum(dataset$q.err)
> q.I <- sum(dataset$q.i)
> q.II <- sum(dataset$q.ii)
> q.III <- sum(dataset$q.iii)
> q.IV <- sum(dataset$q.iv)
> q.Iandq.III <- sum(dataset$q.err)
> print(c(q.I,
> q.II,
> q.III,
> q.IV,
> q.Iandq.III))
> return(min.qerr)
> }
>
> my.function(xopt)
>
> #-------Algorithm
>
> xmin=c(0,0.60)
> xmax=c(0.95,0.95)
>
> res= hydroPSO(par=xopt,my.function,method="spso2011",
> lower=xmin,upper=xmax,control=list(maxit=3))
>
>
> res= modFit(my.function,p=xopt,method="Pseudo",
> lower=xmin,upper=xmax,control=list(numiter=3))
>
> res= optimr(par=xopt,my.function,method="L-BFGS-B",
> lower=xmin,upper=xmax,control=list(maxit=3,trace=T))
>
> #Only the hjkb form dfoptim that has argument maxfeval and it works.
>
> res=hjkb(par=xopt,my.function,
> lower=xmin,upper=xmax,control=list(maxfeval=3,tol=2^-10,info=T))
>
>
>
>
>
>
> Ahmed Attia, Ph.D.
> Agronomist & Crop Modeler
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
More information about the R-help
mailing list