다운로드
작성자: admin 작성일시: 2016-05-24 12:08:10 조회수: 3681 다운로드: 289
카테고리: 기초 수학 태그목록:

카테고리 분포

카테고리 분포(Categorical distribution)는 베르누이 분포의 확장판이다.

베르누이 분포는 0 이나 1(또는 -1 이나 1)이 나오는 확률변수의 분포였다. 즉 동전을 던져 나오는 결과를 묘사할 때 쓸 수 있다. 그런데 동전이 아닌 주사위를 던져서 나오는 경우는 어떻게 묘사할 수 있을까? 이 때 사용하는 것이 카테고리 분포이다.

카테고리 분포는 1부터 K까지의 $K$개의 정수 값 중 하나가 나오는 확률변수의 분포이다. 따라서 주사위를 던져 나오는 눈금의 수는 $K=6$인 카테고리 분포이다.

주의할 점은 카테고리 분포를 가진 확률변수는 원래 카테고리인 스칼라 값을 출력하는 확률변수지만 다음과 같이 1과 0으로만 이루어진 다차원 벡터로 변형하여 사용한다.

$$ \begin{eqnarray} x = 1 \;\; & \rightarrow & \;\; x = (1, 0, 0, 0, 0, 0) \\ x = 2 \;\; & \rightarrow & \;\; x = (0, 1, 0, 0, 0, 0) \\ x = 3 \;\; & \rightarrow & \;\; x = (0, 0, 1, 0, 0, 0) \\ x = 4 \;\; & \rightarrow & \;\; x = (0, 0, 0, 1, 0, 0) \\ x = 5 \;\; & \rightarrow & \;\; x = (0, 0, 0, 0, 1, 0) \\ x = 6 \;\; & \rightarrow & \;\; x = (0, 0, 0, 0, 0, 1) \\ \end{eqnarray} $$

이러한 인코딩 방식을 원-핫-인코딩(One-Hot-Encoding) 이라고 한다.

즉 확률변수의 값 $x$이 다음과 같이 벡터이다.

$$ x = (x_1, x_2, x_3, x_4, x_5, x_6) $$

이 벡터를 구성하는 원소 $x_1$, $x_2$, $x_3$, $x_4$, $x_5$, $x_6$ 에는 다음과 같은 제한 조건이 붙는다.

$$ x_i = \begin{cases} 0 \\ 1 \end{cases} $$$$ \sum_{k=1}^K x_k = 1 $$

첫번째 제한 조건은 $x_k$의 값이 0 또는 1 만 가능하다는 것이고 두번째 제한 조건은 여러개의 $x_k$ 중 단 하나만 1일 수 있다는 것이다.

이 각각의 원소 값 $x_k$는 일종의 베르누이 확률분포로 볼 수 있기 때문에 각각 1이 나올 확률을 나타내는 모수 $\mu_k$를 가진다. 그리고 전체 카테고리 분포의 모수는 다음과 같이 벡터로 나타낸다.

$$ \mu = ( \mu_1, \cdots , \mu_K ) $$

이 모수 벡터도 다음과 같이 제한 조건을 가진다.

$$ 0 \leq \mu_i \leq 1 $$$$ \sum_{k=1}^K \mu_k = 1 $$

첫번째 제한 조건은 모수 $\mu_k$가 0과 1사이의 값만 가질 수 있다는 점을 가리킨다. 각각의 원소 값 $x_k$는 일종의 베르누이 확률분포로 볼 수 있기 때문에 당연하다. 두번째 제한 조건은 $\mu_k$의 합이 1이 된다는 것이다. 나올 수 있는 경우의 확률의 합은 1이 되어야 하므로 이 또한 당연하다. 다만 0 아니면 1만 되어야 하는 $x_k$ 와는 달리 $\mu_k$ 는 0부터 1사이의 어떤 실수 값이든 가질 수 있다.

카테고리 분포는

$$\text{Cat}(x_1, x_2, \dots, x_K;\mu_1, \dots, \mu_K)$$

로 표기하거나 출력 벡터 $x=(x_1, x_2, \dots, x_K)$, 모수 벡터 $\mu=(\mu_1, \dots, \mu_K)$를 사용하여

$$ \text{Cat}(x;\mu) $$

로 간단히 표기할 수 있다.

확률질량함수는 다음처럼 표기한다.

$$ \text{Cat}(x;\mu) = \begin{cases} \mu_1 & \text{if } x = (1, 0, 0, \cdots, 0) \\ \mu_2 & \text{if } x = (0, 1, 0, \cdots, 0) \\ \mu_3 & \text{if } x = (0, 0, 1, \cdots, 0) \\ \vdots & \vdots \\ \mu_K & \text{if } x = (0, 0, 0, \cdots, 1) \\ \end{cases} $$

위 식은 다음과 같이 쓸 수 있다. 이 간략한 표현은 One-Hot-Encoding을 사용한 덕분이다.

$$ \text{Cat}(x;\mu) = \mu_1^{x_1} \mu_2^{x_2} \cdots \mu_K^{x_K} = \prod_{k=1}^K \mu_k^{x_k} $$

연습 문제 8.2.5

$K=2$인 카테고리 분포의 확률질량함수가 이항 확률분포의 확률질량함수와 같음을 보여라.

카테고리 분포의 모멘트

카테고리 분포는 표본값이 벡터이므로 기댓값과 분산도 벡터이다. 기댓값과 분산을 구하는 공식은 다음과 같다.

  • 기댓값 $$\text{E}[x_k] = \mu_k$$

  • 분산 $$\text{Var}[x_k] = \mu_k(1-\mu_k)$$

SciPy를 이용한 카테고리 분포의 시뮬레이션

SciPy는 카테고리 분포를 위한 별도의 클래스를 제공하지 않는다. 하지만 뒤에서 설명할 다항 분포를 위한 multinomial 클래스에서 시행 횟수를 1로 설정하면 카테고리 분포가 되므로 이 명령을 사용할 수 있다.

In [1]:
mu = np.array([1/6]*6)
rv = sp.stats.multinomial(1, mu)

카테고리 분포에서 나올 수 있는 값은 다음처럼 벡터값들이다.

In [2]:
xx = np.arange(1, 7)
xx_ohe = pd.get_dummies(xx)
xx_ohe
Out:
1 2 3 4 5 6
0 1 0 0 0 0 0
1 0 1 0 0 0 0
2 0 0 1 0 0 0
3 0 0 0 1 0 0
4 0 0 0 0 1 0
5 0 0 0 0 0 1

pmf 메서드의 인수로도 벡터를 넣어야 한다.

In [3]:
plt.bar(xx, rv.pmf(xx_ohe.values))
plt.ylabel("P(x)")
plt.xlabel("표본값")
plt.title("카테고리 분포의 pmf")
plt.show()

시뮬레이션으로 생성한 값도 벡터이다.

In [4]:
np.random.seed(1)
X = rv.rvs(100)
X[:5]
Out:
array([[0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1],
       [0, 1, 0, 0, 0, 0]])

시뮬레이션 결과는 다음과 같다.

In [5]:
y = X.sum(axis=0) / float(len(X))
plt.bar(np.arange(1, 7), y)
plt.title("카테고리 분포의 시뮬레이션 결과")
plt.xlabel("표본값")
plt.ylabel("비율")
plt.show()

이론적인 확률분포와 시뮬레이션 결과를 비교하면 다음과 같다.

In [6]:
df = pd.DataFrame({"이론": rv.pmf(xx_ohe.values), "시뮬레이션": y},
                  index=np.arange(1, 7)).stack()
df = df.reset_index()
df.columns = ["표본값", "유형", "비율"]
df.pivot("표본값", "유형", "비율")
df
Out:
표본값 유형 비율
0 1 이론 0.166667
1 1 시뮬레이션 0.180000
2 2 이론 0.166667
3 2 시뮬레이션 0.210000
4 3 이론 0.166667
5 3 시뮬레이션 0.180000
6 4 이론 0.166667
7 4 시뮬레이션 0.180000
8 5 이론 0.166667
9 5 시뮬레이션 0.150000
10 6 이론 0.166667
11 6 시뮬레이션 0.100000
In [7]:
sns.barplot(x="표본값", y="비율", hue="유형", data=df)
plt.title("카테고리 분포의 이론적 분포와 시뮬레이션 분포")
plt.show()

연습 문제 8.2.6

카테고리 확률분포의 모수가 다음과 같을 경우에 각각 표본을 생성한 후 기댓값과 분산을 구하고 앞의 예제와 같이 확률밀도함수와 비교한 바 플롯을 그린다.

표본의 갯수가 10개인 경우와 1000개인 경우에 대해 각각 위의 계산을 한다.

  1. $\mu = (0.25, 0.25, 0.25, 0.25)$
  2. $\mu = (0.3, 0.3, 0.2, 0.2)$

질문/덧글

오타인가요...? ngmt*** 2016년 5월 25일 11:09 오후

카테고리 분포 설명의 도입부에 있는 내용입니다.

"카테고리 분포의 모수 θ는 베르누이 분포와 달리 다음과 같은 제약 조건을 가지는 벡터값이 된다." 라는 설명 아래에 있는 시그마 식에서 θ의 아랫첨자가 k로 되어 있습니다. i로 바뀌어야 하는 것인가요? 아니면 시그마 기호의 아랫부분에 있는 i가 k로 바뀌어야 하는 것인가요?

답변: 오타인가요...? 관리자 2016년 5월 25일 11:55 오후

i는 k의 오타였습니다. 수정하였습니다. 지적해 주셔서 감사합니다.

카테고리 분포의 기댓값 moon*** 2016년 10월 15일 2:41 오후

카테고리 분포의 기댓값이

E[x_k]=θ_k 로 정의된다는 것은 카테고리 분포를 따르는 확률변수 X=[x_1, x_2,,,,,x_K]의 x값에 따라 기댓값이 다르다는 뜻인가요?

E[X] 자체를 구할 수는 없나요?

답변: 카테고리 분포의 기댓값 moon*** 2016년 10월 15일 3:33 오후

아 혹시 확률변수 X가 x_1, x_2,...로 이루어진 벡터라서 따로 구하는 건가요?!

답변: 답변: 카테고리 분포의 기댓값 관리자 2016년 10월 16일 10:42 오전

네. 벡터입니다.

연습문제 8.2.6에 대해 질문있습니다. isb6*** 2018년 10월 19일 11:34 오후

연습문제 8.2.6는 `카테고리 분포`에 관한 문제니까 N은 모수에 포함되지 않는다고 생각해서 N을 모수로 넣지 않고 연습문제를 풀었는데 제가 옳게 접근한 것이 맞는지 궁금합니다.

답변: 연습문제 8.2.6에 대해 질문있습니다. 관리자 2018년 10월 20일 2:21 오후

수정하였습니다. 지적 감사드립니다.