Méthodes d'échantillonnage directes
Génération de nombres aléatoires selon des lois de probabilité usuelles
Il existe plusieurs manières de générer des nombres dits “aléatoires” selon des lois connues. La très grande partie des programmes informatiques ne génèrent pas des nombres totalement aléatoires. On parle plutôt de nombres pseudo-aléatoires, qui semblent aléatoires mais sont en réalité générés selon un processus déterministe (qui dépend notamment d’une “graine”).
La distribution uniforme
Pour générer un échantillon pseudo-aléatoire selon la loi uniforme sur
Générer une suite d’entiers
tel que :
Choisir
où
Autres distributions
Pour échantillonner selon la loi binomiale
Pour échantillonner selon la loi normale
Si
Échantillonner selon une loi définie analytiquement
Méthode par inversion
Inverse généralisée
Pour une fonction
Soit
On déduit de la propriété ci-dessus que si l’on connaît la fonction de répartition de la loi selon laquelle on veut simuler, et si l’on est capable de l’inverser, alors on peut générer un échantillon suivant cette loi à partir d’un échantillon uniforme sur
On veut générer un échantillon suivant la loi exponentielle de paramètre
On a la densité de la loi exponentielle qui est
Posons
Si
Méthode d’acceptation-rejet
La méthode d’acceptation-rejet consiste à utiliser une loi instrumentale
Soit une loi d’intérêt de densité
Soit une loi de proposition de densité
Générer
etSi
on accepte le tirage:
sinon on le rejette et on retourne en 1.
Plus
👉 Exercice 1 : Construire un pseudo-échantillon de taille
Pour
- échantillonner selon la loi uniforme :
👉 Exercice 2 : Grâce à la méthode par inversion, générer un pseudo-échantillon de taille suivant une loi de Cauchy (dont la densité est
Alors
Donc
Pour
- échantillonner selon la loi uniforme :
👉 Exercice 3 : Écrire un algorithme d’acceptation-rejet pour simuler la réalisation d’un pseudo-échantillon de taille
On cherche
En dérivant
On va donc utiliser :
f <- function(x){
exp(-x^2/2)/sqrt(2*pi)
}
g <- function(x){
1/(pi*(1+x^2))
}
x <- seq(from = -10, to = 10, by = 0.01)
plot(x=x, y=f(x)/g(x), type='l', lwd = 2, ylab="Densité de probabilité")
lines(x = x, y=f(x), type = "l", lwd = 2, col="red")
lines(x = x, y=g(x), type = "l", lwd = 2, col="blue")
lines(x = x, y=g(x)*sqrt(2*pi/exp(1)), type = "l", lwd = 1.5, lty=3, col="purple")
legend("topleft", legend = c("f(x)", "g(x)", "f(x)/g(x)", "M*g(x)"), col=c("red", "blue", "black", "purple"), lwd=c(2, 2, 2, 1.5), lty=c(1, 1, 1, 3))