IniziaInizia gratis

Campionamento da una miscela di distribuzioni (I)

Una distribuzione di miscela è una distribuzione la cui densità è una combinazione lineare di densità di distribuzioni normali (componenti). Ogni componente ha un peso (la probabilità di essere scelto), una media e una deviazione standard (come qualsiasi altra distribuzione normale).

Costruirai l’algoritmo in due esercizi. Qui sceglierai il componente da cui campionare completando la definizione di choose_component().

Questo esercizio fa parte del corso

Ottimizzare il codice R con Rcpp

Visualizza il corso

Istruzioni dell'esercizio

  • Genera un numero casuale uniforme da 0 a total_weight usando la funzione runif() nello spazio dei nomi di R.
  • All’interno del ciclo while, diminuisci il valore di x dell’elemento j-esimo di weights.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

#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)))
*/
Modifica ed esegui il codice