아래 포스팅에서 포아송 분포에 대해서 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 정도로 이론 값과 유사하게 나오는 것을 확인할 수 있습니다.
'programming language > MATLAB' 카테고리의 다른 글
MATLAB 입사 반사파 그리기 애니메이션 animatedline, drawnow (0) | 2019.10.22 |
---|---|
MATLAB cell 중복 제거 및 중복 내용 확인하기 (1) | 2019.10.13 |
MATLAB 주기함수 만드는 방법 (583) | 2019.10.10 |
MATLAB brush 데이터 가져오기 (0) | 2019.06.07 |
MATLAB 그래프 사이 공간 색칠하기 fill, patch, area (742) | 2019.04.30 |
MATLAB 그래프 내에 그래프 넣기 (0) | 2019.04.13 |
MATLAB 스트럭처 정렬 방법 (0) | 2019.03.27 |
MATLAB 브러시, 데이터 커서 기능을 사용하여 데이터 가공하기 (0) | 2019.03.04 |
댓글