마르사글리아 극지법

Marsaglia polar method

마르사글리아 극지방법[1] 독립 표준 랜덤 변수 쌍을 생성하기 위한 의사 난수 표본 추출 방법이다.[2]Box-Muller 변환보다 우수하지만,[3] Ziggurat 알고리즘은 훨씬 더 효율적이다.[4]null

표준 정상 랜덤 변수는 컴퓨터 과학, 계산 통계, 특히 몬테카를로 방법의 적용에 자주 사용된다.null

극지방법은 정사각형 -1 < x < 1, -1 < y < 1까지)에서 임의의 점(x, y))을 선택하여 작동한다.

그리고 다음과 같이 필요한 정규 랜덤 변수 쌍을 반환한다.

또는 동등하게

여기서 / x{ / y {s은 벡터(x, y)가 x축으로 만드는 각도의 코사인 및 사인나타낸다.null

이론적 근거

기초 이론은 다음과 같이 요약할 수 있다.

u가 구간 0 ≤ u < 1에서 균일하게 분포하는 경우, 점(cos(2πu), sin(2πu)은 단위 원주2 x + y2 = 1에 균일하게 분포하고, 그 점에 분포가 있는 독립 랜덤 변수 ρ을 곱한다.

일리가 있다.

좌표는 두 개의 독립적인 표준 정규 랜덤 변수로 공동 분포한다.null

역사

이 생각은 라플레이스로 거슬러 올라간다. 라플레이스는 가우스가 위와 같은 것을 찾았다고 믿는다.

의 제곱근으로 하여

극좌표로의 변환은 θ이 0~2 2에서 균일하게 분포(정수 밀도)되고, 방사상 거리 r이 밀도를 갖는 것을 명백히 한다.

(r2 적절한 카이 제곱 분포를 가진다.)null

카이-제곱-2 변수의 제곱근에 의해 주어진 거리에 단위 원주에 무작위 점을 방사상으로 투영하여 한 쌍의 독립적인 표준 정상 변동을 생성하는 방법을 극성법이라고 한다.

현실적 고려

이 아이디어를 직접 적용하면

Box-Muller 변환이라고 불리며, 일반적으로 Chi variates는 다음과 같이 생성된다.

그러나 그 변환에는 로그, 제곱근, 사인 및 코사인 함수가 필요하다.일부 프로세서에서는 단일 명령을 사용하여 동일한 인수의 코사인(cosine)과 사인(sine)을 병렬로 계산할 수 있다.[5]특히 인텔 기반 기계의 경우 Fsincos Assembler 명령이나 expi 명령어(예: D)를 사용하여 복잡한 것을 계산할 수 있다.

현실과 상상의 부분만 분리하면 돼null

참고: 복합 극성 형태를 명시적으로 계산하려면 일반 양식에서 다음 대체품을 사용하십시오.

=- (1 ){\{- = u .{\ 그러면

이와는 대조적으로, 여기서 극성 방법은 코사인(cosine)과 사인(sine)을 계산할 필요성을 제거한다.대신, 단위 원의 한 점에 대한 해결을 통해, 이 두 2 + 2 {\}에 정규화된 x 및 y 좌표로 대체할 수 있다. 반경.특히 = + 점을 형성하여 단위 원주에 무작위 점(x, y)을 투영한다.

코사인이나 사인보다 더 빠른 절차야일부 연구자들은 조건부 if 명령어(단위 원 외부의 점을 거부하기 위한)가 파이프라인과 분기 예측이 장착된 현대 프로세서에서 프로그램을 더 느리게 만들 수 있다고 주장한다.[6]또한 이 절차에서는 기초 난수 생성기에 대한 평가가 약 27% 더 필요하다( / 만 단위 원 안에 있다null

그런 다음 원주에 있는 그 무작위 지점은 다음과 같은 방법으로 필요한 무작위 거리를 방사상으로 투영한다.

동일한 s를 사용하는 이유는 s가 원주의 임의 점으로부터 독립적이고 그 자체가 0에서 1까지 균일하게 분포되기 때문이다.

실행

평균 및 표준 편차를 사용하여 Java에서 단순 구현:

사유의 정태의 곱절로 하다 여분의; 사유의 정태의 부울 hasSpare = 거짓의;  공중의 정태의 동기화된 곱절로 하다 가우스 생성(곱절로 하다 심술궂다, 곱절로 하다 stdDev) {     만일 (hasSpare) {         hasSpare = 거짓의;         돌아오다 여분의 * stdDev + 심술궂다;     } 다른 {         곱절로 하다 u, v, s;         하다 {             u = 수학.무작위의() * 2 - 1;             v = 수학.무작위의() * 2 - 1;             s = u * u + v * v;         } 하는 동안에 (s >= 1    s == 0);         s = 수학.sqrt(-2.0 * 수학.통나무를 하다(s) / s);         여분의 = v * s;         hasSpare = 진실의;         돌아오다 심술궂다 + stdDev * u * s;     } } 

평균 및 표준 편차를 사용하여 C++에서 스레드되지 않은 안전 구현:

곱절로 하다 가우스 생성(곱절로 하다 심술궂다, 곱절로 하다 stdDev) {     정태의 곱절로 하다 여분의;     정태의 바가지 긁다 hasSpare = 거짓의;      만일 (hasSpare) {         hasSpare = 거짓의;         돌아오다 여분의 * stdDev + 심술궂다;     } 다른 {         곱절로 하다 u, v, s;         하다 {             u = (랜드() / ((곱절로 하다)랜드_MAX)) * 2.0 - 1.0;             v = (랜드() / ((곱절로 하다)랜드_MAX)) * 2.0 - 1.0;             s = u * u + v * v;         } 하는 동안에 (s >= 1.0    s == 0.0);         s = sqrt(-2.0 * 통나무를 하다(s) / s);         여분의 = v * s;         hasSpare = 진실의;         돌아오다 심술궂다 + stdDev * u * s;     } } 

C++11 GNU GCC libstdc+++의 std::normal_distribution 실행은 여기서 인용한 바와 같이 Marsaglia 극지방법을 사용한다.null

참조

  1. ^ Marsaglia, G.; Bray, T. A. (1964). "A Convenient Method for Generating Normal Variables". SIAM Review. 6 (3): 260–264. doi:10.1137/1006063. JSTOR 2027592.
  2. ^ 1994년 Springer 컴퓨터 실험을 통한 SDE의 수치적 해결책인 Peter E. Kloeden Eckhard Platen Henri Schurz.
  3. ^ Glasserman, Paul (2004), Monte Carlo Methods in Financial Engineering, Applications of Mathematics: Stochastic Modelling and Applied Probability, vol. 53, Springer, p. 66, ISBN 9780387004518.
  4. ^ Thomas, David B.; Luk, Wayne; Leong, Philip H.W.; Villasenor, John D. (2007). "Gaussian random number generators". ACM Computing Surveys. 39 (4): 11–es. CiteSeerX 10.1.1.127.5773. doi:10.1145/1287620.1287622.
  5. ^ Kanter, David. "Intel's Ivy Bridge Graphics Architecture". Real World Tech. Retrieved 8 April 2013.
  6. ^ 이 효과는 한 프로세서에 대한 거부반응이 많은 다른 프로세서의 속도를 늦출 수 있는 병렬로 많은 변수를 생성하는 GPU에서 높아질 수 있다.토마스, 데이비드 B. 제7을 참조하십시오.Howes, 이 대통령은 W;Luk, 웨인(2009년),"CPUGPUs, FPGA, 및 병렬 처리기 배열의 난수 생성에 대한 비교", 차우, 폴, Cheung, 피터 YK.(eds.), ACM/SIGDA 17일 국제 심포지엄 현장 PLA게이트 어레이, FPGA2009년에, 몬트레이, 캘리포니아, 미국, 2월 22–24인 2009년 협회의 회보.컴퓨터 학회,를 대신하여 서명함. 63–72, CiteSeerX 10.1.1.149.6066, doi:10.1145/1508128.1508139, 아이 에스비엔 9781605584102.