본문 바로가기
programming language/MATLAB

MATLAB 기하 분포(geometric distribution) 랜덤 변수 생성

by __observer__ 2020. 4. 12.
반응형

아래 포스팅에서 포아송 분포에 대해서 CDF(Cumulative Distribution Function) 를 사용하여 랜덤 변수를 생성하는 방법에 대해서 소개를 했었습니다.

https://iamaman.tistory.com/206

오늘은 어떤 분이 기하분포는 어떻게 생성을 하는지 문의를 하셔서 기하분포 CDF(Cumulative Distribution Function) 를 사용하여 랜덤변수를 생성하는 방법에 대해서 소개해 보려고 합니다.

기하분포의 정의에 대해서는 아래 주소를 참조하시기 바랍니다.

https://en.wikipedia.org/wiki/Geometric_distribution

기하분포는 첫 번째 성공까지의 시도 횟수를 모델링 할때는 아래와 같이 정의됩니다. k 는 1 부터 시작하는 것을 확인할 수 있습니다.

첫 번째 성공까지 실패 횟수를 모델링 할 때는 아래와 같이 정의됩니다. k 는 0 부터 시작하는 것을 확인할 수 있습니다.

위 두 모델링은 분산 값은 같지만 평균값은 다릅니다.

첫 번째 성공까지의 시도 횟수에 대한 모델링을 할 때의 분포에 대해서 코딩을 해 보면 아래와 같습니다. 위 포스팅에서 소개 했었던 포아송분포와 PMF 수식등을 제외하고는 코드는 그렇게 차이가 없습니다.

pV= 0.2; % 성공확률 0~1
pmf =@(k,p) (1-p).^(k-1).*p; % geometric pmf func.
k_vector=1:100; % k 값 설정, 적당히 100 정도까지만 설정
PMF_geometric=pmf(k_vector,pV); % geometric pmf 값
cdf_geometric=cumsum(PMF_geometric); % 이론적 cdf 값
cdf_p=[0 ; cdf_geometric(:)];
%% geometric r.v. generation
N_sample_sqr=1000;
N_sample=N_sample_sqr.^2; % 전체 샘플 수
U_rand=rand(N_sample_sqr); % uniform r.v. 생성
geometric_rv=zeros(size(U_rand));
for k=k_vector
index=(U_rand>= cdf_p(k)) & (U_rand < cdf_p(k+1));
geometric_rv(index)= k ;
end
%% PMF % CDF
[N,D]=hist(geometric_rv(:),k_vector);
figure, stem(D,N/N_sample),grid on, title('Geometric PMF, Number of attempts')
figure, plot(D,cumsum(N/N_sample)),grid on, title('Geometric CDF, Number of attempts')
%% 평균 & 분산
mean_v=mean(geometric_rv(:))
mean_theory = 1./pV
var_v=var(geometric_rv(:))
var_theory = (1-pV)./(pV.^2)

아래와 같은 PMF, CDF 그래프를 확인할 수 있습니다.

성공확률 0.2에 대한 시뮬레이션 결과 아래 실행 결과와 같이 평균은 5, 분산은 20 정도로 이론 값과 유사하게 나오는 것을 확인할 수 있습니다.

다음으로 첫 번째 성공까지 실패 횟수를 모델링 할때의 분포에 대해 코딩 해보면 아래와 같습니다.

pV= 0.2; % 성공확률 0~1
pmf =@(k,p) (1-p).^(k).*p; % geometric pmf func.
k_vector=0:100; % k 값 설정, 적당히 100 정도까지만 설정
PMF_geometric=pmf(k_vector,pV); % geometric pmf 값
cdf_geometric=cumsum(PMF_geometric); % 이론적 cdf 값
cdf_p=[0 ; cdf_geometric(:)];
%% geometric r.v. generation
N_sample_sqr=1000;
N_sample=N_sample_sqr.^2; % 전체 샘플 수
U_rand=rand(N_sample_sqr); % uniform r.v. 생성
geometric_rv=zeros(size(U_rand));
for k=k_vector
index=(U_rand>= cdf_p(k+1)) & (U_rand < cdf_p(k+2));
geometric_rv(index)= k ;
end
%% PMF % CDF
[N,D]=hist(geometric_rv(:),k_vector);
figure, stem(D,N/N_sample),grid on, title('Geometric PMF, Number of failures')
figure, plot(D,cumsum(N/N_sample)),grid on, title('Geometric CDF, Number of failures')
%% 평균 & 분산
mean_v=mean(geometric_rv(:))
mean_theory = (1-pV)./pV
var_v=var(geometric_rv(:))
var_theory = (1-pV)./(pV.^2)

아래와 같은 PMF, CDF 그래프를 확인할 수 있습니다.

성공확률 0.2에 대한 시뮬레이션 결과, 아래 실행 결과와 같이 평균은 4, 분산은 20 정도로 이론 값과 유사하게 나오는 것을 확인할 수 있습니다.



반응형