Bắt đầu ngayBắt đầu miễn phí

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à:

  1. Chọn một thành phần.
  2. 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

Xem khóa học

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 sds giống với d.
  • Tính total_weight là 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ứ j của meanssds.

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)
*/
Chỉnh sửa và Chạy Mã