Lấy mẫu từ hỗn hợp phân phối (II)
Thuật toán đầy đủ để lấy mẫu từ một phân phối hỗn hợp là:
- Chọn một thành phần.
- Tạo một số ngẫu nhiên phân phối chuẩn sử dụng trung bình và độ lệch chuẩn của thành phần đã chọn.
choose_component(), từ bài tập trước, đã được cung cấp. Tại đây bạn sẽ hoàn thiện bước thứ hai và hoàn tất định nghĩa rmix().
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
- Kiểm tra rằng số lượng độ lệch chuẩn bằng với số lượng trọng số. Tức là kích thước của
sdsgiống vớid. - Tính
total_weightlà tổng các trọng số. - Chọn một thành phần bằng cách gọi
choose_component(). - Mô phỏng từ thành phần đã chọn bằng cách tạo một số ngẫu nhiên phân phối chuẩn với phần tử thứ
jcủameansvàsds.
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;
// From previous exercise; do not modify
// [[Rcpp::export]]
int choose_component(NumericVector weights, double total_weight) {
double x = R::runif(0, total_weight);
int j = 0;
while(x >= weights[j]) {
x -= weights[j];
j++;
}
return j;
}
// [[Rcpp::export]]
NumericVector rmix(int n, NumericVector weights, NumericVector means, NumericVector sds) {
// Check that weights and means have the same size
int d = weights.size();
if(means.size() != d) {
stop("means size != weights size");
}
// Do the same for the weights and std devs
if(___) {
stop("sds size != weights size");
}
// Calculate the total weight
double total_weight = ___;
// Create the output vector
NumericVector res(n);
// Fill the vector
for(int i = 0; i < n; i++) {
// Choose a component
int j = ___(___, ___);
// Simulate from the chosen component
res[i] = ___::___(___, ___);
}
return res;
}
/*** R
weights <- c(0.3, 0.7)
means <- c(2, 4)
sds <- c(2, 4)
rmix(10, weights, means, sds)
*/