균일 한 랜덤 변수를 사용하여 가우스 랜덤 변수 구현


11

평균과 분산이 주어지면 가우시안 임의의 값을 반환하는 C ++ 함수를 작성하려고합니다.

rand()사이의 난수를 반환 하는 라이브러리 함수가 있습니다 . 고정 된 값은 없지만 이상임을 보증합니다 . PDF는 균일합니다.0RAND_MAXRAND_MAX2151

Central Limit Theorem을 사용하여 이것을 rand()가우시안 변수로 변환하고 있습니다. 내가 정확히하고있는 것은 rand()사용자가 지정한 시간 을 호출 한 다음 반환 값을 더한 다음 평균을 사용자 지정 평균으로 이동하는 것입니다.

가우스 PDF
위의 그림에서, 나는 가우시안 랜덤 제너레이터를 번 호출 했고 그 리턴 값의 주파수를 플로팅했습니다. 보시다시피, 분산은 다른 임의의 값의 합으로 만들어지기 때문에 거대합니다.107

성공적으로 Gaussian PDF와 지정된 평균값을 가진 Gaussian 변수를 반환합니다. 그러나 문제는 분산입니다. 분산을 사용자 지정 값으로 변경하는 방법을 모르기 때문에이 시점에 갇혀 있습니다.

이것은 내 코드입니다 (현재는 불완전합니다. 매개 변수 "Variance"는 무시 됨).

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

NUM_GAUSSIAN_SUMS100이고 RAND_MAX32767 이라고 가정하십시오 .

함수의 매개 변수에 따라 임의 변수의 분산을 변경하고 싶습니다. 내 질문은이 무작위 변수의 분산을 어떻게 변경할 수 있습니까? 어떻게하니?


3
가우스 랜덤 변수를 생성하기위한 중앙 한계 정리보다 낫고 빠른 방법이 있습니다. 하나의 Box-Muller 방법을 검색하십시오. 지그 구트 방법이 더 좋다고합니다.
Dilip Sarwate


3
실행 시간이 중요한 고려 사항이었던 예전에는 사람들이 임의 변수 ( 아님 합산 하고 을 빼서 표준 임의 변수에 대한 간단한 근사값을 얻은 다음 는 랜덤 변수 를 얻습니다 . (이것이 작동하는 이유는 @Hilmar의 답변을 참조하십시오). 많은 응용 분야에서이 간단한 방법은 매우 효과적 이었지만 값은 범위 되었으며 Six-Sigma가 유행어가되었을 때이 간단한 아이디어는 중단되었습니다. U ( 0 , 1 ) 100 6 N ( 0 , 1 ) Y = σ X + μ N ( μ , σ 2 ) ( μ - 6 σ , μ + 6 σ )12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ6σ,μ+6σ)
Dilip Sarwate

@DilipSarwate 아마도 우리가 선호하는 이유에 대한 타당성을 제시하는 대안으로 이러한 대안을 게시해야 합니다.
Ivo Flipse

@IvoFlipse 질문에 대한 대답은 "평균을 수정 한 후 분산을 어떻게 수정합니까?" 은 본질적으로 주석에 의해 수정 된대로 Hilmar가 받아 들인 대답입니다. 크기를 조정하여 분산을 수정 한 다음 평균을 다시 수정하십시오. 나중에; 먼저 스케일링하여 분산을 수정 한 다음 평균을 수정하십시오. OP는 자신이 더 나은 방법에 관심이 있고 Box-Muller 방법에 대한 코드를 가진 nibot의 링크를 상향 조정하지 않았다는 것을 나타내지 않습니다. 그래서 나는 그대로 둡니다.
Dilip Sarwate

답변:


6

초기 알고리즘은 0과 1 사이에 균일하게 분포 된 랜덤 변수를 만듭니다. 그 분산은 1/12입니다. NUM_GAUSSIAN_SUMS그 인스턴스 를 합산 하면 분산이됩니다 NUM_GAUSSIAN_SUMS/12. 목표 분산을 얻으려면 V합산 된 랜덤 변수에을 곱해야합니다 sqrt(V*12/NUM_GAUSSIAN_SUMS).

부수적으로, 템플릿은 float 및 double에 대해 합리적으로 작동하지만 고정 소수점 유형에 심각한 숫자 문제가 있습니다.


5

이 랜덤 변수의 분산을 어떻게 변경할 수 있습니까?

cXcXc2X


cXcX

1
중심을 맞추고 크기를 조정 한 다음 평균 복원하십시오. 중심 랜덤 변수의 스케일은 (0) 평균에 영향을 미치지 않습니다.
Emre

1

또 다른 방법이 있습니다!

가우시안이 아닌 다른 배포판을 원한다면 어떻게해야할까요? 이 경우 실제로 중앙 제한 정리를 사용할 수 없습니다. 그런 다음 어떻게 해결합니까?

균일 한 랜덤 변수를 임의의 PDF로 변환하는 방법이 있습니다. 이 방법을 역변환 방법 이라고합니다

U[01]

X=FX1(U)

FX(x)

따라서, 당신이해야 할 일은, rv의 샘플에서 구한 변수에 역 CDF 함수를 적용하는 것입니다.

또한 이전 방법과 달리 반복을 필요로하지 않으며 가우시안에 더 가까운 결과를 얻기 위해 반복 횟수에 의존하지 않습니다.

다음은 이에 대한 증거를 제공하는 참고 자료 중 하나입니다 .


3
> 또 다른 방법이 있습니다! 사실이지만 가우시안 랜덤 변수에 관한 고려중인 질문과는 관련이 없습니다. 가우스 CDF 나 그 역은 유한 한 수의 연산을 사용하여 기본 용어로 표현할 수 없으므로 제안 된 방법을 사용할 수 없습니다.
Dilip Sarwate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.