(5-5) 머신러닝 기초 - 확률분포

Yongjoo Lee·2021년 1월 8일
0
post-thumbnail
post-custom-banner

확률분포

밀도추정 (Density Estimation)

NN 개의 관찰데이터(observations) x1,...,xNx_1, ..., x_N 가 주어졌을 때 분포함수 p(x)p(x)를 찾는 것

  1. p(x)p(x) 를 파라미터화된 분포로 가정한다. 회귀, 분류문제에서는 주로 p(t|x), p(C|x)를 추정한다.
  2. 그다음 분포의 파라미터를 찾는다.
    • 빈도주의(Frequentism) 방법 : 어떤 기준(예: likelihood)을 최적화시키는 과정을 통해
      파라미터 값을 정한다. 그렇게 파라미터의 하나의 값을 구하게 된다.
    • 베이시안(Bayesian) 방법 : 먼저 파라미터의 사전확률을 가정하고
      Bayes' rule을 통해 파라미터의 사후확률을 구한다.
  3. 파라미터를 찾았다면(한 개의 값이든 분포든) 그것을 사용해 예측할 수 있다. (t 혹은 C).

켤레사전분포(Conjugate Prior) : 사후확률이 사전확률과 동일한 함수형태를 가지도록 해준다.

이항변수 - 빈도주의 방법

이항확률변수(binary random variable) x{0,1}x \in \{0,1\} (예: 동전던지기) 가 다음을 만족한다고 하자.

p(x=1μ)=μ,    p(x=0μ)=1μp(x=1|\mu)=\mu, \;\;p(x=0|\mu)=1-\mu

p(x)p(x) 는 베르누이 분포(Bernoulli distribution)로 표현될 수 있다.

Bern(xμ)=μx(1μ)1xBern(x|\mu)=\mu^x(1-\mu)^{1-x}
  • 기댓값 E[x]=μ\mathbb E[x] = \mu

    E[x]=1μ  +  0(1μ)=μ\mathbb E[x]=1 \cdot\mu\;+\;0 \cdot(1-\mu) = \mu

  • 분산 var[x]=μ(1μ)var[x] = \mu(1-\mu)

    var[x]=E[x2]E[x]2={1μ  +  0(1μ)}μ2=μμ2=μ(1μ)\begin{aligned}var[x] &= \mathbb E[x^2]-\mathbb E[x]^2\\&= \{1\cdot\mu\;+\;0\cdot (1-\mu)\} - \mathbb \mu^2\\&=\mu-\mu^2\\&=\mu(1-\mu)\end{aligned}
  • 우도함수 (Likelihood Function)

    💡 여기서 우도함수는 파라미터 μ\mu 의 함수

  • xx 값을 NN 번 관찰한 결과를 D={x1,,xN}D=\{x_1,\dots, x_N\}라고 하자.
    xx 가 독립적으로 p(xμ)p(x|\mu)에서 뽑혀진다고 가정하면 다음과 같이 우도함수(μ\mu의 함수)를 만들 수 있다.

p(Dμ)=n=1Np(xnμ)=n=1Nμxn(1μ)1xnp(D|\mu)=\prod_{n=1}^Np(x_n|\mu)=\prod_{n=1}^N\mu^{x_n}(1-\mu)^{1-x_n}
  • 빈도주의 방법에서는 μ\mu 값을 이 우도함수를 최대화시키는 값으로 구할 수 있다.
    또는 아래와 같이 로그우도함수를 최대화시키는 값으로 구한다.

    lnp(Dμ)=lnn=1Np(xnμ)=n=1N{xnlnμ+(1xn)ln(1μ)}\ln p(D|\mu)=\ln\sum_{n=1}^Np(x_n|\mu)=\sum_{n=1}^N\{x_n\ln\mu+(1-x_n)\ln(1-\mu)\}

    📌 곱의 형태보다는 합의 형태가 더 안정적이다. 따라서 로그를 씌운다.

  • μ\mu의 최대우도 추정치(maximum likelihood estimate)는

    μML=mN  with  m=(#observations  of  x=1)\mu^{ML}=\frac{m}{N}\;\text{with}\; m=(\#observations\;of\;x = 1)
  • NN이 작은 경우에 위 MLE는 과적합된 결과를 낳을 수 있다.

    (예: 동전을 3번 던져서 모두 앞면이 나온 경우)

    N=m=3μML=1!N=m=3 \rightarrow \mu^{ML}=1!

이항변수 - 베이시안 방법

이항분포 (Binomial Distribution)

D={x1,,xN}D=\{x_1,\dots, x_N\} 일 때, 이상변수 xx가 1인 경우를 mm번 관찰할 확률

Bin(mN,μ)=(Nm)μm(1μ)NmBin(m|N,\mu)=\begin{pmatrix}N\\m\end{pmatrix}\mu^m(1-\mu)^{N-m}
(Nm)=N!(Nm)!m!\begin{pmatrix}N\\m\end{pmatrix}=\frac{N!}{(N-m)!m!}

*조합(Combination)

  • 기댓값 E[m]=m=0NmBin(mN,μ)=Nμ\mathbb E[m] = \textstyle\sum^N_{m=0}mBin(m|N,\mu)=N\mu
  • 분산 var[m]=m=0N(mE[m])2Bin(mN,μ)=Nμ(1μ)var[m] = \textstyle\sum^N_{m=0}(m-\mathbb E[m])^2Bin(m|N,\mu)=N\mu(1-\mu)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fc45bee8e-fa0b-4c8e-8152-34258b29e584%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fc45bee8e-fa0b-4c8e-8152-34258b29e584%2Fimage.png)

데이터를 보는 관점

  • 베르누이 시행의 반복: x1,,xNx_1, \dots,x_N 각각이 확률변수
  • xx가 1인 경우를 몇 번 관찰했는가: 하나의 확률변수 mm

👉 베이시안 방법을 쓰기 위해서는 데이터의 우도를 구해야 하는데
이항분포를 가정하면 우도함수가 하나의 변수 m (x1,,xNx_1,\dots,x_N 대신) 로 표현가능하므로 간편해진다.

베타분포(Beta Distribution)

베이시안 방법으로 분제를 해결하기 위해 베타분포를 켤레사전분포(conjugate prior) 로 사용한다.

Beta(μa,b)=Γ(a+b)Γ(a)Γ(b)μa1(1μ)b1Beta(\mu|a,b)=\frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}\mu^{a-1}(1-\mu)^{b-1}

감마함수 Γ(x)\Gamma(x) 는 다음과 같이 정의된다.

Γ(x)=0ux1eudu\Gamma(x)=\int_0^\infin u^{x-1}e^{-u}du

감마함수는 계승(factorial; 팩토리얼)을 실수로 확장시킨다. Γ(n)=(n1)!\Gamma(n)=(n-1)!

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F70a7f729-117f-4f6e-a666-53c27e40aa2b%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F70a7f729-117f-4f6e-a666-53c27e40aa2b%2Fimage.png)

  1. a, b 가 동일하지만 값이 1보다 작은 경우
  2. a, b 가 동일하고 값이 1인 경우
  3. a가 b보다 작은경우
  4. a가 b보다 큰 경우

👉 a와 b가 커질수록 부드러운 곡선이 된다!

📌

  • Γ(x)=(x1)Γ(x1)\Gamma(x)=(x-1)\Gamma(x-1)

  • 베타분포는 normalized 함

    • 01μa1(1μ)b1dμ=Γ(a)Γ(b)Γ(a+b)\int_0^1 \mu^{a-1}(1-\mu)^{b-1}d\mu=\frac{\Gamma(a)\Gamma(b)}{\Gamma(a+b)}
  • 기댓값 E[μ]=aa+b\mathbb E[\mu] = \frac{a}{a+b}

  • 분산 var[μ]=ab(a+b)2(a+b+1)var[\mu] = \frac{ab}{(a+b)^2(a+b+1)}

  • μ\mu의 사후확률(posterior)

    p(μm,l,a,b)=Γ(m+a+l+b)Γ(m+a)Γ(l+b)μm+a1(1μ)l+b1p(\mu|m,l,a,b)=\frac{\Gamma(m+a+l+b)}{\Gamma(m+a)\Gamma(l+b)}\mu^{m+a-1}(1-\mu)^{l+b-1}

    👉 여기서 mm은 특정 경우의 관찰 횟수, l=Nml=N-m이라고 생각하면 된다.

  • 연속적인 업데이트: 하나의 샘플을 관찰했을 때 사전확률과 사후확률의 관계

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fb7f684c6-702a-4660-a8d8-508e5f6e90d5%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fb7f684c6-702a-4660-a8d8-508e5f6e90d5%2Fimage.png)

    1. 첫 번째 그림: 사전확률은 a=2, b=2인 베타분포

    2. 두 번째 그림: x=1인 하나의 샘플에 대한 우도함수

    3. 세 번째 그림: 사후확률은 a=3, b=2인 베타분포

      (다음 관찰에 대해선 이 사후확률이 사전확률로 쓰이게 된다.)

예측분포(Predictive Distribution)

p(x=1D)=01p(x=1μ)p(μD)dμ=01μp(μD)dμ=E[μD]p(x=1|D)=\int_0^1p(x=1|\mu)p(\mu|D)d\mu=\int_0^1\mu p(\mu|D)d\mu=\mathbb E[\mu|D]
p(x=1D)=m+am+a+l+bp(x=1|D)=\frac{m+a}{m+a+l+b}

(예시 1)

사전지식 → a=5,b=5a=5, b=5

새로 관찰한 값 → m=10,l=2m=10, l=2

p(x=1D)=10+510+5+2+5=1522p(x=1|D)=\frac{10+5}{10+5+2+5}=\frac{15}{22}

(예시 2)

N=m=3N=m=3

a=2,b=1a=2, b=1

m=3,l=0m=3, l=0 (⇒ μ=1\mu=1 이어야 하지만 그렇게 되지 않음)

p(x=1D)=56p(x=1|D)=\frac{5}{6}

다항변수 - 빈도주의 방법

KK개의 상태를 가질 수 있는 확률변수를
KK차원의 벡터 x\bold x (하나의 원소만 1이고 나머지는 0)로 나타낼 수 있다.

이런 x\bold x를 위해서 베르누이 분포를 다음과 같이 일반화시킬 수 있다.

p(xμ)=k=1Kμkxkwithkμk=1p(\bold x| \bold \mu)=\prod_{k=1}^K\mu_k^{x_k}\hspace{2em}\text{with} \textstyle\sum_k\mu_k=1
  • 기댓값
E[xμ]=xp(xμ)=(μ1,,μM)T=μ\mathbb E[\bold x|\bold\mu]=\sum_\bold xp(\bold x|\bold\mu)=(\mu_1,\dots,\mu_M)^T=\bold\mu
  • 우도함수

x\bold x 값을 NN 번 관찰한 결과 D={x,,xN}D=\{\bold x,\dots, \bold x_N\} 가 주어졌을 때, 우도함수는 다음과 같다.

p(Dμ)=n=1Nk=1Kμkxnkp(D|\bold\mu)=\prod_{n=1}^N\prod_{k=1}^K\mu_k^{x_{nk}}

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F0d7945d2-001e-4f0f-a7ad-8ac9a6b39e94%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F0d7945d2-001e-4f0f-a7ad-8ac9a6b39e94%2Fimage.png)

mk=nxnkm_k=\sum_nx_{nk}
  • μ\mu 의 최대우도 추정치(maximum likelihood estimate)

μ\mu 의 최대우도 추정치를 구하기 위해선 μk\mu_k의 합이 1이 된다는 조건하에서
lnp(Dμ)\blue\ln p(D|\mu) 를 최대화시키는 μk\mu_k를 구해야한다.

👉 라그랑주 승수(Lagrange multiplier) λ\lambda 를 사용해서 다음을 최대화시키면 된다.

k=1Kmklnμk+λ(k=1Kμk1))\sum_{k=1}^Km_k\ln\mu_k+\lambda\begin{pmatrix}\sum_{k=1}^{K}\mu_k-1)\end{pmatrix}
μkML=mkN\mu_k^{ML}=\frac{m_k}{N}

다항변수 - 베이시안 방법

다항분포(Multinomial distribution)

파라미터 μ\mu와 전체 관찰개수 NN이 주어졌을 때 m1,,mKm_1,\dots,m_K의 분포를 다항분포라고 하고 다음과 같은 형태를 가진다.

Mult(m1,m2,,mKμ,N)=(Nm1m2mK)k=1Kμkmk\text{Mult}(m_1,m_2,\dots,m_K|\mu,N)=\begin{pmatrix}N\\m_1m_2\dots m_K\end{pmatrix}\prod_{k=1}^K\mu_k^{m_k}
  • E[mk]=Nμk\mathbb E[m_k]=N\mu_k
  • var[mk]=Nμk(1μk)\text{var}[m_k]=N\mu_k(1-\mu_k)
  • cov[mjmk]=Nμjμk\text{cov}[m_jm_k]=-N\mu_j\mu_k

디리클레 분포(Dirichlet distribution)

다항분포를 위한 켤레사전분포

Dir(μα)=Γ(α0)Γ(α1)Γ(αk)k=1Kμkαk1Dir(\mu|\alpha)=\frac{\Gamma(\alpha_0)}{\Gamma(\alpha_1)\cdots\Gamma(\alpha_k)}\prod_{k=1}^K\mu_k^{\alpha_k-1}
α0=k=1Kαk\alpha_0=\sum_{k=1}^K\alpha_k
  • 디리클레 분포는 normalization

  • μ\mu 의 사후확률(posterior)

    p(μD,α)=Dir(μα+m)=Γ(α0+N)Γ(α1+m1)Γ(αK+mK)k=1Kμkak+mk1\begin{aligned}p(\mu|D,\alpha)&=Dir(\mu|\alpha+m)\\&=\frac{\Gamma(\alpha_0+N)}{\Gamma(\alpha_1+m_1)\dots\Gamma(\alpha_K+m_K)}\prod_{k=1}^K\mu_k^{a_k+m_k-1}\end{aligned}

    m=(m1,,mk)T\bold m = (m_1,\dots,m_k)^T

    💡 αk\alpha_kxk=1x_k=1에 대한 사전관찰 개수라고 생각할 수 있다.

[실습]

사전 준비

# for inline plots in jupyter
%matplotlib inline
# import matplotlib
import matplotlib.pyplot as plt
# for latex equations
from IPython.display import Math, Latex
# for displaying images
from IPython.core.display import Image

# import seaborn
import seaborn as sns
# settings for seaborn plotting style
sns.set(color_codes=True)
# settings for seaborn plot sizes
sns.set(rc={'figure.figsize':(5,5)})
import numpy as np

Uniform Distribution(균일분포)

# import uniform distribution
from scipy.stats import uniform

# random numbers from uniform distribution
n = 10000
start = 10
width = 20

data_uniform = uniform.rvs(size=n, loc = start, scale=width)
data_uniform
# array([23.03757769, 10.92811799, 12.18405929, ..., 11.29857873,
#        13.21194716, 28.41167915])

len(ddata_uniform)
# 10000
ax = sns.distplot(data_uniform,
                  bins=100,
                  kde=True,
                  color='skyblue',
                  hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Uniform Distribution ', ylabel='Frequency')

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F76e53b25-07c6-4d88-b0c1-1c43820a03bb%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F76e53b25-07c6-4d88-b0c1-1c43820a03bb%2Fimage.png)

Bernoulli Distribution(베르누이 분포)

from scipy.stats import bernoulli
data_bern = bernoulli.rvs(size=10000,p=0.8)

data_bern[:100]
# array([1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#        1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1,
#        0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,
#        1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0])

np.unique(data_bern, return_counts=True)
# (array([0, 1]), array([1965, 8035], dtype=int64))
ax= sns.distplot(data_bern,
                 kde=False,
                 color="skyblue",
                 hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Bernoulli Distribution', ylabel='Frequency')

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fd01d456e-7d95-476d-83b3-18a41e9d90df%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fd01d456e-7d95-476d-83b3-18a41e9d90df%2Fimage.png)

p값을 0.5로 설정하여 각각 반반인 정도로하면 0 과 1 이 비슷한 빈도로 나타난다.

data_bern = bernoulli.rvs(size=10000,p=0.5)

ax= sns.distplot(data_bern,
                 kde=False,
                 color="skyblue",
                 hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Bernoulli Distribution', ylabel='Frequency')

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fa54117e2-f4a8-47d8-aaf6-5c953848c040%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fa54117e2-f4a8-47d8-aaf6-5c953848c040%2Fimage.png)

Beta Distribution(베타 분포)

from scipy.stats import beta
a, b = 0.1, 0.1
data_beta = beta.rvs(a, b, size=10000)
ax= sns.distplot(data_beta,
                 kde=False,
                 color="skyblue",
                 hist_kws={"linewidth": 15,'alpha':1})
ax.set(xlabel='Beta Distribution', ylabel='Frequency')
  1. a, b = 0.1, 0.1 인 경우

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F18e94f11-c2d8-449f-8ba2-abb315554234%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F18e94f11-c2d8-449f-8ba2-abb315554234%2Fimage.png)

  2. a, b = 1, 1

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F641976af-25a4-4539-ace0-5a482f763cb5%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F641976af-25a4-4539-ace0-5a482f763cb5%2Fimage.png)

    👉 전체적으로 균등함

  3. a, b = 2, 4

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Ff97f678a-d240-4182-af7d-c8cdcb9d0e2e%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Ff97f678a-d240-4182-af7d-c8cdcb9d0e2e%2Fimage.png)

    👉 a가 b보다 작기때문에 왼쪽으로 쏠림

  4. a, b = 8, 4

    ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fff4a3e06-c5e2-4096-bda1-b9dc6678ad49%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fff4a3e06-c5e2-4096-bda1-b9dc6678ad49%2Fimage.png)

    👉 a가 b보다 크기때문에 오른쪽으로 쏠림

Multinomial Distribution(다항 분포)

from scipy.stats import multinomial
data_multinomial = multinomial.rvs(n=1, p=[0.2, 0.1, 0.3, 0.4], size=10000)

data_multinomial[:10]
# array([[0, 0, 0, 1],
#        [0, 1, 0, 0],
#        [0, 0, 1, 0],
#        [0, 0, 0, 1],
#        [0, 0, 0, 1],
#        [1, 0, 0, 0],
#        [0, 0, 0, 1],
#        [0, 0, 0, 1],
#        [0, 0, 1, 0],
#        [1, 0, 0, 0]])

👉 각각의 행이 벡터로 형성이 되고 하나의 값만 1이 됨
(확률이 큰 위치일 수록 1이 나타나는 빈도 수가 높아지게 됨)

각 행의 0과 1을 카운트 하면 다음과 같다.

for i in range(4):
  print(np.unique(data_multinomial[:,i], return_counts=True))
# (array([0, 1]), array([7982, 2018], dtype=int64))
# (array([0, 1]), array([9003,  997], dtype=int64))
# (array([0, 1]), array([7062, 2938], dtype=int64))
# (array([0, 1]), array([5953, 4047], dtype=int64))
profile
하나씩 정리하는 개발공부로그입니다.
post-custom-banner

0개의 댓글