Mímisbrunnr知恵の泉

← 情報理論 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:自己情報量とエントロピー | 次:エントロピーの性質と最大エントロピー

要点(BLUF)

1. 結合エントロピーと条件付きエントロピー

2つの確率変数 (X,Y)(X,Y) を1つの組とみなせば、その不確かさは自己情報量の期待値そのまま:

H(X,Y)=x,yp(x,y)logp(x,y)H(X,Y) = -\sum_{x,y} p(x,y)\log p(x,y)

条件付きエントロピー は、X=xX=x を知った後の YY の不確かさ H(YX=x)H(Y\mid X=x) を、xx の出現確率で平均したものです:

H(YX)=xp(x)H(YX=x)=x,yp(x,y)logp(yx)H(Y\mid X) = \sum_x p(x)\,H(Y\mid X=x) = -\sum_{x,y} p(x,y)\log p(y\mid x)

XX を教えてもらった後、まだ YY について平均どれだけ驚くか」。XXYY を完全に決めるなら H(YX)=0H(Y\mid X)=0XXYY が無関係なら H(YX)=H(Y)H(Y\mid X)=H(Y) です。

2. 連鎖則(chain rule)

p(x,y)=p(x)p(yx)p(x,y)=p(x)\,p(y\mid x) の両辺に log-\log を取って期待値を取ると、自己情報量の加法性がそのままエントロピーの加法性になります:

H(X,Y)=H(X)+H(YX)=H(Y)+H(XY)H(X,Y) = H(X) + H(Y\mid X) = H(Y) + H(X\mid Y)

全体の不確かさ=最初の変数の不確かさ+それを知った後に残る不確かさnn 変数へ一般化すると

H(X1,,Xn)=i=1nH(XiX1,,Xi1)H(X_1,\dots,X_n) = \sum_{i=1}^{n} H(X_i \mid X_1,\dots,X_{i-1})

これが連鎖則です。後の相互情報量・データ処理不等式(情報不等式とデータ処理不等式)の証明はすべてこの分解から出ます。

3. コード:連鎖則と「条件づけは不確かさを下げる」(底2, bit)

天気 XX(晴/雨)と傘 YY(なし/あり)の同時分布で、H(X,Y)=H(X)+H(YX)H(X,Y)=H(X)+H(Y\mid X) を検算し、H(YX)H(Y)H(Y\mid X)\le H(Y) を確かめます。

import numpy as np

# 同時分布 p(x,y)(2x2の例。X=天気, Y=傘)
P = np.array([[0.40, 0.10],   # X=0(晴): Y=0(傘なし)=0.40, Y=1(傘あり)=0.10
              [0.05, 0.45]])  # X=1(雨): Y=0=0.05,       Y=1=0.45
assert np.isclose(P.sum(), 1.0)

def H(p):
    p = np.asarray(p, dtype=float).ravel()
    p = p[p > 0]
    return -np.sum(p*np.log2(p))   # 底2(bit)

px = P.sum(axis=1)   # 周辺 p(x)
py = P.sum(axis=0)   # 周辺 p(y)

Hx  = H(px)
Hy  = H(py)
Hxy = H(P)                       # 結合エントロピー H(X,Y)
Hy_given_x = Hxy - Hx            # 連鎖則 H(Y|X)=H(X,Y)-H(X)
Hx_given_y = Hxy - Hy

print(f"H(X)      = {Hx:.4f} bit")
print(f"H(Y)      = {Hy:.4f} bit")
print(f"H(X,Y)    = {Hxy:.4f} bit")
print(f"H(Y|X)    = {Hy_given_x:.4f} bit   (= H(X,Y)-H(X))")
print(f"H(X|Y)    = {Hx_given_y:.4f} bit")
print("-"*46)
# 連鎖則の検算: H(X,Y) = H(X) + H(Y|X) = H(Y) + H(X|Y)
print(f"H(X)+H(Y|X) = {Hx+Hy_given_x:.4f} bit  (=H(X,Y)?)")
print(f"H(Y)+H(X|Y) = {Hy+Hx_given_y:.4f} bit  (=H(X,Y)?)")
print("-"*46)
# 条件づけは平均でエントロピーを下げる: H(Y|X) <= H(Y)
print(f"H(Y|X)={Hy_given_x:.4f} <= H(Y)={Hy:.4f} : {Hy_given_x <= Hy}")
print(f"独立なら H(X)+H(Y)={Hx+Hy:.4f}, 実際の H(X,Y)={Hxy:.4f}, 差={Hx+Hy-Hxy:.4f}")

出力:

H(X)      = 1.0000 bit
H(Y)      = 0.9928 bit
H(X,Y)    = 1.5955 bit
H(Y|X)    = 0.5955 bit   (= H(X,Y)-H(X))
H(X|Y)    = 0.6027 bit
----------------------------------------------
H(X)+H(Y|X) = 1.5955 bit  (=H(X,Y)?)
H(Y)+H(X|Y) = 1.5955 bit  (=H(X,Y)?)
----------------------------------------------
H(Y|X)=0.5955 <= H(Y)=0.9928 : True
独立なら H(X)+H(Y)=1.9928, 実際の H(X,Y)=1.5955, 差=0.3973

出力の意味:連鎖則は両方向で 1.59551.5955 bit にぴたり一致——分解はどちらの変数から始めても同じ全体に戻ります。傘を知らないときの天気の不確かさ H(X)=1H(X)=1 bit が、傘を見た後は H(XY)=0.6027H(X\mid Y)=0.6027 bit に減っています。観測は平均で不確かさを下げる。下がった分 0.39730.3973 bit がまさに X,YX,Y の依存の強さ=相互情報量で、独立なら H(X,Y)=H(X)+H(Y)H(X,Y)=H(X)+H(Y) になるはずの差そのものです(相互情報量)。

4. エントロピーレート:記憶のある情報源の1記号あたりの不確かさ

文章や時系列のように記号が独立でない情報源では、1記号あたりの不確かさを エントロピーレート で測ります:

H(X)=limn1nH(X1,,Xn)H(\mathcal{X}) = \lim_{n\to\infty} \frac{1}{n} H(X_1,\dots,X_n)

定常マルコフ連鎖なら、これは定常分布 π\pi で重みづけた1ステップ先の条件付きエントロピーに等しくなります(H=iπiH(遷移確率の行 i)H = \sum_i \pi_i\, H(\text{遷移確率の行 } i))。記憶があると、次の記号は前から部分的に予測できるぶん、エントロピーレートは記憶を無視した周辺エントロピー H(Xt)H(X_t) より小さくなります。

import numpy as np

def H(p):
    p = np.asarray(p, dtype=float); p = p[p > 0]
    return -np.sum(p*np.log2(p))   # bit

# 2状態マルコフ連鎖の遷移行列 T[i,j]=P(次=j | 今=i)
T = np.array([[0.9, 0.1],
              [0.4, 0.6]])
# 定常分布 π(πT=π)を固有ベクトルから求める
w, v = np.linalg.eig(T.T)
pi = np.real(v[:, np.argmin(np.abs(w-1))]); pi = pi/pi.sum()
print(f"定常分布 pi = {pi.round(4)}")

# エントロピーレート H = Σ_i pi_i H(行 T[i])
rate = sum(pi[i]*H(T[i]) for i in range(2))
print(f"エントロピーレート H(X) = {rate:.4f} bit/記号")
print(f"周辺エントロピー H(X_t) = {H(pi):.4f} bit  (記憶を使わない上限)")

# シミュレーションで検算:長い系列の (1/n) * (-log2 p(系列))
rng = np.random.default_rng(7)
n = 200_000
s = np.zeros(n, dtype=int); s[0] = 0
for t in range(1, n):
    s[t] = rng.choice(2, p=T[s[t-1]])
logp = np.log2(pi[s[0]]) + np.sum(np.log2(T[s[:-1], s[1:]]))
print(f"シミュレーション (1/n)(-log2 p) = {-logp/n:.4f} bit/記号")

出力:

定常分布 pi = [0.8 0.2]
エントロピーレート H(X) = 0.5694 bit/記号
周辺エントロピー H(X_t) = 0.7219 bit  (記憶を使わない上限)
シミュレーション (1/n)(-log2 p) = 0.5669 bit/記号

出力の意味:記憶を使うとエントロピーレートは 0.56940.5694 bit/記号、記憶を無視した周辺エントロピー 0.72190.7219 bit より明らかに小さい——過去が次を予測する手がかりになる分、不確かさは下がる。20万記号のシミュレーションで (1/n)(log2p(系列))=0.5669(1/n)(-\log_2 p(\text{系列}))=0.5669 がレートに収束しており、これは次節 AEP(漸近等分割性とAEP)の「長い系列の確率は 2nH2^{-nH} に集中する」の記憶あり版です。英語の文章のエントロピーレートが約 1 bit/文字とされるのも、文字に強い依存があるからです。

5. 数式の直観的意味

連鎖則は「不確かさは順番に分割払いできる」ことを言っています。X1X_1 を知り、次に X1X_1 を踏まえて X2X_2 を知り…と積み上げると、各ステップの「まだ残っている不確かさ」の和が全体に一致する。この分解可能性こそが、相互情報量・KL・符号化定理の議論をベン図のように足し引きできる理由です(H,H(XY),I(X;Y)H,H(X\mid Y),I(X;Y) の関係は 相互情報量 で図示)。

⚠️ よくある誤解

対応シミュレーション

関連ノート