CommencezCommencez gratuitement

É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

Voir le cours

Instructions de l’exercice

  • Générez un nombre aléatoire uniforme de 0 à total_weight en utilisant la fonction runif() dans l'espace de noms R.
  • À l'intérieur de la boucle while, diminuez la valeur de x du je élément de weights.

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