정규 분포를 시뮬레이션하기 위해 역 CDF 방법에 비해 Box-Muller의 장점은 무엇입니까?


15

균일 한 변수 집합에서 정규 분포를 시뮬레이션하기 위해 몇 가지 기술이 있습니다.

  1. Box-Muller 알고리즘 은 하나가 두 개의 독립된 균일 한 변이 샘플링 (0,1)하여 다음을 통해 두 개의 독립적 인 표준 정규 분포로 변환합니다.

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. CDF 방법 은 정규 cdf (F(Z)) 를 균등 한 변량 과 동일하게 할 수 있습니다 .

    F(Z)=U
    이고 Z = F - 1 ( U )를 도출합니다.
    Z=F1(U)

내 질문은 : 어느 것이 더 효율적입니까? 나는 후자의 방법을 생각할 것입니다. 그러나 읽은 대부분의 논문은 Box-Muller를 사용합니다. 왜 그렇습니까?

추가 정보:

정상적인 CDF의 역수는 다음과 같이 알고 제공합니다.

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

따라서 :

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

1
일반 cdf의 역수는 무엇입니까? 원본 CDF를 부분 선형 함수로 근사한 경우에만 분석적으로 계산할 수 없습니다.
Artem Sobolev

두 사람이 서로 밀접하게 관련되어 있지 않습니까? Box Muller는 2 변수 생성의 특별한 경우라고 생각합니다.
ttnphns

안녕 Barmaley, 나는 위에 더 많은 정보를 추가했습니다. Inverse CDF에는 표현식이 있지만 은 계산식으로 계산되어야합니다. 따라서 box Muller가 선호되는 이유는 무엇입니까? 나는 erf 1sin의 값과 매우 유사한 룩업 테이블에서 계산 될 것이라고 가정했다. erf1erf1sin 했습니까? 따라서 계산 비용이 훨씬 많이 들지 않습니까? 그러나 나는 틀릴 수 있습니다. cosine
user2350366

2
죄와 코사인이없는 Box-Muller 버전이 있습니다.
시안

2
@Dilip 컴퓨터 그래픽, 사인 및 코사인과 같은 초정밀 응용 분야의 경우 적절한 조회 테이블을 사용하여 실제로 최적화 할 수 있습니다. 그러나 통계 응용 프로그램의 경우 이러한 최적화가 사용되지 않습니다. 궁극적으로 log 또는 sqrt 보다 을 계산하는 것이 실제로 어렵지는 않지만 현대 컴퓨팅 시스템 에서는 삼각 함수 를 포함하여 exp 와 관련된 기본 기능 이 최적화되는 경향이 있습니다 ( coslog 는 인텔의 기본 명령이었습니다) erf는 사용할 수 없거나 더 높은 (= 느린) 레벨로 코딩되었습니다. erf1logsqrtexpcoslog
whuber

답변:


16

순전히 확률론적인 관점에서, 두 접근법 모두 정확하고 따라서 동등합니다. 알고리즘 관점에서, 비교는 정밀도와 컴퓨팅 비용을 모두 고려해야합니다.

Box-Muller는 균일 한 발전기를 사용하며이 균일 한 발전기와 비용이 거의 같습니다. 내 의견에서 언급했듯이 로그가 없으면 사인 또는 코사인 호출없이 벗어날 수 있습니다.

  • 생성 까지 S = U (2) (1) + U (2)
    U1,U2iidU(1,1)
    S=U12+U221
  • 걸릴 와 정의Z=2log(S)/S
    X1=ZU1, X2=ZU2

일반 반전 알고리즘을 사용하려면 역 정규 cdf를 호출해야합니다. qnorm(runif(N)) R에서는, 양자 함수가 잘 코딩되지 않으면, 상기보다 더 비쌀 수 있고 정밀도 측면에서 테일에서 실패 할 수있다.

에 의해 의견을 따르 whuber 의 비교 rnorm(N)qnorm(runif(N))실행 시간에 모두, 역 CDF의 장점에있다 :

> 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` `

꼬리에 맞는면에서 : 여기에 이미지 설명을 입력하십시오

내 블로그 에서 Radford Neal의견에 따라 기본 설정을 지적하고 싶습니다.rnorm R 은 반전 방법을 사용하므로 위의 비교는 시뮬레이션 방법 자체가 아닌 인터페이스에 반영 ! RNG에 관한 R 문서를 인용하려면 :

‘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
(1) 는 어떻습니까logΦ1Φ1X1X2Ui1101
whuber

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

1
동의합니다qnorm(runif(N))rnorm(N)
Xi'an

3
Φ1sincos

1
비교를 위해 사용 i7-3740QM @ 2.7GHz의 및 R 3.12, 다음 통화 : 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)내가 얻을 mean 11.38363 median 11.18718반전과 mean 13.00401 median 12.48802박스 뮬러에 대한
아브라함
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.