Negative Log-Likelihood

Negative Log-Likelihoodとは?

Negative Log-Likelihood(負の対数尤度)は、統計学や機械学習でモデルの適合度を評価するためによく使用される指標です。特に、確率モデルがデータをどれだけうまく説明しているかを測るために利用されます。

Pythonで、Negative Log-Likelihoodを計算してみます。
正規分布からサンプリングしたデータをもとにパラメーター(平均と標準偏差)を推定してみます。

正規分布からデータのサンプリング

import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize

np.random.seed(0)
true_mu = 0
true_sigma = 1
data = np.random.normal(true_mu, true_sigma, 100)

平均 true_mu(0)、標準偏差 true_sigma(1)の正規分布から100個のサンプルデータを生成しています。

負の対数尤度関数の定義

def negative_log_likelihood(params, data):
    mu, sigma = params
    if sigma <= 0:
        return np.inf
    log_likelihood = norm.logpdf(data, mu, sigma)
    nll = -np.sum(log_likelihood)
    return nll

負の対数尤度が計算され、出力されます。これを最小化するパラメータを見つけることが、パラメータ推定の目的になります。

パラメータの最適化

initial_params = [1, 1]
result = minimize(negative_log_likelihood, initial_params, args=(data,))

optimized_mu, optimized_sigma = result.x
print(f"最適化されたmu: {optimized_mu:.2f}")
print(f"最適化されたsigma: {optimized_sigma:.2f}")

生成したデータに基づいて正規分布の最適な平均(mu)と標準偏差(sigma)を推定します。minimize 関数は負の対数尤度を最小化することによって、データに最もよく適合するパラメータを見つけ出します。
結果は下記の通りになりました。

最適化されたmu: 0.06
最適化されたsigma: 1.01

初期値から最適化されたパラメータが真の値 true_mu = 0true_sigma = 1 に近い値であることが確認できます。