우선 최대 가능도 추정에 대한 계산과 내용은 이전에 작성한 통계론을 확인하면된다.
최대가능도추정의 실습
$x_0 = 1$라는 샘플을 하나 가지고 있고 $x_0 = 1$일 때, 어떤 평균(모수)에 대해서 가장 큰 가능도를 갖는지 실습하는 문제이다. 그리고 $\mu = -1, 0, 1$ 이렇게 세 가지의 경우 정규분포에 대해 그래프를 그려보는 것이다.
Import
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.stats import norm #연속확률밀도함수를 계산하는 함수이다.
plot
plt.figure(figsize=(10,6))
x = np.linspace(-5, 5, 100) # x축 정의
p1 = sp.stats.norm(loc=-1).pdf(1) # 모수가 -1일 때 1에서의 가능도
p2 = sp.stats.norm(loc=0).pdf(1) # 모수가 0일 때 1에서의 가능도
p3 = sp.stats.norm(loc=1).pdf(1) # 모수가 1일 때 1에서의 가능도
# 산점도
plt.scatter(1, p1, s=100, c='blue', marker='v',
label=r"$N(x_1;\mu=-1)$={:.2f}".format(np.round(p1, 2)))
plt.scatter(1, p2, s=100, c='orange', marker='^',
label=r"$N(x_1;\mu=0)$={:.2f}".format(np.round(p2, 2)))
plt.scatter(1, p3, s=100, c='green', marker='s',
label=r"$N(x_1;\mu=1)$={:.2f}".format(np.round(p3, 2)))
plt.plot(x, norm(loc=-1).pdf(x), ls="-.") # 모수가 -1일 때 x값에 따른 정규분포 그래프
plt.plot(x, norm(loc=0).pdf(x), ls="--") # 모수가 0일 때 x값에 따른 정규분포 그래프
plt.plot(x, norm(loc=1).pdf(x), ls="-") # 모수가 1일 때 x값에 따른 정규분포 그래프
plt.scatter(1, 0, s=100, c='k')
plt.vlines(1, -0.09, 0.45, linestyle=":")
plt.hlines(0, -5, 5, colors='gray', linestyle="-")
plt.text(1-0.3, -0.15, "$x_0=1$")
plt.xlabel("x")
plt.ylabel("likelihood")
plt.legend()
plt.title("MLE for population mean")
plt.show()
MLE 계산
x0=1
# 모수에 따라 x가 1일 때 가능도를 계산한다.
print('mu=-1: likelihood at x_0=1 is {:.4f}'.format(norm.pdf(x0, -1)))
print('mu=0: likelihood at x_0=1 is {:.4f}'.format(norm.pdf(x0, 0)))
print('mu=1: likelihood at x_0=1 is {:.4f}'.format(norm.pdf(x0, 1)))
[출력]
mu=-1: likelihood at x_0=1 is 0.0540
mu=0: likelihood at x_0=1 is 0.2420
mu=1: likelihood at x_0=1 is 0.3989
따라서 모수가 1일 때 최대 가능도 약 0.4가 나오는 것을 확인 할 수 있다.
정규분포의 가능도 함수
import numpy as np
import scipy as sp
from scipy.stats import norm
import scipy.stats as stats
import matplotlib.pyplot as plt
import math
plt.figure(figsize=(12,10))
# 기댓값 모수 mu일 때 0에서의 가능도를 계산
def likelihood_mu(mu):
return sp.stats.norm(loc=mu).pdf(0)
# 기댓값 모수 정의
mus = np.linspace(-5, 5, 1000)
likelihood_mu = [likelihood_mu(m) for m in mus]
plt.subplot(311)
# 기댓값 모수 = 0, 분산 모수 = 1
mu = 0
variance = 1
sigma = math.sqrt(variance) #표준편차
plt.plot(mus, stats.norm.pdf(mus, mu, sigma))
plt.title("Probability Density Function of Normal $P(x; \mu=0, \sigma^2=1)$")
plt.xlabel("$x$")
plt.show()
plt.figure(figsize=(12,10))
plt.subplot(312)
plt.plot(mus, likelihood_mu)
plt.title("Likelihood $L(\mu, \sigma^2=1; x=0)$")
plt.xlabel("$\mu$")
plt.show()
# 분산 모수 값에 따른 0에서의 가능도 계산
def likelihood_sigma2(sigma2):
return sp.stats.norm(scale=np.sqrt(sigma2)).pdf(0)
sigma2s = np.linspace(0.1, 10, 1000) # 분산 모수 정의
likelihood_sigma2 = [likelihood_sigma2(s) for s in sigma2s]
plt.figure(figsize=(12,10))
plt.subplot(313)
plt.plot(sigma2s, likelihood_sigma2)
plt.title("Likelihood $L(\mu=0, \sigma; x=0)$")
plt.xlabel("$\sigma^2$")
plt.show()
3차원 공간에서의 시각화
MU, SIGMA2 = np.meshgrid(mus, sigma2s)
L = np.exp(-MU ** 2 / (2 * SIGMA2)) / np.sqrt(2 * np.pi * SIGMA2)
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.plot_surface(MU, SIGMA2, L, linewidth=0.1)
plt.xlabel('$\mu$')
plt.ylabel('$\sigma^2$')
plt.title('likelihood $L(\mu, \sigma^2)$ in 3D')
plt.show()
베르누이분포의 최대가능도
모수가 $\mu$인 베르누이 분포의 확률질량함수는 다음과 같다.
$$p(x; \mu) = Bern(x; \mu) = \mu^x(1 - \mu)^{1-x}$$
표본 데이터가 모두 독립일 때 전체 확률질량함수는 각각의 확률질량함수의 곱과 같으므로 다음과 같은 식이 만들어진다.
$$\prod_{i=1}^n \mu^x_i(1 - \mu)^{1-x_i}$$
이 때의 모수 $\mu$를 추정해보는 문제이다.
일단 log를 씌워서 정리하면 다음과 같은 식이 될 것이다.
$$\sum_{i=1}^n x_i \log \mu + (1 - x_i) \log{(1 - \mu)}$$
그리고 여기서 성공 횟수와 실패 획수를 각각 $N_0$, $N_1$이라고 표기하고 대입하면 $\sum_{i=1}^n N_1 \log \mu + N_0 \log{(1 - \mu)}$가 될 것이다.
이제 정리된 식을 미분하면 $\frac{N_1}{\mu} - \frac{N_0}{1-\mu} = 0$이 될 것이고 최종적으로 정리하면 $\mu = \frac{N_1}{N}$이 된다.($N_1 + N_0 = N$이기 때문)
'Boostcamp AI Tech' 카테고리의 다른 글
[Boostcamp Day-6] DL Basic - Multi-Layer Perceptron (0) | 2021.08.09 |
---|---|
[Boostcamp Day-6] DL Basic - Historical Review (0) | 2021.08.09 |
[Boostcamp 선택 과제 - 2] RNN Backpropagation 구현 (0) | 2021.08.08 |
[Boostcamp 선택 과제 - 1] Gradient Descent 구현 (0) | 2021.08.08 |
[Boostcamp Day-5] Python - Pandas (0) | 2021.08.06 |