기존의 프로그래밍 언어를 사용하여 알려진 평균 및 분산을 갖는 정규 분포에서 표본을 추출하는 방법은 무엇입니까?


36

나는 통계 과정을 한 번도 본 적이 없으므로 여기에 올바른 장소에 묻기를 바랍니다.

정규 분포를 나타내는 두 개의 데이터, 즉 평균 및 분산 만 있다고 가정 합니다. 컴퓨터를 사용 하여이 두 분포를 무작위로 샘플링 하여이 두 통계를 존중하고 싶습니다.σ 2μσ2

샘플을 출력하기 전에 각 샘플에 를 추가하기 만하면 0을 정규화하여 평균을 처리 할 수 ​​있다는 것이 분명합니다 . 그러나 프로그래밍 방식으로 샘플을 생성하여 를 존중하는 방법을 보지 못했습니다 .σ 2μσ2

내 프로그램은 일반적인 프로그래밍 언어로 진행됩니다. 통계 패키지에 액세스 할 수 없습니다.


언어에 난수 생성기가 있습니까? 이 생성기는 균일 분포에서만 발생합니까, 아니면 정규 분포에서도 생성 할 수 있습니까?
ttnphns 2016 년

@ttnphns : 거의 모든 컴퓨터 언어에는 난수 생성기가 있습니다. 그들은 유한 영역에서 압도적으로 균일 한 발전기입니다.
Fixee

답변:


33

평균이 0이고 분산이 1 인 주어진 분포에서 표본을 추출 할 수있는 경우 해당 분포의 척도-위치 변환 ( 평균 및 분산 σ 2)을 쉽게 표본 추출 할 수 있습니다 . 경우 X는 시료가 평균 0, 분산 1 인 분포로부터 후 σ X + μ 평균이 샘플이다 μ 와 분산 σ 2 . 따라서 평균 μ 추가 하기 전에 표준 편차 σ (분산의 제곱근)로 변수를 스케일링 하기 만하면 됩니다.μσ2엑스

σ엑스+μ
μσ2σμ

평균이 0이고 분산이 1 인 정규 분포에서 실제로 시뮬레이션을 얻는 방법은 다른 이야기입니다. 이러한 것들을 구현하는 방법을 아는 것은 재미 있고 흥미롭지 만 통계 패키지 또는 프로그래밍 언어 사용 여부에 관계없이 난수 생성에 적합한 함수 또는 라이브러리를 얻어 사용하는 것이 좋습니다. 사용할 라이브러리에 대한 조언이 필요한 경우 사용중인 프로그래밍 언어에 대한 특정 정보를 추가 할 수 있습니다.

편집 : 의견, 다른 답변 및 Fixee 가이 답변을 수락했다는 사실에 비추어 균일 변수의 변환을 사용하여 정규 변수를 생성하는 방법에 대해 자세히 설명합니다.

  • VitalStatistix 의 의견에서 이미 언급 한 방법 중 하나 는 Box-Muller 방법으로 두 개의 독립적 인 균일 랜덤 변수를 사용하고 두 개의 독립적 인 정규 랜덤 변수를 생성합니다. 몇 가지 더 많은 시뮬레이션을 희생하면서 두 개의 초월 함수 sincos 의 계산을 피하는 비슷한 방법이 francogrex에 의해 답변되었습니다 .
  • 완전히 일반적인 방법은 역 분포 함수에 의해 균일 한 랜덤 변수를 변환하는 것입니다. 경우 균일하게 배포된다 [ 0 , 1 ] 다음 Φ - 1 ( U ) 가있는 표준 정규 분포. Φ - 1에 대한 명시적인 분석 공식은 없지만 정확한 수치 근사로 계산할 수 있습니다. R의 현재 구현 (마지막으로 확인)은이 아이디어를 사용합니다. 이 방법은 개념적으로 매우 간단하지만 Φ - 1 의 정확한 구현이 필요합니다 . 이는 아마도 (다른) 초월 함수만큼 널리 퍼져 있지는 않습니다.[0,1]
    Φ1()
    Φ1Φ1로그 , cos .
  • 여러 해답은 중앙 한계 정리를 사용하여 정규 분포를 근사 분포의 평균으로 추정 할 수있는 가능성을 언급합니다. 이것은 일반적으로 권장되지 않습니다. 평균 0 및 분산 1과 같은 인수 및 분포 지원 고려 사항은 설득력이 없습니다. Christian P. Robert와 George Casella의 "R을 사용한 Monte Carlo Methods 소개"연습 2.3에서이 생성기는 구식이라고하며 근사치는 매우 열악 합니다.
  • 놀랍게도 많은 다른 아이디어가 있습니다. 3 장, 특히 3.4 절 "컴퓨터 프로그래밍 기술"Vol. Donald E. Knuth의 2는 난수 생성에 대한 고전적인 참고 자료입니다. Brian Ripley는 Computer Generation Random Variables : A Tutorial을 썼습니다 . Robert와 Casella가 언급 한 책 또는 다른 책인 "Monte Carlo 통계 방법"의 2 장도 권장됩니다.

하루가 끝나면 올바르게 구현 된 방법이 사용 된 균일 한 의사 난수 생성기보다 좋지 않습니다. 개인적으로 저는 신뢰할 수 있다고 생각되는 특수 목적 라이브러리에 의존하는 것을 선호합니다. 나는 거의 항상 R에서 직접 구현되거나 R / C ++의 API를 통해 구현 된 메소드에 의존합니다. 분명히 이것은 모든 사람을위한 해결책은 아니지만 대안을 추천 할 다른 라이브러리에 익숙하지 않습니다.


(+1) OP에 대한 좋은 답변과 조언.
추기경

18
여기서 불필요한 주석을 작성하고 있는지 확실하지 않지만 균일 한 난수 생성기에만 액세스 할 수있는 경우 Box-Muller Transform 을 사용하여 독립 N (0,1) 난수를 생성 할 수 있습니다 . 간단히 말해서, U_1과 U_2가 Uniform (0,1) 분포에서 독립된 경우
2로그(1)코사인(2π2)
은 독립적 인 N (0,1) 랜덤 변수로 분포됩니다. 기본 아이디어
2로그(1)(2π2)
VitalStatistix

2
@Vital : 불필요한 의견이 아닙니다. 좋은 것. Box-Muller 변환은 아마도 부주의로 나쁜 일을 할 가능성을 최소화하면서 프로그래밍하는 것이 가장 쉬운 방법 일 것입니다. 그것은 아니에요 빠른 하지만 경쟁력 충분. 즉, 기존 코드 라이브러리를 사용하는 것이 여전히 더 안전 할 것입니다. 특히 잘못된 단계를 겪을 가능성이 가장 높은 곳은 균일 한 랜덤 변이 입력이 생성 되는 방식에 있기 때문입니다 .
추기경

@Vital : 감사합니다. 이것이 제가 찾던 것입니다. 귀하의 의견을 답변으로 바꾸고 싶다면 기꺼이 의견을 보내주십시오.
Fixee

1
@VitalStatistix, 그것은 좋은 의견이며, 이것이 OP가 찾고 있었던 것 같습니다. 왜 그것을 답으로 바꾸고 균일 랜덤 변수의 변환을 사용하는 일반적인 아이디어에 대해 조금 자세히 설명해보십시오. 나는 모든 언어 의 기본 유니폼 생성기 가 좋은 생성기 인지 알지 못하기 때문에 추기경이 주로 언급하는 이유로 주저했습니다 .
NRH

10

이것은 실제로 Michael Lew의 답변과 Fixee의 의견에 대한 의견이지만이 사이트에서 의견을 말할 평판이 없기 때문에 답변으로 게시됩니다.

[0,1]61

이자형[나는=112엑스나는]=나는=112이자형[엑스나는]=12×12=6
var[나는=112엑스나는]=나는=112var[엑스나는]=12×112=1.
나는=112엑스나는610/12나는=112엑스나는6[6,6]6

5

NRH의 답변 외에도 "표준 정규 분포"N (0,1)에서 무작위 표본을 생성 할 방법이없는 경우 다음은 좋은 방법입니다. 패키지의 경우 아래 기능은 대부분의 표준 프로그래밍 언어로 제공되어야합니다).

두 균일 의해 -1 ~ 1 범위의 난수를 분산으로 U 및 V를 생성한다 (1)
u = 2 r1 - 1v = 2 r2 - 1

2. w = u^2 + v^2w> 1 인 경우 다시 1로 계산

3. z= sqrt(-2ln(w)/w) 샘플 코드를 사용 하여 u * z 및 y = v * z를 반환 하면 다음과 같습니다.

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

그런 다음 MHR이 위에서 제안한 것을 사용하여에서 임의의 편차를 얻습니다 N(mu, sigma^2).


위의 답변을 게시했을 때 @vitalStatistix가 Box-Muller Transform 알고리즘을 제공한다는 것을 알지 못했습니다. 내가 위에 제시 한 것 또한 내가 생각하는대로 좋다.
francogrex

2
가우시안 / 정규 분포의 pdf를 직접 사용하는 것이 아니라 균일 한 분포 (알고리즘 관점이 아닌)에서 정규 변량을 생성하는 이유를 설명해 주시겠습니까? 아니면 완전히 잘못입니까?
Arun

4
@Arun 한 가지 이유 : Marsaglia의 극좌표 법은 균일 한 편차를 생성하는 RNG 만있는 경우에 유용합니다.
chl

1
@ 가장 쉬운 방법입니다. 예를 들어 "수락 거부"방법을 사용하여 pdf에서 직접 생성 할 수도 있습니다. 의견 상자에 충분한 공간이 없기 때문에 내 사이트 에 간단한 를 게시했습니다 .
francogrex

4

정규 분포는 비슷한 분포의 많은 무작위 값을 더할 때 나타납니다 (서로 비슷합니다). 10 개 이상의 균일하게 분포 된 임의의 값을 더하면 합은 거의 정규 분포입니다. (보다 평범하게하려면 10 이상을 추가하십시오. 그러나 거의 모든 목적에 충분합니다.)

균일 한 랜덤 값이 0과 1 사이에 균일하게 분포되어 있다고 가정합니다. 그러면 합계는 0과 10 사이입니다. 합계에서 5를 빼면 결과 분포의 평균은 0이됩니다. 이제 결과를 표준 편차로 나눕니다. (거의) 정규 분포와 결과에 원하는 표준 편차를 곱합니다. 불행히도 나는 10 개의 균일 랜덤 편차의 합의 표준 편차가 무엇인지 확실하지 않지만, 운이 좋으면 누군가가 의견을 말하게 될 것입니다!

많은 시스템에서 정규 분포의 가정의 유용성은 전적으로 많은 임의의 영향의 합이 정규 분포로 이어진다는 속성에서 기인하기 때문에 학생들 에게이 용어로 정규 분포에 대해 이야기하는 것을 선호합니다.


여기서 Central Limit Thm을 사용하고 있습니다 (여러 개의 iid 임의 변수가 일반 임의 변수와 합쳐 짐) 나는 그것이 너무 느릴 것이라고 생각했기 때문에 이것을 고려하지 않았지만 10이 충분하다고 말합니까?! 이것은 로그와 sin / cos 및 sqrt를 계산하는 것보다 낫습니다!
Fixee

또한 [0,1]의 균일 rv 평균은 분산이 1/12 인 0.5입니다. 이 중 10을 합하면 평균이 5이고 분산이 10/12 = 5/6이됩니다.
Fixee

1
교육 학적 관점에서이 방법은 훌륭하고 유용한 토론과 시연을 제공합니다. 그러나 실제로는이 방법을 사용하지 않는 사람을 강력히 권장합니다.
추기경

1
로그코사인

1
@Michael : 그것은이 "오른쪽"분포가 근사 분포 컴팩트 지원을 가지고 있으며, 많은 응용 프로그램에, 하나는 특히 때문에, 약간의 신축성입니다 준다 선언 하지 variates 생성 할 수있는 방법을 효율적 대해주의를. :) 요점은 몇 가지 나은 옵션 이 있다는 것 입니다. 그러나 나는 여전히 그것이 교육적으로 유용한 것을 제공한다고 생각합니다.
추기경
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.