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
Övningsinstruktioner
- Generera ett likfördelat slumptal från
0tilltotal_weightmed funktionenrunif()i namnrymdenR. - Inuti while-loopen minskar du värdet på
xmed detj:e elementet iweights.
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)))
*/