In [42]:
# 例5.1 コーシー分布の対数尤度最大化問題を数値計算で解く
import numpy as np
from scipy.stats import cauchy
from scipy.optimize import minimize_scalar
# f(x;0,1)にしたがうコーシー乱数を生成
# このデータのみからパラメータを最尤推定する
# 正解はtheta=0とすでにわかっているが・・・
N = 500
X = cauchy.rvs(loc=0, scale=1, size=N)
def L(theta):
"""コーシー分布の対数尤度関数
Pythonでは最小化する関数しかない
そのためターゲット関数を-()で囲むことで最大化問題を最小化問題に変換
theta : 推定したいコーシー分布のパラメータ"""
theta = np.array([theta] * len(X))
return - (-np.sum(np.log(1 + (X - theta) ** 2)))
# グラフを描画
xlist = np.linspace(-10, 10, 10000)
ylist = np.array([L(x) for x in xlist])
plot(xlist, ylist)
plt.show()
res = minimize_scalar(L, bounds=(-10, 10), method="Brent")
print res.x
print res.fun