Échantillonnage à partir d'un mélange de distributions (I)
Une loi de mélange est une loi dont la densité est une combinaison linéaire de densités de lois normales (composantes). Chaque composante a un poids (sa probabilité d'être choisie), ainsi qu'une moyenne et un écart type (comme toute loi normale).
Vous mettrez l'algorithme en place en deux exercices. Ici, vous choisirez la composante à partir de laquelle échantillonner en complétant la définition de choose_component().
Cette activité fait partie du cours
Optimiser le code R avec Rcpp
Instructions de l’exercice
- Générez un nombre aléatoire uniforme de
0àtotal_weighten utilisant la fonctionrunif()dans l'espace de nomsR. - À l'intérieur de la boucle while, diminuez la valeur de
xduje élément deweights.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
#include
using namespace Rcpp;
// [[Rcpp::export]]
int choose_component(NumericVector weights, double total_weight) {
// Generate a uniform random number from 0 to total_weight
double x = ___::___(0, ___);
// Remove the jth weight from x until x is small enough
int j = 0;
while(x >= weights[j]) {
// Subtract jth element of weights from x
___;
j++;
}
return j;
}
/*** R
weights <- c(0.3, 0.7)
# Randomly choose a component 5 times
replicate(5, choose_component(weights, sum(weights)))
*/