import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import ttest_ind
from scipy.optimize import minimize
# MLE에서 사용하기 위한 gaussian rv X의 pdf
def f_x(mu_sig):
mu, sig = mu_sig[0], mu_sig[1]
r = 1/(np.sqrt(2*np.pi*(sig**2))) * np.exp(-(x-mu)**2/(2*sig**2))
r = np.log(r)
#np.log로 변환해주지 않으면, 값이 정확하게 예측되기 어려운데, 왜 그런지는....흠
return -r.sum() # scipy.optimize에는 maximize밖에 없기 때문에, -를 곱해서 진행해주어야 함
# 랜덤의 평균/분산을 가지는 데이터를 생성합니다.
x = np.random.normal(np.random.uniform(0, 10), np.random.uniform(0, 10), 500)
print("------------------")
print('method of moment')
print("mean: {:.3f}, std: {:.3f}".format(x.mean(), x.std()))
# 평균 추정하기
ms = np.linspace(x.mean()-x.std()/2, x.mean()+x.std()/2, 100)
ps = [] # p_values
m_by_MLE = 0 # 추정된 mean 값
max_p_value = 0 # 가장 큰 p_value값
for m in ms:
# 평균을 바꾸어가면서, 두 분포의 평균이 같은지 p-value를 계산함
p_value = ttest_ind(x, np.random.normal(m, 1, len(x))).pvalue
ps.append(p_value)
if p_value > max_p_value:# 더 큰 p_value가 나오면, 그 값을 가장 likelihood가 높은 경우로 고려함.
m_by_MLE = m
max_p_value=p_value
print("------------------")
print('by p-value')
print("mean: {:.3f}".format(m_by_MLE))
print("------------------")
### MLE with numeric optimzation
result = minimize(f_x, np.array([10, 10]))
mu_sigma = result['x']
print("by MLE, optimization")
print("mu: {:.2f}, sigma: {:.2f}".format(mu_sigma[0], mu_sigma[1]))
print("------------------")
------------------
method of moment
mean: 10.155, std: 4.733
------------------
by p-value
mean: 10.179
------------------
by MLE, optimization
mu: 10.15, sigma: 4.73
------------------
댓글남기기