Kom igångKom igång gratis

Sampling från en blandning av fördelningar (I)

En blandningsfördelning är en fördelning vars täthetsfunktion är en linjärkombination av normalfördelningar (komponenter). Varje komponent har en vikt (sannolikheten att den väljs) samt ett medelvärde och en standardavvikelse – precis som vilken normalfördelning som helst.

Du bygger upp algoritmen i två övningar. Här väljer du vilken komponent som ska samplas från, genom att färdigställa definitionen av choose_component().

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Generera ett likfördelat slumptal från 0 till total_weight med funktionen runif() i namnrymden R.
  • Inuti while-loopen minskar du värdet på x med det j:e elementet i weights.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#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)))
*/
Redigera och kör kod