Pengambilan sampel dari campuran sebaran (I)
Sebaran campuran adalah sebaran yang kerapatannya merupakan kombinasi linear dari kerapatan sebaran normal (komponen). Setiap komponen memiliki bobot (probabilitas untuk dipilih), serta rata-rata dan simpangan baku (sama seperti sebaran normal lainnya).
Anda akan membangun algoritmenya dalam dua latihan. Di sini Anda akan memilih komponen yang akan diambil sampelnya dengan melengkapi definisi choose_component().
Latihan ini adalah bagian dari kursus
Mengoptimalkan Kode R dengan Rcpp
Petunjuk latihan
- Hasilkan bilangan acak seragam dari
0hinggatotal_weightmenggunakan fungsirunif()dalam namespaceR. - Di dalam while loop, kurangi nilai
xdengan elemen ke-jdariweights.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
#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)))
*/