Ưu điểm của Box-Muller so với phương pháp CDF nghịch đảo để mô phỏng phân phối chuẩn?


15

Để mô phỏng phân phối bình thường từ một tập hợp các biến thống nhất, có một số kỹ thuật:

  1. Thuật toán Box-Muller , trong đó một mẫu lấy hai đồng phục độc lập thay đổi trên và biến chúng thành hai phân phối chuẩn thông thường độc lập thông qua: (0,1)

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. phương pháp CDF , trong đó người ta có thể đánh đồng cdf bình thường với phương sai Đồng nhất: và suy ra (F(Z))

    F(Z)=U
    Z=F1(U)

Câu hỏi của tôi là: tính toán nào hiệu quả hơn? Tôi sẽ nghĩ đó là phương pháp sau - nhưng hầu hết các bài báo tôi đọc đều sử dụng Box-Muller - tại sao?

Thông tin thêm:

Nghịch đảo của CDF bình thường được biết và đưa ra bởi:

F1(Z)=2erf1(2Z1),Z(0,1).

Do đó:

Z=F1(U)=2erf1(2U1),U(0,1).

1
Điều gì là nghịch đảo của cdf bình thường? Nó không thể được tính toán một cách phân tích, chỉ khi CDF ban đầu được tính gần đúng với hàm tuyến tính từng phần.
Artem Sobolev

Hai người có liên quan mật thiết với nhau không? Box Muller, tôi tin rằng, là một trường hợp cụ thể cho thế hệ 2 biến.
ttnphns

Xin chào Barmaley, tôi đã thêm một số thông tin ở trên. CDF nghịch đảo có biểu thức - tuy nhiên phải được tính toán - vì vậy đó có thể là lý do tại sao hộp Muller được ưa thích? Tôi giả sử erf 1 sẽ được tính trong các bảng tra cứu, giống như các giá trị của sincosin là? Do đó không đắt hơn nhiều tính toán? Tôi có thể sai tuy nhiên. erf1erf1sincosine
dùng2350366

2
Có các phiên bản của Box-Muller không có tội lỗi và cosin.
Tây An

2
@Dilip Đối với các ứng dụng có độ chính xác rất thấp, chẳng hạn như đồ họa máy tính, sin và cosine thực sự có thể được tối ưu hóa bằng cách sử dụng các bảng tra cứu phù hợp. Tuy nhiên, đối với các ứng dụng thống kê, tối ưu hóa như vậy không bao giờ được sử dụng. Cuối cùng, việc tính toán không thực sự khó hơn so với log hay sqrt , nhưng trên các hệ thống máy tính hiện đại, các chức năng cơ bản liên quan đến exp - bao gồm các hàm trig - có xu hướng được tối ưu hóa ( coslog là các hướng dẫn cơ bản trở lại trên Intel Chip 8087!), Trong khi erf không có sẵn hoặc đã được mã hóa ở mức cao hơn (= chậm hơn). erf1logsqrtexpcoslog
whuber

Câu trả lời:


16

Từ quan điểm xác suất hoàn toàn, cả hai cách tiếp cận đều đúng và do đó tương đương nhau. Từ góc độ thuật toán, việc so sánh phải xem xét cả độ chính xác và chi phí tính toán.

Box-Muller phụ thuộc vào một máy phát đồng nhất và có giá tương đương với máy phát đồng nhất này. Như đã đề cập trong nhận xét của tôi, bạn có thể thoát khỏi mà không cần các cuộc gọi sin hoặc cos, nếu không không có logarit:

  • tạo cho đến khi S = U 2 1 + U 2 21
    U1,U2iidU(1,1)
    S=U12+U221
  • lấy và xác địnhX1=ZU1Z=2log(S)/S
    X1=ZU1, X2=ZU2

Thuật toán đảo ngược chung yêu cầu gọi tới cdf bình thường nghịch đảo, ví dụ qnorm(runif(N))trong R, có thể tốn kém hơn so với ở trên và quan trọng hơn là có thể thất bại về mặt chính xác, trừ khi hàm lượng tử được mã hóa tốt.

Để theo dõi các bình luận được thực hiện bởi whuber , việc so sánh rnorm(N)qnorm(runif(N))là lợi thế của cdf nghịch đảo, cả về thời gian thực hiện:

> system.time(qnorm(runif(10^8)))
sutilisateur     système      écoulé
 10.137           0.120      10.251 
> system.time(rnorm(10^8))
utilisateur     système      écoulé
 13.417           0.060      13.472` `

và về mặt phù hợp ở đuôi: nhập mô tả hình ảnh ở đây

Theo một bình luận của Radford Neal trên blog của tôi , tôi muốn chỉ ra rằng mặc định rnormtrong R sử dụng phương thức đảo ngược, do đó so sánh trên là phản ánh trên giao diện chứ không phải trên chính phương thức mô phỏng! Để trích dẫn tài liệu R về RNG:

‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
 Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
 ‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
 (For inversion, see the reference in ‘qnorm’.)  The
 Kinderman-Ramage generator used in versions prior to 1.7.1 (now
 called ‘"Buggy"’) had several approximation errors and should only
 be used for reproduction of old results.  The ‘"Box-Muller"’
 generator is stateful as pairs of normals are generated and
 returned sequentially.  The state is reset whenever it is selected
 (even if it is the current normal generator) and when ‘kind’ is
 changed.

3
logΦ1Φ1X1X2Ui1101

2
R 3.0.2rowSumsSqnorm(runif(N))InverseCDF[NormalDistribution[], #] &

1
Tôi đồng ý, qnorm(runif(N))thậm chí còn nhanh hơn 20% so vớirnorm(N)
Xi'an

3
Φ1sincos

1
Để so sánh, sử dụng i7-3740QM @ 2.7Ghz và R 3.12, cho các cuộc gọi sau: RNGkind(kind = NULL, normal.kind = 'Inversion');At <- microbenchmark(A <- rnorm(1e5, 0, 1), times = 100L);RNGkind(kind = NULL, normal.kind = 'Box-Muller');Bt <- microbenchmark(B <- rnorm(1e5, 0, 1), times = 100L)Tôi nhận được mean 11.38363 median 11.18718đảo ngược và mean 13.00401 median 12.48802cho Box-Muller
Avraham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.