Nothing
#' Analytical expression of the multipoint expected improvement (qEI)
#' criterion
#'
#' Computes the multipoint expected improvement criterion.
#'
#'
#' @param x a matrix representing the set of input points (one row corresponds
#' to one point) where to evaluate the qEI criterion,
#' @param model an object of class \code{km},
#' @param plugin optional scalar: if provided, it replaces the minimum of the
#' current observations,
#' @param type "SK" or "UK" (by default), depending whether uncertainty
#' related to trend estimation has to be taken into account,
#' @param minimization logical specifying if EI is used in minimiziation or in
#' maximization,
#' @param fastCompute if TRUE, a fast approximation method based on a
#' semi-analytic formula is used (see [Marmin 2014] for details),
#' @param eps the value of \emph{epsilon} of the fast computation trick.
#' Relevant only if \code{fastComputation} is TRUE,
#' @param envir an optional environment specifying where to get intermediate
#' values calculated in \code{\link{qEI}}.
#' @return The multipoint Expected Improvement, defined as \deqn{qEI(X_{new})
#' := E[ ( min(Y(X)) - min(Y( X_{new} )) )_{+} | Y(X)=y(X)],}
#'
#' where \eqn{X} is the current design of experiments, \eqn{ X_{new} } is a
#' new candidate design, and \eqn{Y} is a random process assumed to have
#' generated the objective function \eqn{y}.
#' @author Sebastien Marmin
#'
#' Clement Chevalier
#'
#' David Ginsbourger
#' @seealso \code{\link{EI}}
#' @references
#'
#' C. Chevalier and D. Ginsbourger (2014) Learning and Intelligent
#' Optimization - 7th International Conference, Lion 7, Catania, Italy,
#' January 7-11, 2013, Revised Selected Papers, chapter Fast computation of
#' the multipoint Expected Improvement with applications in batch selection,
#' pages 59-69, Springer.
#'
#' D. Ginsbourger, R. Le Riche, L. Carraro (2007), A Multipoint Criterion for
#' Deterministic Parallel Global Optimization based on Kriging. The
#' International Conference on Non Convex Programming, 2007.
#'
#' S. Marmin. Developpements pour l'evaluation et la maximisation du critere
#' d'amelioration esperee multipoint en optimisation globale (2014). Master's
#' thesis, Mines Saint-Etienne (France) and University of Bern (Switzerland).
#'
#' D. Ginsbourger, R. Le Riche, and L. Carraro. Kriging is well-suited to
#' parallelize optimization (2010),
#' In Lim Meng Hiot, Yew Soon Ong, Yoel
#' Tenne, and Chi-Keong Goh, editors, \emph{Computational Intelligence in
#' Expensive Optimization Problems}, Adaptation Learning and Optimization,
#' pages 131-162. Springer Berlin Heidelberg.
#'
#' J. Mockus (1988), \emph{Bayesian Approach to Global Optimization}. Kluwer
#' academic publishers.
#'
#' M. Schonlau (1997), \emph{Computer experiments and global optimization},
#' Ph.D. thesis, University of Waterloo.
#' @keywords models parallel optimization
#'
#' @examples
#'
#' \donttest{
#' set.seed(007)
#'
#' # Monte-Carlo validation
#'
#' # a 4-d, 81-points grid design, and the corresponding response
#' d <- 4; n <- 3^d
#' design <- do.call(expand.grid,rep(list(seq(0,1,length=3)),d))
#' names(design) <- paste("x",1:d,sep="")
#' y <- data.frame(apply(design, 1, hartman4))
#' names(y) <- "y"
#'
#' # learning
#' model <- km(~1, design=design, response=y, control=list(trace=FALSE))
#'
#' # pick up 10 points sampled from the 1-point expected improvement
#' q <- 10
#' X <- sampleFromEI(model,n=q)
#' # simulation of the minimum of the kriging random vector at X
#' t1 <- proc.time()
#' newdata <- as.data.frame(X)
#' colnames(newdata) <- colnames(model@@X)
#'
#' krig <- predict(object=model, newdata=newdata,type="UK",se.compute=TRUE, cov.compute=TRUE)
#' mk <- krig$mean
#' Sigma.q <- krig$cov
#' mychol <- chol(Sigma.q)
#' nsim <- 300000
#' white.noise <- rnorm(n=nsim*q)
#' minYsim <- apply(crossprod(mychol,matrix(white.noise,nrow=q)) + mk,2,min)
#' # simulation of the improvement (minimization)
#' qImprovement <- (min(model@@y)-minYsim)*((min(model@@y)-minYsim) > 0)
#'
#' # empirical expectation of the improvement and confident interval (95%)
#' eiMC <- mean(qImprovement)
#' confInterv <- c(eiMC - 1.96*sd(qImprovement)*1/sqrt(nsim),eiMC + 1.96*sd(qImprovement)*1/sqrt(nsim))
#'
#' # MC estimation of the qEI
#' print(eiMC)
#' t2 <- proc.time()
#' # qEI with analytical formula
#' qEI(X,model,fastCompute= FALSE)
#' t3 <- proc.time()
#' # qEI with fast computation trick
#' qEI(X,model)
#' t4 <- proc.time()
#' t2-t1 # Time of MC computation
#' t3-t2 # Time of normal computation
#' t4-t3 # Time of fast computation
#' }
#'
#' @importFrom mnormt dmnorm pmnorm
#' @export qEI
qEI <- function(x,model ,plugin = NULL, type = "UK", minimization = TRUE, fastCompute = TRUE, eps = 10^(-5), envir = NULL) {
d <- model@d
if (!is.matrix(x)) {
x <- matrix(x,ncol = d)
}
xb <- rbind(model@X,x)
nExp <- model@n
x <- unique(round(xb,digits = 8))
if ((nExp+1)>length(x[,1])) {return (0)}
x <- matrix(x[(nExp+1):length(x[,1]),],ncol=d)
if(is.null(plugin) && minimization) plugin <- min(model@y)
if(is.null(plugin) && !minimization) plugin <- max(model@y)
if (length(x[,1]) == 1) {
return(EI(x=x,model=model,plugin=plugin,type=type,envir=envir))
}
krig <- predict(object=model, newdata=x,type=type,se.compute=FALSE, cov.compute=TRUE,checkNames = FALSE)
sigma <- krig$cov
mu <- krig$mean
q <- length(mu)
pk <- first_term <- second_term <- rep(0,times=q)
if (!fastCompute) {
symetric_term <- matrix(0,q,q)
non_symetric_term <- matrix(0,q,q)
}
for(k in 1:q){
#covariance matrix of the vector Z^(k)
Sigma_k <- covZk( sigma=sigma, index=k )
#mean of the vector Z^(k)
mu_k <- mu - mu[k]
mu_k[k] <- -mu[k]
if(minimization) mu_k <- -mu_k
b_k <- rep(0,times=q)
b_k[k] <- -plugin
if(minimization) b_k <- -b_k
pk[k] <- pmnorm(x= b_k - mu_k ,varcov=Sigma_k,maxpts=q*200)[1]
first_term[k] <- (mu[k] - plugin)*pk[k]
if(minimization) first_term[k] <- -first_term[k]
if (fastCompute) {
second_term[k] <- 1/eps*(pmnorm(x= b_k + eps*Sigma_k[,k]- mu_k ,varcov=Sigma_k,maxpts=q*200)[1] - pk[k])
} else {
for(i in 1:q){
non_symetric_term[k,i] <- Sigma_k[i,k]
if (i>=k) {
mik <- mu_k[i]
sigma_ii_k <- Sigma_k[i,i]
bik <- b_k[i]
phi_ik <- dnorm(x=bik, mean=mik , sd= sqrt(sigma_ii_k))
#need c.i^(k) and Sigma.i^(k)
cik <- get_cik(b = b_k , m = mu_k , sigma = Sigma_k , i=i )
sigmaik <- get_sigmaik( sigma = Sigma_k , i=i )
Phi_ik <- pmnorm(x = cik ,varcov=sigmaik,maxpts=(q-1)*200)[1]
symetric_term[k,i] <- phi_ik*Phi_ik
}
}
}
}
if (!fastCompute) {
symetric_term <- symetric_term + t(symetric_term)
diag(symetric_term) <- 0.5 * diag(symetric_term)
second_term <- sum(symetric_term*non_symetric_term)
}
if (!is.null(envir)) {
assign("pk",pk,envir=envir)
if (fastCompute == FALSE) {
assign("symetric_term",symetric_term,envir = envir)
}
assign("kriging.mean", mu, envir = envir)
assign("kriging.cov", sigma, envir = envir)
assign("Tinv.c", krig$Tinv.c, envir = envir)
assign("c", krig$c, envir = envir)
}
somFinal <- sum(first_term,second_term)
return( somFinal )
}
get_sigmaik <- function( sigma , i ){
result <- sigma
q <- nrow(sigma)
for(u in 1:q){
for(v in 1:q){
if((u!=i) && (v!=i)){
result[u,v] <- sigma[u,v] - sigma[u,i]*sigma[v,i]/sigma[i,i]
}else{
result[u,v] <- 0
}
}
}
result <- result[-i,-i]
return(result)
}
get_cik <- function( b , m , sigma , i ){
sigmai <- sigma[i,] / sigma[i,i]
result <- (b - m) - ( b[i] - m[i] ) * sigmai
result <- result[-i]
return(result)
}
covZk <- function(sigma,index){
result <- sigma
q <- nrow(sigma)
result[index,index] <- sigma[index,index]
for(i in 1:q){
if(i!=index){
result[index,i] <- result[i,index] <- sigma[index,index] - sigma[index,i]
}
}
for(i in 1:q){
for(j in i:q){
if((i!=index)&&(j!=index)){
result[i,j] <- result[j,i] <- sigma[i,j] + sigma[index,index] - sigma[index,i] - sigma[index,j]
}
}
}
return(result)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.