CommencerCommencer gratuitement

Échantillonnage à partir d’un mélange de distributions (I)

Une distribution de mélange est une distribution 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 allez construire l’algorithme en deux exercices. Ici, vous choisirez la composante à échantillonner en complétant la définition de choose_component().

Cet exercice fait partie du cours

Optimiser du code R avec Rcpp

Afficher le cours

Instructions

  • Générez un nombre aléatoire uniforme entre 0 et total_weight à l’aide de la fonction runif() dans l’espace de noms R.
  • À l’intérieur de la boucle while, diminuez la valeur de x du j-ième élément de weights.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

#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)))
*/
Modifier et exécuter le code