4.1 最大尤度法(MLE)-「最も似ているものが最良」
最大尤度法は、観測データを基に、データが最も尤度(発生確率)が高いモデルパラメータを選択する手法です。尤度関数L(θ|X)は、パラメータθを持つときにデータXが観測される確率を表します。MLEの目的は、この尤度関数を最大化し、データを最も良く説明できるθを求める 것입니다。
4.2 最大後覚法(MAP)-「データと事前知識を融合」
MAP法は、MLEに加えてパラメータθの事前分布p(θ)を取り入れた手法です。尤度関数と事前分布の積を最大化します。
4.3 ベイズ法-「分布全体を捉える」
ベイズ法は、パラメータθの事後分布p(θ|X)を求める手法です。尤度関数と事前分布を用いて、ベイズの定理に基いて事後分布を計算します。
4.4 例題1:一元正規分布
観測データを一元正規分布N(μ, σ²)にフィットさせ、MLE、MAP、ベイズ法でμとσ²を推定します。
以下はPythonでの実装例です。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# データ生成
np.random.seed(42)
true_mu = 2
true_sigma = 1
n_samples = 100
data = np.random.normal(true_mu, true_sigma, n_samples)
# MLE推定
def mle_estimate(data):
mu_mle = np.mean(data)
sigma_mle = np.sqrt(np.var(data))
return mu_mle, sigma_mle
# MAP推定
def map_estimate(data, prior_mu=0, prior_sigma=2):
n = len(data)
mu_map = (n * prior_sigma**2 * np.mean(data) + prior_mu * true_sigma**2) / (n * prior_sigma**2 + true_sigma**2)
return mu_map, true_sigma**2
# ベイズ推定
def bayesian_estimate(data, prior_mu=0, prior_sigma=2):
n = len(data)
sample_mu = np.mean(data)
post_mu = (n * prior_sigma**2 * sample_mu + prior_mu * true_sigma**2) / (n * prior_sigma**2 + true_sigma**2)
post_sigma = np.sqrt((true_sigma**2 * prior_sigma**2) / (n * prior_sigma**2 + true_sigma**2))
return post_mu, post_sigma
# 推定結果
mu_mle, sigma_mle = mle_estimate(data)
mu_map, sigma_map = map_estimate(data)
post_mu, post_sigma = bayesian_estimate(data)
# 結果表示
print("MLE推定結果:μ=%.4f, σ²=%.4f" % (mu_mle, sigma_mle**2))
print("MAP推定結果:μ=%.4f, σ²=%.4f" % (mu_map, sigma_map**2))
print("ベイズ事後分布:μ=%.4f, σ²=%.4f" % (post_mu, post_sigma**2))
4.5 例題2:カテゴリ分布
カテゴリ分布(離散型分布)のパラメータ推定を行います。MLE、MAP、ベイズ法を比較します。
以下はPythonでの実装例です。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# データ生成
np.random.seed(42)
true_probs = np.array([0.2, 0.5, 0.3])
n_classes = len(true_probs)
n_samples = 200
data = np.random.choice(n_classes, n_samples, p=true_probs)
counts = np.bincount(data, minlength=n_classes)
# MLE推定
def mle_categorical(counts):
total = np.sum(counts)
return counts / total
# MAP推定
def map_categorical(counts, alpha=np.ones(n_classes)):
return (counts + alpha - 1) / (np.sum(counts) + np.sum(alpha) - n_classes)
# ベイズ推定
def bayesian_categorical(counts, alpha=np.ones(n_classes)):
post_alpha = counts + alpha
return post_alpha
# 推定結果
mle_probs = mle_categorical(counts)
map_probs = map_categorical(counts)
post_alpha = bayesian_categorical(counts)
# 結果表示
print("各カテゴリの発生回数:", counts)
print("MLE推定確率:", np.round(mle_probs, 4))
print("MAP推定確率:", np.round(map_probs, 4))
print("ベイズ事後パラメータ:", post_alpha)
推定方法の比較
| 方法 | 尤度関数 | 特徴 | 適用場面 |
|---|---|---|---|
| 最大尤度法 | L(θ|X) | 事前知識なし、計算量少 | 大量データ、事前情報なし |
| 最大後覚法 | p(θ|X) ∝ L(θ|X)p(θ) | 事前知識を取り入れる | 少量データ、事前情報有り |
| ベイズ法 | p(θ|X) | 分布全体を捉える | 不確実性評価、少量データ |