Lấy mẫu từ hỗn hợp các phân phối (I)
Một phân phối hỗn hợp là phân phối có mật độ là tổ hợp tuyến tính của các mật độ phân phối chuẩn (các thành phần). Mỗi thành phần có một trọng số (xác suất được chọn), cùng với trung bình và độ lệch chuẩn (giống như bất kỳ phân phối chuẩn nào khác).
Bạn sẽ xây dựng dần thuật toán qua hai bài tập. Ở đây, bạn sẽ chọn thành phần để lấy mẫu bằng cách hoàn thiện định nghĩa choose_component().
Bài tập này là một phần của khóa học
Tối ưu hóa mã R với Rcpp
Hướng dẫn bài tập
- Tạo một số ngẫu nhiên phân phối đều từ
0đếntotal_weightbằng hàmrunif()trong namespaceR. - Bên trong vòng lặp while, giảm giá trị của
xđi phần tử thứjcủaweights.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
#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)))
*/