Soit $S(x) = \sum\limits_{i=1}^d 100 (x_{i+1}-x_i)^2 + (x_i - 1)^2$ la fonction de Rosenbrock
Proposons un algorithme de type CE pour obtenir le minimum global d'une fonction quelconque $S : \mathbb{R}^d \to \mathbb{R}$
l'appliquons à la fonction de Rosenbrock, pour différentes valeurs de $d$
code R :
library("mvtnorm") # pour générer des lois normales
rosenbrock <- function(x){
y = 0
for (i in (1:(length(x)-1))){
y = y + 100*(x[i+1]-x[i])^2+(x[i]-1)^2
}
return(y)
}
optCE <- function(fun = rosenbrock, n = 1000, d = 3, eps = 1e-16, max_iter = 1000){
# fun, la fonction objectif
# n, la taille de l'échantillon
# d, la dimension de x
# eps, le critère d'arrêt
# max_iter,
# initialisation
mu = rep(0, d)
sigma = 100*diag(d)
t = 1
repeat{
# etape 1 : on tire les Y_i
t = t + 1
Y = rmvnorm(n, mean = mu, sigma = sigma)
# etape 2 : on prend les top Y_i qui minimise fun
S = - apply(Y, 1, fun)
S_sorted = sort(S, decreasing = TRUE)
N = floor(0.01*n)
top_ind = which(S >= sort(S, decreasing = TRUE)[N], arr.ind = TRUE)
Y_top = Y[top_ind, ]
# etape 3 : on estime par MLE mu et sigma
mu = apply(Y_top, 2, mean)
sigma = var(Y_top)
# etape 4 : critère d'arrêt
if(max(sigma) < eps || t >= max_iter){
break
}
}
return(list(x_opt = mu, iteration = t))
}
optCE()
optCE(d = 5)
optCE(d = 10)
optCE(d = 10, n = 50000)
Bilan des courses :
pour une optimisation, on doit tenir en compte plusieurs paramètres :
l'initialisation de $\theta_0$ est bien sûr très important, ici $\theta_0 = (\mu_0, \sigma^2_0)$ et :
pour $n = 500$
gauche : suite loi uniforme ; droite : suite de Halton ; cadrant rouge : discrépance
questions :
Nous allons ici utiliser le package R randtoolbox qui permet de générer des suites à faible discrépance (Sobol, Halton, ...).
PS : Quelques libraries en python
Voir le fichier quasi_monte_carlo.Rmd
1 Générer les variables aléatoires classiques :
2 Intégration Monte Carlo :
3 Monte Carlo par Chaînes de Markov (MCMC) :
4 Optimisation avec de l'aléa : exercice 9