지난 포스팅에서 bernoulli r.v. generation 에 대해 설명 드린 바 있습니다.

 
2011/04/06 - [MATLAB] - MATLAB Bernoulli random variable generation

 

오늘은 그 연장선상으로 binomial r.v. generation에 대해 설명 드리겠습니다.

 

binomial distribution은 이항 분포라고 하는데, 한번의 시행에서의 성공 확률이 p 인 경우 n 번의 시행에서 k 번 성공할 확률을 의미 합니다.

 

 



 

이렇게 말하니깐 잘 이해 못하시겠다면, 주사위의 예를 들면 이해 하기 편하실 것 같습니다.

 

주사위를 던져서 숫자 1이 나올 확률은 1/6 이죠. 10 번 던져서 k 번 만큼 숫자 1이 나올 확률이 이항 분포로 다음 식과 같이 표현 됩니다.

 

 

위 식에 k=0 ~ 10 의 값을 대입하면 pmf 값을 구할 수가 있죠.

 

그리고 pmf 를 누적 해서 합 하면 cdf 값이 되죠.

 

cdf 값이 있으면, uniform r.v. 를 사용하여 binomial r.v. 를 생성 할 수 있는 것이죠.

 



 

이에 대한 MATLAB 코드는 다음과 같습니다.

 

 



 

위 코드에 따른 binomial pmf 및 cdf 는 다음과 같습니다.

 

 



 

이제 위 코드 예에 대한 이론적 평균 및 분산을 구해 보죠.

 

이론적 평균 np= 10*1/6 = 1.6667 이고

 

이론적 분산 np(1-p) = 10*1/6*5/6=1.3889 입니다.

 

위 코드에 의해 생성된 binomial r.v.의 평균 및 분산은 다음과 같이 위 이론적 결과와 근사적으로 일치 함을 확인 할 수 있습니다.

 

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17
MATLAB cell class  (6) 2011.04.11
MATLAB taylor, Maclaurin serise  (0) 2011.04.10
MATLAB 그래프에 값 넣기 추가, gtext()  (0) 2011.04.09
MATLAB 그래프에 값 넣기  (0) 2011.04.09
  1. 궁금 2016.12.03 18:29

    rv를 통해 pdf와 cdf를 plot할 때 히스토그램을 이용하는 이유는 무엇인가요? 그냥 plot함수를 써서 나타낼 수는 없나요?

    • 남성 2016.12.04 00:12 신고

      위 포스팅에서도 hist 를 사용해서 그림을 그린건 아니죠. 그림은 stem() 함수를 사용했고 hist 는 말 그대로 히스토그램을 구하기 위해 사용한 겁니다.

    • 궁금 2016.12.04 20:07

      pmf에 buffer가 필요한 이유는 뭔가요??

    • 남성 2016.12.04 23:53 신고

      PMF 값을 저장하기 위한거죠.

Random Variable을 생성하기 위해서는 r.v. 의 CDF 값을 알고 있어야 한다.

 

CDF 값을 알고 있으면, 대부분의 컴퓨터 언어에서 기본적으로 제공하는 uniform r.v. 을 생성한 후 CDF 의 inverse 를 통해 r.v. 을 생성한다.

 

오늘의 포스팅에서는 MATLAB 을 이용하여 Bernoulli r.v. 를 생성해 보고 그 PMF(Probability Mass Function)와 CDF 를 확인한다.

 

bernoulli r.v. 은 k=0, 1 에 대하여 다음과 같은 PMF 및 CDF 값을 갖는다.

 

PMF:

 

CDF:

 

그럼 이제 MATLAB을 이용하여 Bernoulli r.v. generation 을 생성해 보자.

 

코드는 다음과 같다.

 

 

 

 

위 코드는 p = 0.3 인 경우의 Bernoulli r.v. 를 생성하고 이에 대한 pmf, cdf 를 표현했으며

 

시뮬레이션에 따른 평균과 분산은 다음과 같다.

 

 

bernoulli r.v. 의 이론적인 평균은 p 이며 위 시뮬레이션의 경우 p=0.3

 

이론적 분산은 p(1-p)=0.3 x 0.7=0.21

 

이므로 시뮬레이션 결과와 이론적 평균 분산 값이 일치 함을 확인 할 수 있다.


  1. ㅠㅜ 2016.12.04 17:49

    bernoulli cdf를 전체 실수 정의역에서 plot할 수는 없나요? 올려주신 코드는 0, 1에서의 값만 알아볼 수 있는데 x에 -1을 입력하면 0, 5를 입력하면 1이 되는 코드를 짜려면 어떻게 해야 하는지 궁금합니다. if문으로는 단일 입력에 대한 값만 볼 수 있고 plot 등 벡터에 대한 값은 볼 수 없던데..

MATLAB 으로 PDF 를 그려보자.

PDF(Probability Density Function)라는게 어케 보면 Histogram이랑 개형은 같지만

엄밀하게 얘기하면 좀 다르다고 할 수 있다.

그 차이는 바로 Normalization에 있다.

PDF 의 특징은 그 적분값이 1 이어야 하므로 당연히 Histogram 을 그린후 그 넓이를 Normalization 을 해야한다.

간단하게 [0 100] 구간의 Uniform pdf 를 그려 보자.

MATLAB editor 에 다음과 같이 타이핑 하고 실행해 보자

<MATLAB CODE>


N = 3000;

Uniform_sample=rand(N,N)*100; % 0~ 100 사이의 Uniform sample 을 발생시킨다.

[pdf,X]= hist(Uniform_sample(:), 500); % hist 함수를 이용하여 구간별로 쌓아준다

resol=X(2)-X(1);             % resolution을 계산한다.

pdf= pdf/(N^2.*resol); % Normalization 해 준다.

figure(1), bar(X,pdf), grid on, title('Uniform PDF') % 그래프를 그린다.

그래프를 보면 딱 봐도 넓이가 100 * 0.01 =1 이라는 것을 알 수 있다. 이게 제대로 된 PDF 이다.

 

그럼 좀더 나아가서 rand() 함수를 이용하여 Gaussian sample 을 만들고 PDF 를 그려 보자.

 

<MATLAB CODE>

 

N = 3000;

std = 2; % 표준편차

std_normal=sqrt(-2*log(rand(N))).*cos(2*pi*rand(N)); % 평균이 0 이고 분산이 1인 Gaussian Sample

NormalSample=std*std_normal; % 표준편차가 2인 Gaussian Sample

[pdf,X]= hist(NormalSample(:), 500); % hist 함수를 이용하여 구간별로 쌓아준다

resol=X(2)-X(1); % resolution을 계산한다.

pdf= pdf/(N^2.*resol); % Normalization 해 준다.

figure(2), bar(X,pdf), grid on, title('Gaussian PDF') % 그래프를 그린다.


  1. 2020.04.12 16:18

    좋은 포스팅 감사합니당❗️
    혹시 uniform rv 에서 -5부터 5까지만(주어진 범위 내에서만)1이되고 나머지는 0이되는 pdf 그릴 때는 어떤 부분을 고쳐야하는지 알 수 있을까요???

    • 남성 2020.04.12 16:45 신고

      아래 포스팅 참조 하시면~
      https://iamaman.tistory.com/130

      이렇게 코딩 할 수 있겠네요~

      % -5~5 사이 uniform RV 100 행 x 100 열
      a = -5 ;
      b= 5;
      n = 100;
      k= 100;
      Uniform_rand = a + (b-a).*rand(n, k);

    • 2020.04.12 17:03

      앗 확인했습니다 감사합니다!

  2. hoho 2020.05.04 00:12

    안녕하세요! 매번 포스팅 잘 보고 있습니다.
    질문이 있어 댓글 남깁니다.

    위에 알려주신 pdf 구하는 방법으로 Y=X1+X2에서 Y의 pdf 구할 수 있었습니다. (엑스1 엑스2는 유니폼랜덤변수입니다.)
    위 방법을 확인하려고 매트랩 내장함수를 이용해서 pdf를 구해보려 하는데
    theoretical_pdf_Y 를 conv(theoretical_pdf_X1, theoretical_pdf_X2)로 잡으면 알려주신 방법으로 그린 그래프와 다르게 나와서요ㅜㅜ

    • 남성 2020.05.04 00:44 신고

      아래와 같이 코딩 해보면 나올 겁니다.

      N=1000;
      x = linspace(0,1,N);
      y = unifpdf(x);
      [y, ny] = conv_m(y,x,y,x);
      plot(ny,y/N)

      위 코드 중에서 conv_m() 함수는 아래 주소에 있습니다.

      https://iamaman.tistory.com/1672

+ Recent posts