Mímisbrunnr知恵の泉

← 情報理論 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:確率分布・期待値の初歩 | 次:結合・条件付きエントロピーと連鎖則

要点(BLUF)

1. 情報とは「驚き」である

情報の量を測りたい。望ましい性質を3つ挙げます。(1) 稀な事象ほど情報が大きい(「明日太陽が東から昇る」はほぼ情報ゼロ、「明日雪が降る」は情報が大きい)。(2) 確率1の確定事象は情報ゼロ。(3) 独立な2つの事象を同時に知ったら、情報は足し算になる(I(x,y)=I(x)+I(y)I(x,y)=I(x)+I(y))。

確率 p(x)p(x) の単調減少関数で、かつ積を和に変える関数——それは 対数 しかありません。そこで 自己情報量

I(x)=logp(x)I(x) = -\log p(x)

と定義します。pp が小さいほど logp-\log p は大きく、p=1p=1 なら I=0I=0、独立事象では log(pxpy)=logpxlogpy-\log(p_x p_y)=-\log p_x-\log p_y で加法性も満たします。

2. log の底=情報の単位(必ず明示する)

対数の底は単位を決めるだけで、本質は変わりません。底を明示する習慣をつけてください。

単位意味
2bit(ビット)2択(はい/いいえ)何回分か
eenat(ナット)自然対数。理論計算で便利
10dit / hartley10進1桁あたり

換算は log2x=logex/loge2\log_2 x = \log_e x / \log_e 2 なので、1nat=log2e1.4427bit1\,\text{nat} = \log_2 e \approx 1.4427\,\text{bit}。本シリーズでは 符号化・通信は bit(底2)統計・MLとの接続では nat(底 ee を主に使い、各ノートで底を明記します。

3. エントロピー=自己情報量の期待値

確率変数 XX が値 xx を確率 p(x)p(x) で取るとき、驚きの平均エントロピー

H(X)=EX ⁣[logp(X)]=xp(x)logp(x)H(X) = \mathbb{E}_{X}\!\left[-\log p(X)\right] = -\sum_{x} p(x)\log p(x)

底2なら単位は bit。0log0=00\log 0 = 0 と約束します(p0p\to 0plogp0p\log p\to 0)。これは「XX の値を1回知るのに平均何 bit の情報が得られるか」=「XX を符号化するのに必要な平均ビット数の下限」です(シャノンの情報源符号化定理)。

2値エントロピー関数

XX が確率 pp で 1、1p1-p で 0 を取るとき、

H(p)=plog2p(1p)log2(1p)H(p) = -p\log_2 p - (1-p)\log_2(1-p)

これを 2値エントロピー関数 と呼びます。p=0.5p=0.5 で最大値 1 bit、p=0p=0 または 11 で 0。下のコードで確かめます。

4. コード:エントロピーと「平均の驚き」(底2, bit)

公正コインで 1 bit、4記号の情報源 {0.5,0.25,0.125,0.125}\{0.5,0.25,0.125,0.125\}H=1.75H=1.75 bit。さらに、実際にサンプリングした観測の 驚きの平均 が理論エントロピーに一致することを大数の法則で確かめます。

import numpy as np

# --- 1. 2値エントロピー H(p) を底2(bit)で計算 ---
def H2(p):
    p = np.asarray(p, dtype=float)
    out = np.zeros_like(p)
    m = (p > 0) & (p < 1)
    out[m] = -p[m]*np.log2(p[m]) - (1-p[m])*np.log2(1-p[m])
    return out

for p in [0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0]:
    print(f"p={p:>4}: H(p)={H2(p):.4f} bit")

print("-"*40)
# --- 2. 自己情報量(驚き) I(x) = -log2 p(x) ---
for p in [0.5, 0.25, 0.125, 0.01]:
    print(f"p(x)={p:>6}: 自己情報量 I={-np.log2(p):.3f} bit")

print("-"*40)
# --- 3. モンテカルロ:平均の驚き = エントロピー ---
rng = np.random.default_rng(0)
probs = np.array([0.5, 0.25, 0.125, 0.125])   # 4記号の情報源
H_theory = -np.sum(probs*np.log2(probs))
N = 1_000_000
samples = rng.choice(len(probs), size=N, p=probs)
surprise = -np.log2(probs[samples])           # 各観測の驚き
print(f"理論エントロピー       H = {H_theory:.4f} bit")
print(f"標本平均の驚き(N=1e6)    = {surprise.mean():.4f} bit")

print("-"*40)
# --- 4. 底の違い:bit と nat ---
H_bit = -np.sum(probs*np.log2(probs))
H_nat = -np.sum(probs*np.log(probs))
print(f"H = {H_bit:.4f} bit, {H_nat:.4f} nat")
print(f"bit / nat の比 = {H_bit/H_nat:.4f}  (= log2(e) = {np.log2(np.e):.4f})")

出力:

p= 0.0: H(p)=0.0000 bit
p= 0.1: H(p)=0.4690 bit
p=0.25: H(p)=0.8113 bit
p= 0.5: H(p)=1.0000 bit
p=0.75: H(p)=0.8113 bit
p= 0.9: H(p)=0.4690 bit
p= 1.0: H(p)=0.0000 bit
----------------------------------------
p(x)=   0.5: 自己情報量 I=1.000 bit
p(x)=  0.25: 自己情報量 I=2.000 bit
p(x)= 0.125: 自己情報量 I=3.000 bit
p(x)=  0.01: 自己情報量 I=6.644 bit
----------------------------------------
理論エントロピー       H = 1.7500 bit
標本平均の驚き(N=1e6)    = 1.7501 bit
----------------------------------------
H = 1.7500 bit, 1.2130 nat
bit / nat の比 = 1.4427  (= log2(e) = 1.4427)

出力の意味:(1) 2値エントロピーは p=0.5p=0.5 で最大 1 bit、p=0,1p=0,1 で 0——もっとも予測しにくいのが五分五分。(2) 確率 1/81/8 の事象の驚きは 3 bit(=log218=-\log_2 \frac18)。(3) 100万回サンプリングした観測の驚きの平均 1.75011.7501 は理論値 1.75001.7500 にぴたり——**エントロピーは「平均の驚き」**という定義が文字通り成り立っています。(4) 同じ分布でも bit と nat は log2e1.4427\log_2 e\approx1.4427 倍違う=底を言わなければ数値は意味を持ちません

5. 数式の直観的意味

H(X)H(X) の値は「XX を当てるのに平均何回の2択質問が要るか」とも読めます。4記号 {0.5,0.25,0.125,0.125}\{0.5,0.25,0.125,0.125\} なら、確率の高い記号を短い質問で当てる賢い戦略をとると平均 1.75 回で当たる——これは エントロピーの性質と最大エントロピー の最大エントロピー、ハフマン符号 の最適符号長と直結します。エントロピーは「不確かさ」「平均符号長の下限」「平均質問回数」という3つの顔を持つ同一量です。

⚠️ よくある誤解

対応シミュレーション

関連ノート