확률분포
밀도추정 (Density Estimation)
N 개의 관찰데이터(observations) x1,...,xN 가 주어졌을 때 분포함수 p(x)를 찾는 것
- p(x) 를 파라미터화된 분포로 가정한다. 회귀, 분류문제에서는 주로 p(t|x), p(C|x)를 추정한다.
- 그다음 분포의 파라미터를 찾는다.
- 빈도주의(Frequentism) 방법 : 어떤 기준(예: likelihood)을 최적화시키는 과정을 통해
파라미터 값을 정한다. 그렇게 파라미터의 하나의 값을 구하게 된다.
- 베이시안(Bayesian) 방법 : 먼저 파라미터의 사전확률을 가정하고
Bayes' rule을 통해 파라미터의 사후확률을 구한다.
- 파라미터를 찾았다면(한 개의 값이든 분포든) 그것을 사용해 예측할 수 있다. (t 혹은 C).
켤레사전분포(Conjugate Prior) : 사후확률이 사전확률과 동일한 함수형태를 가지도록 해준다.
이항변수 - 빈도주의 방법
이항확률변수(binary random variable) x∈{0,1} (예: 동전던지기) 가 다음을 만족한다고 하자.
p(x=1∣μ)=μ,p(x=0∣μ)=1−μ
p(x) 는 베르누이 분포(Bernoulli distribution)로 표현될 수 있다.
Bern(x∣μ)=μx(1−μ)1−x
-
기댓값 E[x]=μ
E[x]=1⋅μ+0⋅(1−μ)=μ
-
분산 var[x]=μ(1−μ)
var[x]=E[x2]−E[x]2={1⋅μ+0⋅(1−μ)}−μ2=μ−μ2=μ(1−μ)
-
우도함수 (Likelihood Function)
💡 여기서 우도함수는 파라미터 μ 의 함수
-
x 값을 N 번 관찰한 결과를 D={x1,…,xN}라고 하자.
각 x 가 독립적으로 p(x∣μ)에서 뽑혀진다고 가정하면 다음과 같이 우도함수(μ의 함수)를 만들 수 있다.
p(D∣μ)=n=1∏Np(xn∣μ)=n=1∏Nμxn(1−μ)1−xn
-
빈도주의 방법에서는 μ 값을 이 우도함수를 최대화시키는 값으로 구할 수 있다.
또는 아래와 같이 로그우도함수를 최대화시키는 값으로 구한다.
lnp(D∣μ)=lnn=1∑Np(xn∣μ)=n=1∑N{xnlnμ+(1−xn)ln(1−μ)}
📌 곱의 형태보다는 합의 형태가 더 안정적이다. 따라서 로그를 씌운다.
-
μ의 최대우도 추정치(maximum likelihood estimate)는
μML=Nmwithm=(#observationsofx=1)
-
N이 작은 경우에 위 MLE는 과적합된 결과를 낳을 수 있다.
(예: 동전을 3번 던져서 모두 앞면이 나온 경우)
N=m=3→μML=1!
이항변수 - 베이시안 방법
이항분포 (Binomial Distribution)
D={x1,…,xN} 일 때, 이상변수 x가 1인 경우를 m번 관찰할 확률
Bin(m∣N,μ)=(Nm)μm(1−μ)N−m
(Nm)=(N−m)!m!N!
*조합(Combination)
- 기댓값 E[m]=∑m=0NmBin(m∣N,μ)=Nμ
- 분산 var[m]=∑m=0N(m−E[m])2Bin(m∣N,μ)=Nμ(1−μ)
![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,…,xN 각각이 확률변수
- x가 1인 경우를 몇 번 관찰했는가: 하나의 확률변수 m
👉 베이시안 방법을 쓰기 위해서는 데이터의 우도를 구해야 하는데
이항분포를 가정하면 우도함수가 하나의 변수 m (x1,…,xN 대신) 로 표현가능하므로 간편해진다.
베타분포(Beta Distribution)
베이시안 방법으로 분제를 해결하기 위해 베타분포를 켤레사전분포(conjugate prior) 로 사용한다.
Beta(μ∣a,b)=Γ(a)Γ(b)Γ(a+b)μa−1(1−μ)b−1
감마함수 Γ(x) 는 다음과 같이 정의된다.
Γ(x)=∫0∞ux−1e−udu
감마함수는 계승(factorial; 팩토리얼)을 실수로 확장시킨다. Γ(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)
- a, b 가 동일하지만 값이 1보다 작은 경우
- a, b 가 동일하고 값이 1인 경우
- a가 b보다 작은경우
- a가 b보다 큰 경우
👉 a와 b가 커질수록 부드러운 곡선이 된다!
📌
-
Γ(x)=(x−1)Γ(x−1)
-
베타분포는 normalized 함
- ∫01μa−1(1−μ)b−1dμ=Γ(a+b)Γ(a)Γ(b)
-
기댓값 E[μ]=a+ba
-
분산 var[μ]=(a+b)2(a+b+1)ab
-
μ의 사후확률(posterior)
p(μ∣m,l,a,b)=Γ(m+a)Γ(l+b)Γ(m+a+l+b)μm+a−1(1−μ)l+b−1
👉 여기서 m은 특정 경우의 관찰 횟수, l=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)
-
첫 번째 그림: 사전확률은 a=2, b=2인 베타분포
-
두 번째 그림: x=1인 하나의 샘플에 대한 우도함수
-
세 번째 그림: 사후확률은 a=3, b=2인 베타분포
(다음 관찰에 대해선 이 사후확률이 사전확률로 쓰이게 된다.)
예측분포(Predictive Distribution)
p(x=1∣D)=∫01p(x=1∣μ)p(μ∣D)dμ=∫01μp(μ∣D)dμ=E[μ∣D]
p(x=1∣D)=m+a+l+bm+a
(예시 1)
사전지식 → a=5,b=5
새로 관찰한 값 → m=10,l=2
p(x=1∣D)=10+5+2+510+5=2215
(예시 2)
N=m=3
a=2,b=1
m=3,l=0 (⇒ μ=1 이어야 하지만 그렇게 되지 않음)
p(x=1∣D)=65
다항변수 - 빈도주의 방법
K개의 상태를 가질 수 있는 확률변수를
K차원의 벡터 x (하나의 원소만 1이고 나머지는 0)로 나타낼 수 있다.
이런 x를 위해서 베르누이 분포를 다음과 같이 일반화시킬 수 있다.
p(x∣μ)=k=1∏Kμkxkwith∑kμk=1
E[x∣μ]=x∑p(x∣μ)=(μ1,…,μM)T=μ
x 값을 N 번 관찰한 결과 D={x,…,xN} 가 주어졌을 때, 우도함수는 다음과 같다.
p(D∣μ)=n=1∏Nk=1∏Kμkxnk
![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=n∑xnk
- μ 의 최대우도 추정치(maximum likelihood estimate)
μ 의 최대우도 추정치를 구하기 위해선 μk의 합이 1이 된다는 조건하에서
lnp(D∣μ) 를 최대화시키는 μk를 구해야한다.
👉 라그랑주 승수(Lagrange multiplier) λ 를 사용해서 다음을 최대화시키면 된다.
k=1∑Kmklnμk+λ(∑k=1Kμk−1))
μkML=Nmk
다항변수 - 베이시안 방법
다항분포(Multinomial distribution)
파라미터 μ와 전체 관찰개수 N이 주어졌을 때 m1,…,mK의 분포를 다항분포라고 하고 다음과 같은 형태를 가진다.
Mult(m1,m2,…,mK∣μ,N)=(Nm1m2…mK)k=1∏Kμkmk
- E[mk]=Nμk
- var[mk]=Nμk(1−μk)
- cov[mjmk]=−Nμjμk
디리클레 분포(Dirichlet distribution)
다항분포를 위한 켤레사전분포
Dir(μ∣α)=Γ(α1)⋯Γ(αk)Γ(α0)k=1∏Kμkαk−1
α0=k=1∑Kαk
-
디리클레 분포는 normalization
-
μ 의 사후확률(posterior)
p(μ∣D,α)=Dir(μ∣α+m)=Γ(α1+m1)…Γ(αK+mK)Γ(α0+N)k=1∏Kμkak+mk−1
m=(m1,…,mk)T
💡 αk를 xk=1에 대한 사전관찰 개수라고 생각할 수 있다.
[실습]
사전 준비
%matplotlib inline
import matplotlib.pyplot as plt
from IPython.display import Math, Latex
from IPython.core.display import Image
import seaborn as sns
sns.set(color_codes=True)
sns.set(rc={'figure.figsize':(5,5)})
import numpy as np
from scipy.stats import uniform
n = 10000
start = 10
width = 20
data_uniform = uniform.rvs(size=n, loc = start, scale=width)
data_uniform
len(ddata_uniform)
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]
np.unique(data_bern, return_counts=True)
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')
-
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)
-
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)
👉 전체적으로 균등함
-
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보다 작기때문에 왼쪽으로 쏠림
-
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]
👉 각각의 행이 벡터로 형성이 되고 하나의 값만 1이 됨
(확률이 큰 위치일 수록 1이 나타나는 빈도 수가 높아지게 됨)
각 행의 0과 1을 카운트 하면 다음과 같다.
for i in range(4):
print(np.unique(data_multinomial[:,i], return_counts=True))