《コンピュータービジョン:モデル、学習、推論》第4章-確率モデルのフィッティング

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) 分布全体を捉える 不確実性評価、少量データ

タグ: 最大似然法 最大後驗法 ベイズ推論 一元正規分布 カテゴリ分布

6月20日 17:16 投稿