2012-04-27 36 views
8

Tôi đã viết một mô phỏng trong C++ tạo ra (1.000.000)^2 số từ phân phối xác suất cụ thể và sau đó thực hiện điều gì đó với chúng. Cho đến nay tôi đã sử dụng phân phối Exponential, Normal, Gamma, Uniform và Poisson. Đây là mã cho một trong số chúng:Số ngẫu nhiên từ bản phân phối Beta, C++

#include <boost/random.hpp> 

...main... 

    srand(time(NULL)) ; 
    seed = rand(); 
    boost::random::mt19937 igen(seed) ; 
    boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> > 
    norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ; 

Bây giờ tôi cần chạy nó cho bản phân phối Beta. Tất cả các bản phân phối mà tôi đã thực hiện cho đến nay đã mất 10-15 giờ. Bản phân phối Beta không nằm trong gói tăng/ngẫu nhiên nên tôi phải sử dụng gói tăng/toán/phân phối. Tôi đã tìm thấy this page on StackOverflow đề xuất giải pháp. Đây là (được sao chép):

#include <boost/math/distributions.hpp> 
using namespace boost::math; 
double alpha, beta, randFromUnif; 
//parameters and the random value on (0,1) you drew 
beta_distribution<> dist(alpha, beta); 
double randFromDist = quantile(dist, randFromUnif); 

Tôi đã sao chép và hoạt động. Các ước tính thời gian chạy của mô phỏng của tôi là tuyến tính và có thể dự đoán chính xác. Họ nói rằng điều này sẽ chạy trong 25 ngày. Tôi thấy hai khả năng: 1. phương pháp được đề xuất là kém hơn so với người tôi đã sử dụng trước đó cho các bản phân phối khác 2. phân phối Beta chỉ là khó khăn hơn nhiều để tạo số ngẫu nhiên từ

Bare trong tâm trí rằng tôi có dưới tối thiểu sự hiểu biết về mã hóa C++, vì vậy các câu hỏi tôi hỏi có thể ngớ ngẩn. Tôi không thể chờ một tháng để mô phỏng này hoàn thành, vậy có điều gì tôi có thể làm để cải thiện điều đó không? Có lẽ sử dụng phương pháp ban đầu mà tôi đã sử dụng và sửa đổi nó để làm việc với gói boost/math/distribution? Tôi thậm chí không biết nếu có thể.

Một thông tin khác có thể hữu ích là các tham số giống nhau cho tất cả (1.000.000)^2 trong số các số tôi cần tạo. Tôi đang nói điều này bởi vì bản phân phối Beta có một tệp PDF khó chịu và có lẽ kiến ​​thức rằng các tham số được cố định bằng cách nào đó có thể được sử dụng để đơn giản hóa quá trình này? Chỉ là một phỏng đoán ngẫu nhiên.

Trả lời

5

Bản phân phối beta có liên quan đến phân phối gamma. Gọi X là một số ngẫu nhiên được lấy từ Gamma (α, 1) và Y từ Gamma (β, 1), trong đó đối số đầu tiên cho phân phối gamma là tham số hình dạng. Sau đó Z = X/(X + Y) có phân phối Beta (α, β). Với sự chuyển đổi này, nó chỉ mất gấp đôi thời gian thử nghiệm phân phối gamma của bạn.

Lưu ý: Ở trên giả định biểu diễn phổ biến nhất về phân phối gamma, Gamma (hình dạng, tỷ lệ). Lưu ý rằng các cách triển khai khác nhau của trình tạo ngẫu nhiên phân phối gamma sẽ thay đổi theo ý nghĩa và thứ tự của các đối số.

+0

Cảm ơn bạn, tôi không biết về tài sản đó. Tôi cũng đã sử dụng thực tế rằng phân phối gamma chỉ là tổng của số mũ. Đề xuất của bạn đã thay đổi thời gian chạy từ 600 đến 40 giờ. Cảm ơn bạn! – jaff

+0

Sử dụng ký pháp chuẩn, không nên là Gamma (α, 1) và Gamma (β, 1) thay vì Gamma (1, α) và Gamma (1, β). Tức là, tham số α và β phải là thông số hình dạng, không phải là tham số tỷ lệ. – BenRI

+0

@BenRI - Có nhiều cách để tham số hóa phân phối gamma. Một trong những được sử dụng rộng rãi hơn là 'gamma (shape_factor, scale_factor) ', và với cách sử dụng này, bạn là chính xác. Đó là yếu tố quy mô cũng có thể là một tỷ lệ hoặc một trung bình. Những người khác chỉ định hình dạng làm đối số thứ hai (nhưng điều này dường như không được sử dụng rộng rãi). Tôi sẽ cập nhật câu trả lời của mình để phản ánh ký hiệu phổ biến hơn và cho biết đối số hình dạng là khóa. –

0

Thử biên dịch với tối ưu hóa. Sử dụng cờ -O3 thường sẽ tăng tốc độ. Xem phần này post on optimisation flags hoặc this overview để biết thêm chi tiết.

+5

Trước tiên, bạn nên hỏi OP trong nhận xét liệu anh ấy có thực sự đang sử dụng cờ tối ưu hóa hay không. – mfontanini

2

Nếu bạn muốn có một phân phối đó là rất Beta-like, nhưng có một CDF hình thức đóng nghịch đảo rất đơn giản, nó có giá trị xem xét sự phân bố Kumaraswamy:

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

Nó được sử dụng để thay thế cho các Phân phối beta khi một số lượng lớn các mẫu ngẫu nhiên được yêu cầu nhanh chóng.

Các vấn đề liên quan