K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

最尤推定

上級

02.2.9

最尤推定

最終更新 2026-03-03 読了時間 3 分
まとめ
最尤推定(MLE: Maximum Likelihood Estimation)は、「このパラメータなら観測したデータが出る確率はいくつか」という尤度 \(L(\theta)\) を計算し、それが最大になる \(\theta\) を答えにする推定法です。コインを 10 回投げて 7 回表なら、表の確率 \(p\) の尤度は \(p = 0.7\) で最大になり、直感どおりの答えが式から出てきます。実際には積を和に変えた対数尤度 \(\ell(\theta)\) を最大化し、閉じた式がなければ scipy.optimize.minimize のような数値最適化で解きます。ロジスティック回帰のクロスエントロピー、ナイーブベイズの平均と分散、ガウス混合モデルの EM アルゴリズムはどれも中身が MLE なので、ここを押さえると分類手法の「学習」が何を計算しているか一本でつながります。

先に ロジスティック回帰 の「対数尤度を最大化する」という一文を読んでおくと、このページの \(\ell(\theta)\) がそこで出てきた式の一般形だと分かります。

直感 #

コインを 10 回投げて 7 回表が出た。「このコインの表の確率は?」という問いに対して、「7 回表が出る確率が最も高くなる値」を探すのが最尤推定です。\(p = 0.5\) だと 7 回表が出る確率は 0.117、\(p = 0.7\) だと 0.267、\(p = 0.9\) だと 0.057 なので、答えは 0.7。MLE は「データを最もよく説明するパラメータ」を選ぶ、それだけの原理です。ただし「\(p\) が 0.7 である確率」を求めているのではなく、「\(p\) を 0.7 と仮定したときにデータが出る確率」を比べている点が、下のステップ再生で確かめるポイントです。

何が起きているか(ステップで見る) #

コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。

見るポイント:尤度は「このパラメータなら、観測したデータが出る確率」。それを最大にする値を選ぶ。

式で書くと何を最大にしているか #

尤度と対数尤度 #

観測データ \(x_1, \ldots, x_n\) が互いに独立なら、「全部がこの値で出る確率」は各点の確率の積です。これをパラメータ \(\theta\) の関数と見たものが尤度関数です。

$$ L(\theta) = \prod_{i=1}^{n} f(x_i | \theta) $$

100 個の確率を掛けると \(10^{-50}\) のような小さな数になるので、対数をとって和に直します。対数は単調増加なので、最大になる \(\theta\) は変わりません。

$$ \ell(\theta) = \sum_{i=1}^{n} \log f(x_i | \theta) $$

MLE はこの \(\ell(\theta)\) を最大にする \(\hat{\theta} = \arg\max_\theta \ell(\theta)\) です。コインの例では \(\theta = p\)、正規分布の例では \(\theta = (\mu, \sigma)\) の 2 つになります。

例 1: コイン投げ(ベルヌーイ分布) #

次のコードは、表の確率 \(p\) を 0 から 1 まで 200 通り動かし、それぞれで「10 回中 7 回表」が出る確率を計算して曲線にします。山の頂点が MLE です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom

n, k = 10, 7  # 10回中7回表
p_range = np.linspace(0, 1, 200)
likelihood = binom.pmf(k, n, p_range)

plt.figure(figsize=(8, 4))
plt.plot(p_range, likelihood, linewidth=2)
plt.axvline(x=k/n, color="red", linestyle="--", label=f"MLE = {k/n}")
plt.xlabel("p (表の確率)")
plt.ylabel("尤度 L(p)")
plt.title("ベルヌーイ分布の最尤推定")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

例 2: 正規分布の MLE #

今度は閉じた式を使わず、平均 5.0・標準偏差 2.0 の正規分布から 100 個サンプルを作り、負の対数尤度を数値最適化で最小にして \(\mu\) と \(\sigma\) を推定します。答えは data.mean() と data.std() に一致するはずです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from scipy.optimize import minimize

np.random.seed(42)
data = np.random.normal(loc=5.0, scale=2.0, size=100)

def neg_log_likelihood(params, data):
    mu, sigma = params
    if sigma <= 0:
        return np.inf
    return -np.sum(-0.5 * np.log(2 * np.pi * sigma**2) - (data - mu)**2 / (2 * sigma**2))

result = minimize(neg_log_likelihood, x0=[0, 1], args=(data,), method="Nelder-Mead")
print(f"MLE: μ = {result.x[0]:.2f}, σ = {result.x[1]:.2f}")
print(f"標本統計: μ = {data.mean():.2f}, σ = {data.std():.2f}")

MLE が使われている手法 #

手法MLE の役割
ロジスティック回帰クロスエントロピー最小化 = 対数尤度最大化
ナイーブベイズクラス条件付き確率のパラメータ推定
ガウス混合モデルEM アルゴリズムの M ステップ
ARIMAモデルパラメータの推定

MLE vs MAP vs ベイズ推定 #

推定手法事前分布出力対応する手法
MLEなし点推定ロジスティック回帰
MAPあり点推定Ridge 回帰(ガウス事前分布)
ベイズあり事後分布ベイズ線形回帰

使いどころと落とし穴 #

MLE はデータが 100 点以上あれば安定しますが、コインを 3 回投げて 3 回表のときは \(\hat{p} = 1.0\) と極端な答えを返します。これが MLE の弱点で、少ないデータでは事前分布を掛けて極端な値を抑える MAP 推定(表の MAP の行)に切り替えるのが定石です。ナイーブベイズのラプラス平滑化(alpha=1)は、まさにこの「カウント 0 を 0 と推定しない」ための MAP 的な補正です。もう 1 つの落とし穴は、尤度が局所的な山をいくつも持つ場合で、ガウス混合モデルの EM アルゴリズムは初期値によって別の山に登ることがあります。

まとめ #

最尤推定は、尤度 \(L(\theta) = \prod f(x_i \mid \theta)\) を最大にするパラメータを選ぶ原理で、計算では対数をとった \(\ell(\theta)\) を使います。コインの例では \(\hat{p} = k/n = 0.7\) と式で解け、正規分布の例では scipy.optimize.minimize による数値最適化が標本平均・標本標準偏差と一致する値を返しました。ロジスティック回帰の学習が「クロスエントロピーの最小化」と呼ばれるのは、符号を反転した対数尤度を最小化しているからです。データが数個しかないときは MLE が極端な値を返すので、AIC・BIC のような尤度ベースのモデル選択や、事前分布を入れる MAP・ベイズ推定を次に読んでください。