コインを100回投げて表が出た回数から「表の出る確率」を推定するとしよう。直感的に、100回より1000回投げた方が精度良く推定できそうだ。では、どれくらい精度が上がるのか? 10倍データを集めれば、推定精度も10倍になるのだろうか?
この問いに答えたのが、20世紀最大の統計学者と称される R.A. フィッシャー(Ronald Aylmer Fisher, 1890-1962)である。彼は1922年の論文で「データからパラメータについて得られる情報の量」を数学的に定義した。これがフィッシャー情報量(Fisher information)である。
興味深いことに、この「情報量」はシャノンの情報理論(1948年)より四半世紀も早く定義された。両者は異なる文脈で「情報」を定量化したが、深い関係があることが後に明らかになっている。
フィッシャー情報量の最も重要な応用は、推定精度の理論的限界を与えることだ。クラメール・ラオの不等式は「どんなに賢い推定方法を考えても、分散をこれ以下にはできない」という限界を示す。この限界を達成する推定量は有効推定量と呼ばれ、ある意味で「最良」の推定量である。
スコア関数
フィッシャー情報量を理解するために、まずスコア関数(score function)を導入する。
確率密度関数(離散分布では確率関数)を f(x; \theta) とする。対数尤度関数 \log f(x; \theta) をパラメータ \theta で偏微分したものがスコア関数である:
スコア関数は、パラメータを少し変えたときに対数尤度がどれくらい変化するかを表す。最尤推定では、スコア関数を0とおいた方程式(尤度方程式)を解く。
スコア関数の期待値は0
スコア関数の重要な性質として、期待値が0になることが挙げられる:
これを示そう。連続分布の場合、確率密度関数は \int f(x; \theta) dx = 1 を満たす。両辺を \theta で微分すると
ここで \dfrac{\partial f}{\partial \theta} = f \cdot \dfrac{\partial \log f}{\partial \theta} を使うと
フィッシャー情報量の定義
フィッシャー情報量には2つの等価な定義がある。
定義1:スコア関数の分散
スコア関数の期待値が0なので、スコア関数の分散がフィッシャー情報量となる:
スコア関数のばらつきが大きいほど、データからパラメータについて多くの情報が得られる。
定義2:対数尤度の2階微分の負の期待値
適当な正則条件のもとで、次の表現も成り立つ:
対数尤度の曲率(2階微分)が大きいほど、尤度関数のピークが鋭く、パラメータを精度良く推定できる。
どちらの定義を使っても同じ結果が得られる。計算しやすい方を選べばよい。多くの場合、定義2(2階微分)の方が計算が楽である。
2つの定義の等価性
定義1と定義2が等しいことを示す。スコア関数の期待値が0であることを \theta でもう一度微分する。
積の微分公式を適用すると
第1項について \dfrac{\partial f}{\partial \theta} = f \cdot \dfrac{\partial \log f}{\partial \theta} を使うと
これは期待値の記号で書くと
したがって
よって、定義1と定義2は等しい。
加法性:n個の独立標本
独立同一分布に従う標本 X_1, X_2, \ldots, X_n が得られたとき、全体のフィッシャー情報量 J_n(\theta) は
つまり、標本サイズに比例する。これを導出しよう。
同時確率密度関数は f(x_1, \ldots, x_n; \theta) = \prod_{i=1}^{n} f(x_i; \theta) なので、対数を取ると
定義2を使って
標本が増えるほど情報量が増え、推定精度が向上することが数学的に表現されている。
各分布でのフィッシャー情報量
ベルヌーイ分布
ベルヌーイ分布 \text{Ber}(p) の確率関数は f(x; p) = p^x (1-p)^{1-x}(x \in \{0, 1\})である。
対数尤度は
1階微分(スコア関数):
2階微分:
E[X] = p を使って期待値を取ると
p = 0.5 のとき I(p) = 4 と最小になり、p が0か1に近づくと情報量は増大する。
ポアソン分布
ポアソン分布 \text{Po}(\lambda) の確率関数は f(x; \lambda) = e^{-\lambda} \dfrac{\lambda^x}{x!} である。
対数尤度:
2階微分:
E[X] = \lambda を使って
\lambda が小さいほど情報量が大きく、パラメータを精度良く推定できる。
正規分布
正規分布 N(\mu, \sigma^2)(\sigma^2 既知)について、\mu に関するフィッシャー情報量を求める。
対数尤度:
2階微分:
これは x に依存しない定数なので
分散 \sigma^2 が小さいほど情報量が大きく、平均を精度良く推定できる。
\mu 既知で \sigma^2 を推定する場合、I(\sigma^2) = \dfrac{1}{2\sigma^4} となる。導出は練習問題を確認。
指数分布
指数分布 \text{Exp}(\lambda) の確率密度関数は f(x; \lambda) = \lambda e^{-\lambda x}(x \geq 0)である。
対数尤度:
2階微分:
これは定数なので
主な分布のフィッシャー情報量
| 分布 | パラメータ | フィッシャー情報量 I(\theta) |
|---|---|---|
| ベルヌーイ分布 | p | \dfrac{1}{p(1-p)} |
| ポアソン分布 | \lambda | \dfrac{1}{\lambda} |
| 正規分布(\sigma^2既知) | \mu | \dfrac{1}{\sigma^2} |
| 正規分布(\mu既知) | \sigma^2 | \dfrac{1}{2\sigma^4} |
| 指数分布 | \lambda | \dfrac{1}{\lambda^2} |
n 個の独立標本があるとき、全体のフィッシャー情報量は J_n(\theta) = n \cdot I(\theta) である。
練習問題
対数尤度は
\sigma^2 で微分すると
2階微分:
E[(X-\mu)^2] = \sigma^2 を使って期待値を取ると
対数尤度:
2階微分:
幾何分布の期待値は E[X] = \dfrac{1}{p} なので E[X-1] = \dfrac{1}{p} - 1 = \dfrac{1-p}{p}
ポアソン分布のフィッシャー情報量は I(\lambda) = \dfrac{1}{\lambda} である。
加法性より J_n(\lambda) = n \cdot I(\lambda) なので
まとめ
| 項目 | 内容 |
|---|---|
| スコア関数 | s(x; \theta) = \dfrac{\partial}{\partial \theta} \log f(x; \theta) |
| スコアの期待値 | E_\theta[s(X; \theta)] = 0 |
| 定義1 | I(\theta) = E_\theta\left[ \left( \dfrac{\partial \log f}{\partial \theta} \right)^2 \right](スコアの分散) |
| 定義2 | I(\theta) = -E_\theta\left[ \dfrac{\partial^2 \log f}{\partial \theta^2} \right](対数尤度の曲率) |
| 加法性 | J_n(\theta) = n \cdot I(\theta)(独立標本の場合) |
| 意味 | データから得られるパラメータに関する「情報量」 |
Pythonで計算する
各分布のフィッシャー情報量を計算し、数値微分による検証も行う。
import numpy as np
from scipy import stats
def fisher_info_bernoulli(p):
"""ベルヌーイ分布のフィッシャー情報量"""
return 1 / (p * (1 - p))
def fisher_info_poisson(lam):
"""ポアソン分布のフィッシャー情報量"""
return 1 / lam
def fisher_info_normal_mu(sigma2):
"""正規分布(μ)のフィッシャー情報量"""
return 1 / sigma2
def fisher_info_exponential(lam):
"""指数分布のフィッシャー情報量"""
return 1 / lam**2
# 各分布で計算
print("=== 各分布のフィッシャー情報量 ===")
print()
# ベルヌーイ分布
p = 0.3
I_bern = fisher_info_bernoulli(p)
print(f"【ベルヌーイ分布】p = {p}")
print(f" I(p) = 1/(p(1-p)) = {I_bern:.4f}")
print()
# ポアソン分布
lam = 5
I_pois = fisher_info_poisson(lam)
print(f"【ポアソン分布】λ = {lam}")
print(f" I(λ) = 1/λ = {I_pois:.4f}")
print()
# 正規分布
sigma2 = 4
I_norm = fisher_info_normal_mu(sigma2)
print(f"【正規分布】σ² = {sigma2}")
print(f" I(μ) = 1/σ² = {I_norm:.4f}")
print()
# 指数分布
lam_exp = 2
I_exp = fisher_info_exponential(lam_exp)
print(f"【指数分布】λ = {lam_exp}")
print(f" I(λ) = 1/λ² = {I_exp:.4f}")
print()
# n個の標本での情報量
print("=== n個の独立標本でのフィッシャー情報量 ===")
n = 100
print(f"n = {n} のとき")
print(f" ベルヌーイ(p={p}): J_n(p) = {n * I_bern:.2f}")
print(f" ポアソン(λ={lam}): J_n(λ) = {n * I_pois:.2f}")
print(f" 正規(σ²={sigma2}): J_n(μ) = {n * I_norm:.2f}")
print(f" 指数(λ={lam_exp}): J_n(λ) = {n * I_exp:.2f}")