다운로드
작성자: admin 작성일시: 2016-05-22 17:59:03 조회수: 4171 다운로드: 289
카테고리: 기초 수학 태그목록:

베르누이 분포

베르누이 시도

결과가 성공(Success) 혹은 실패(Fail) 두 가지 중 하나로만 나오는 것을 베르누이 시도(Bernoulli trial)라고 한다. 예를 들어 동전을 한 번 던져 앞면(H:Head)이 나오거나 뒷면(T:Tail)이 나오게 하는 것은 베르누이 시도의 일종이다.

베르누이 시도의 결과를 확률 변수(random variable) $X$ 로 나타낼 때는 일반적으로 성공을 정수 1 ($X=1$), 실패를 정수 0 ($X=0$)으로 정한다. 때로는 실패를 0 이 아닌 -1($X=-1$)로 정하는 경우도 있다.

베르누이 확률 변수

베르누이 확률 변수는 0, 1 두 가지 값 중 하나만 가질 수 있으므로 이산 확률 변수(discrete random variable)이다. 따라서 확률 질량 함수(pmf: probability mass function)로 정의할 수 있다.

베르누이 확률 변수의 확률 질량 함수는 다음과 같다.

$$ \text{Bern}(x;\theta) = \begin{cases} \theta & \text{if }x=1, \\ 1-\theta & \text{if }x=0 \end{cases} $$

베르누이 확률 변수는 1이 나올 확률을 의미하는 $\theta$라는 모수를 가진다. 변수와 모수는 세미콜론(;, semi-colone)기호로 분리하였다. 0이 나올 확률은 $1 - \theta$이다.

위 식을 하나의 수식으로 표현하면 다음과 같이 쓸 수도 있다.

$$ \text{Bern}(x;\theta) = \theta^x(1-\theta)^{(1-x)} $$

연습 문제 1

위 식에서 $x=1$과 $x=0$을 각각 대입하여 원래의 확률 질량 함수 수식이 나오는 것을 확인한다.

만약 베르누이 확률 변수가 1과 -1이라는 값을 가진다면 다음과 같은 수식으로 써야 한다.

$$ \text{Bern}(x; \theta) = \theta^{(1+x)/2} (1-\theta)^{(1-x)/2} $$

만약 어떤 확률 변수 $X$가 베르누이 분포에 의해 발생된다면 "확률 변수 $X$가 베르누이 분포를 따른다"라고 말하고 다음과 같이 수식으로 쓴다.

$$ X \sim \text{Bern}(x;\theta) $$

SciPy를 사용한 베르누이 확률 변수의 시뮬레이션

Scipy의 stats 서브 패키지에 있는 bernoulli 클래스가 베르누이 확률 변수를 위한 클래스다. p 인수로 분포의 모수 $\theta$을 설정한다.

다음 예에서는 p = 0.6 으로 설정하였다.

In:
theta = 0.6
rv = sp.stats.bernoulli(theta)

pmf 메서드를 사용하면 확률 질량 함수(pmf: probability mass function)를 계산할 수 있다.

In:
xx = [0, 1]
plt.bar(xx, rv.pmf(xx))
plt.xlim(-1, 2)
plt.ylim(0, 1)
plt.xticks([0, 1], ["x=0", "x=1"])
plt.xlabel("표본값")
plt.ylabel("P(x)")
plt.title("베르누이 확률변수의 pmf")
plt.show()

시뮬레이션을 하려면 rvs 메서드를 사용한다.

In:
x = rv.rvs(100, random_state=0)
x
Out:
array([1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,
       0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0,
       1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0,
       1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0,
       1, 0, 1, 1, 1, 1, 0, 1])

결과를 seaborn의 countplot 명령으로 시각화한다.

In:
sns.countplot(x)
plt.title("베르누이 확률변수의 시뮬레이션 결과")
plt.xlabel("표본값")
plt.show()

이론적인 확률 분포와 샘플의 확률 분포를 동시에 나타내려면 다음과 같은 코드를 사용한다.

In:
y = np.bincount(x, minlength=2) / float(len(x))

df = pd.DataFrame({"이론": rv.pmf(xx), "시뮬레이션": y})
df.index = [0, 1]
df
Out:
시뮬레이션 이론
0 0.38 0.4
1 0.62 0.6

seaborn의 barplot 명령으로 시각화하면 다음과 같다.

In:
df2 = df.stack().reset_index()
df2.columns = ["표본값", "유형", "비율"]
df2
Out:
표본값 유형 비율
0 0 시뮬레이션 0.38
1 0 이론 0.40
2 1 시뮬레이션 0.62
3 1 이론 0.60
In:
sns.barplot(x="표본값", y="비율", hue="유형", data=df2)
plt.show()

연습 문제 2

베르누이 확률 분포의 모수가 다음과 같을 경우에 각각 샘플을 생성한 후 기댓값과 분산을 구하고 앞의 예제와 같이 확률 밀도 함수와 비교한 카운트 플롯을 그린다. 샘플의 갯수가 10개인 경우와 1000개인 경우에 대해 각각 위의 계산을 한다.

  1. $\theta = 0.5$
  2. $\theta = 0.9$

베르누이 분포의 모멘트

베르누이 분포의 모멘트는 다음과 같다.

기댓값

$$\text{E}[X] = \theta$$

(증명)

$$\text{E}[X] = \sum x_i P(x_i) = 1 \cdot \theta + 0 \cdot (1 - \theta) = \theta$$

분산

$$\text{Var}[X] = \theta(1-\theta)$$

(증명)

$$\text{Var}[X] = \sum (x_i - \mu)^2 P(x_i) = (1 - \theta)^2 \cdot \theta + (0 - \theta)^2 \cdot (1 - \theta) = \theta(1-\theta)$$

앞의 예에서는 $\theta = 0.6$이였으므로 이론적인 기댓값과 분산은 다음과 같다.

$$ \text{E}[X] = 0.6 $$$$ \text{Var}[X] = 0.6 \cdot (1 - 0.6) = 0.24 $$

데이터에서 계산한 샘플 평균 및 샘플 분산은 다음과 같이 계산한다.

In:
np.mean(x)
Out:
0.62
In:
np.var(x, ddof=1)
Out:
0.23797979797979804

SciPy의 describe 명령으로 계산할 수도 있다.

In:
s = sp.stats.describe(x)
s[2], s[3]
Out:
(0.62, 0.23797979797979804)

베르누이 분포의 모수추정

데이터에서 모수의 값을 찾아내는 것을 모수추정(parameter estimation)이라고 한다. 베르누이 분포 모수 $\theta$를 추정한 값 $\hat\theta$은 다음처럼 계산한다.

$$ \hat{\theta} = \dfrac{\sum_{i=1}^N x_i}{N}= \dfrac{N_1}{N} $$

이 식에서 $N$은 전체 데이터의 수, $N_1$은 1이 나온 횟수이다.

베르누이 분포의 활용

베르누이 분포는 다음과 같은 경우에 사용된다.

  1. 분류 예측 문제의 출력 데이터가 두 개의 값으로 구분되는 카테고리 값인 경우, 두 값 중 어느 값이 가능성이 높은지를 표현하기 위해 사용된다.
  2. 입력 데이터가 0 또는 1 혹은 참 또는 거짓, 두 개의 값으로 구분되는 카테고리 값인 경우, 두 종류의 값이 나타나는 비율을 표현하기 위해 사용된다.

예를 들어 스팸 메일과 정상 메일을 구분해야 하는 스팸 메일 필터를 만들어야 한다고 가정하자. 스팸 메일 필터를 만들기 위해 특정한 메일 계정으로 들어오는 메일을 모두 분석하였다. 만약 메일이 모두 10통이고 이 중 6통이 스팸 메일이라면 이 메일 계정으로 들어온 메일이 스팸 메일일 가능성은 60%이다. 이러한 상황은 $\theta = 0.6$인 베르누이 분포로 나타낼 수 있다.

$$ P(Y) = \text{Bern}(y; \theta = 0.6) $$

확률 변수 $Y$는 메일이 스팸 메일인지 아닌지를 나타내며 $Y=1$이면 스팸 메일이다.

또한 스팸 메일은 특정한 단어(키워드)를 가지고 있을 확률이 높다. 스팸 메일을 구분하기 위한 키워드가 여러 개라면 다음과 같이 BOW(Bag of Words) 인코딩된 벡터로 나타낼 수 있다. 이 예에서는 4개의 키워드를 사용하였다. 만약 어떤 메일이 첫번째와 세번째 키워드를 포함하고 있으며 두번째와 네번째 키워드는 포함하지 않으면 다음과 같은 특징 벡터로 표시할 수 있다.

$$ x = \begin{bmatrix} 1 \\ 0 \\ 1 \\ 0 \end{bmatrix} $$

여러개의 메일이 있으면 다음처럼 특징 행렬로 표시한다. 특징 행렬에서는 행 벡터가 메일을, 열 벡터가 키워드를 나타낸다.

$$ X = \begin{bmatrix} 1 & 0 & 1 & 0 \\ 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 \\ \end{bmatrix} $$

이때, 스팸 메일의 특성은 4개의 베르누이 확률 분포 $(X_1, X_2, X_3, X_4)$로 나타낼 수 있다.

$$ X_1 \sim \text{Bern}(x_1; \theta_1) : \text{스팸 메일이 첫번째 키워드를 포함하고 있을 확률}$$$$ X_2 \sim \text{Bern}(x_2; \theta_2) : \text{스팸 메일이 두번째 키워드를 포함하고 있을 확률}$$$$ X_3 \sim \text{Bern}(x_3; \theta_3) : \text{스팸 메일이 세번째 키워드를 포함하고 있을 확률}$$$$ X_4 \sim \text{Bern}(x_4; \theta_4) : \text{스팸 메일이 네번째 키워드를 포함하고 있을 확률}$$

특징 행렬의 각 열로부터 각 베르누이 확률 분포의 모수의 추정값을 구하면 다음과 같다.

$$ \hat\theta_1 = \dfrac{5}{6},\;\; \hat\theta_2 = \dfrac{4}{6},\;\; \hat\theta_3 = \dfrac{3}{6},\;\; \hat\theta_4 = \dfrac{3}{6} $$

연습 문제 3

  1. 스팸 메일이 아닌 정상 메일의 데이터가 다음과 같은 특징 행렬로 표시되면 정상 메일의 특성은 어떻게 나타낼 수 있는가? $$ \begin{bmatrix} 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ \end{bmatrix} $$
  2. 스팸 메일과 정상 메일의 특성을 모두 모형화하려면 몇 개의 베르누이 확률 변수가 필요한가?

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!