Loading [MathJax]/jax/output/CommonHTML/jax.js

g(x,y;σ)=12πσ2exp(x2+y22σ2)

원점을 중심으로 분산이 1 인 정규분포를 갖는 평면상의 점을 발생시킬 필요가 있는 경우에 아래의 함수를 이용한다: Box-Muller method.

내장 함수 rand()를 이용하면 [0,1] 구간에서 균일한 분포를 만들 수 있다. [0,1]×[0,1] 영역에서 균일한 분포를 갖는 두 개의 1차원 랜덤 변수 x1, x2을 이용해서 확률 변수 y1, y2의 2차원 Gaussian 분포를 주는 변환을 구하려면, 우선 확률 보존에 의해서 

dx1dx2=12πey21/2dy112πey22/2dy2

을 만족시켜야 한다. 극좌표 ρ2=y21+y22, ϕ=tan1(y2/y1)을 도입하면 

dx1dx2=eρ2/2ρdρdϕ2π로 쓸 수 있으므로 미소 변환은

dx1=eρ2/2dρ22,dx2=dϕ2π 로 선택할 수 있다. 따라서

x1=exp[ρ2/2]=exp[(y21+y22)/2],

x2=12πtan1(y2/y1).

그리고, 역변환은

y1=2ln(x1)cos(2πx2),y2=2ln(x1)sin(2πx2).

삼각함수의 계산을 피하기 위해서 반지름이 1인 원 내부에서 정의되는 두 개의 균일한 랜덤 변수 v1,v2를 도입하면, 다음 변환에 의해서 반지름 1인 원 영역이 변의 길이가 1인 정사각형 영역으로 보내진다.

x1=R2(=S)=v21+v22,2πx2=tan1(v2/v1).

따라서 반지름이 1인 원 내부의 랜덤 변수를 써서 2차원의 Gaussian 분포를 만들어주는 변환은

y1=2lnSv1S,y2=2lnSv2S

// 참고;  Numerical Receipe;
#define drand() ((double)rand() / RAND_MAX)   // [0,1]
// mean = 0; sigma = 1;
void normal_2D(double *x, double *y) {
    while (1) {
        double V1 = -1. + (2. * drand());
        double V2 = -1. + (2. * drand());
        double S = V1 * V1 + V2 * V2;
        if (S < 1.) {
            double rad = sqrt(-2.*log(S) / S);
            *x = V1 * rad;
            *y = V2 * rad;
            /* if (mean, sigma) were given,
            *x = meanx + sigma * (*x);
            *y = meany + sigma * (*y);
            */
            return;
        }
    }
};

728x90

'Image Recognition > Fundamental' 카테고리의 다른 글

점증적인 cosine/sine 값 계산  (1) 2020.12.28
Fast Float Sqrt  (0) 2020.12.27
PCA Line Fitting  (0) 2020.11.12
Histogram Equalization  (0) 2020.11.12
Least Squares Fitting of Circles  (0) 2020.11.11
,