ÎncepețiÎncepe gratuit

Eșantionare dintr-un amestec de distribuții (I)

O distribuție mixtă este o distribuție a cărei densitate este o combinație liniară de densități ale distribuției normale (componente). Fiecare componentă are o pondere (probabilitatea de a fi aleasă), precum și o medie și o deviație standard (ca orice altă distribuție normală).

Vei construi algoritmul în două exerciții. Aici vei alege componenta din care se face eșantionarea, completând definiția funcției choose_component().

Acest exercițiu face parte din cursul

Optimizarea codului R cu Rcpp

Vezi cursul

Instrucțiuni pentru exercițiu

  • Generează un număr aleatoriu uniform de la 0 la total_weight folosind funcția runif() din namespace-ul R.
  • În interiorul buclei while, scade din valoarea lui x al j-lea element al vectorului weights.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

#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)))
*/
Editează și rulează codul