情報理論では、1つの確率変数の不確実性をシャノンエントロピー $H(X)$ で測ります。しかし、現実の問題では複数の確率変数を同時に扱うことが多く、「2つの変数をまとめた不確実性」や「片方を知ったときに残る不確実性」を定量化する必要があります。
結合エントロピー(joint entropy)と条件付きエントロピー(conditional entropy)は、まさにこの目的で導入される概念です。これらはデータ圧縮の理論的限界、通信路の設計、機械学習における特徴量選択など、幅広い分野で活用されます。
本記事の内容
- 結合エントロピー $H(X, Y)$ の定義と性質
- 条件付きエントロピー $H(Y \mid X)$ の定義と導出
- 連鎖律 $H(X, Y) = H(X) + H(Y \mid X)$ の証明
- 条件付けによるエントロピー減少 $H(Y \mid X) \leq H(Y)$ の証明
- 相互情報量との関係(ベン図的理解)
- 連続確率変数への拡張(微分エントロピー)
- Pythonでの計算と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
結合エントロピー
直感的な理解
まず、2つの確率変数 $X$ と $Y$ をまとめたとき、全体としてどれだけ不確実性があるかを考えます。コインを2枚投げたとき、1枚だけの不確実性(1ビット)よりも、2枚まとめた不確実性(2ビット)のほうが大きくなるのは自然です。
定義
離散確率変数 $X$ と $Y$ の結合エントロピーは次のように定義されます。
$$ H(X, Y) = -\sum_{x \in \mathcal{X}} \sum_{y \in \mathcal{Y}} p(x, y) \log_2 p(x, y) $$
ここで、$p(x, y)$ は $X = x$ かつ $Y = y$ となる同時確率です。$p(x, y) = 0$ の場合は、$0 \log_2 0 = 0$ とします($\lim_{t \to +0} t \log t = 0$ による慣例)。
結合エントロピーの性質
結合エントロピーには以下の重要な性質があります。
性質1: 非負性
$$ H(X, Y) \geq 0 $$
これは各項 $-p(x,y) \log_2 p(x,y) \geq 0$($0 \leq p(x,y) \leq 1$ なので $\log_2 p(x,y) \leq 0$)から直ちに従います。
性質2: 上界
$$ H(X, Y) \leq H(X) + H(Y) $$
等号は $X$ と $Y$ が独立のときに限り成り立ちます。独立のとき $p(x,y) = p(x)p(y)$ なので、
$$ \begin{align} H(X, Y) &= -\sum_{x} \sum_{y} p(x)p(y) \log_2 [p(x)p(y)] \\ &= -\sum_{x} \sum_{y} p(x)p(y) [\log_2 p(x) + \log_2 p(y)] \\ &= -\sum_{x} p(x) \log_2 p(x) \sum_{y} p(y) – \sum_{y} p(y) \log_2 p(y) \sum_{x} p(x) \\ &= -\sum_{x} p(x) \log_2 p(x) – \sum_{y} p(y) \log_2 p(y) \\ &= H(X) + H(Y) \end{align} $$
途中で $\sum_{y} p(y) = 1$ および $\sum_{x} p(x) = 1$ を使いました。
性質3: 下界
$$ H(X, Y) \geq \max\{H(X), H(Y)\} $$
これは、2つの変数をまとめた不確実性は、個々の変数の不確実性以上であることを意味します。後述の連鎖律から証明できます。
具体例
2つのコインを同時に投げる場合を考えます。$X$ を1枚目、$Y$ を2枚目とし、どちらも表裏が等確率とします。
$$ p(x, y) = \frac{1}{4} \quad (\forall x \in \{H, T\}, y \in \{H, T\}) $$
結合エントロピーは
$$ H(X, Y) = -4 \times \frac{1}{4} \log_2 \frac{1}{4} = -\log_2 \frac{1}{4} = 2 \text{ bits} $$
これは $H(X) + H(Y) = 1 + 1 = 2$ ビットと一致します。独立だからです。
条件付きエントロピー
直感的な理解
条件付きエントロピー $H(Y \mid X)$ は、「$X$ の値を知った後に、$Y$ についてまだ残っている不確実性」を表します。
例えば、天気 $X$ を知った後の傘の有無 $Y$ の不確実性は、天気を知らないときの $Y$ の不確実性よりも小さいはずです。
定義
$X$ が与えられたときの $Y$ の条件付きエントロピーは、$X$ の各値 $x$ に対する条件付きエントロピーの期待値として定義されます。
まず、$X = x$ が与えられたときの条件付きエントロピーを
$$ H(Y \mid X = x) = -\sum_{y \in \mathcal{Y}} p(y \mid x) \log_2 p(y \mid x) $$
と定義します。これは「$X = x$ と分かったときの $Y$ の不確実性」です。
条件付きエントロピー $H(Y \mid X)$ は、この量を $X$ の分布で平均したものです。
$$ \begin{align} H(Y \mid X) &= \sum_{x \in \mathcal{X}} p(x) \, H(Y \mid X = x) \\ &= -\sum_{x \in \mathcal{X}} p(x) \sum_{y \in \mathcal{Y}} p(y \mid x) \log_2 p(y \mid x) \\ &= -\sum_{x \in \mathcal{X}} \sum_{y \in \mathcal{Y}} p(x) p(y \mid x) \log_2 p(y \mid x) \\ &= -\sum_{x \in \mathcal{X}} \sum_{y \in \mathcal{Y}} p(x, y) \log_2 p(y \mid x) \end{align} $$
最後のステップで $p(x) p(y \mid x) = p(x, y)$ を使いました。つまり、
$$ \boxed{H(Y \mid X) = -\sum_{x} \sum_{y} p(x, y) \log_2 p(y \mid x)} $$
注意点
$H(Y \mid X)$ は $X$ の特定の値で条件付けたものではなく、$X$ の全ての値にわたる平均的な不確実性です。つまり確率変数 $X$ 全体を条件にしています。
連鎖律(chain rule)の証明
定理
$$ \boxed{H(X, Y) = H(X) + H(Y \mid X)} $$
結合エントロピーは、まず $X$ の不確実性を測り、次に $X$ を知った上での $Y$ の不確実性を加えたものに等しくなります。
証明
結合エントロピーの定義から出発します。
$$ \begin{align} H(X, Y) &= -\sum_{x} \sum_{y} p(x, y) \log_2 p(x, y) \end{align} $$
ここで、$p(x, y) = p(x) p(y \mid x)$ を代入します。
$$ \begin{align} H(X, Y) &= -\sum_{x} \sum_{y} p(x, y) \log_2 [p(x) p(y \mid x)] \\ &= -\sum_{x} \sum_{y} p(x, y) [\log_2 p(x) + \log_2 p(y \mid x)] \\ &= -\sum_{x} \sum_{y} p(x, y) \log_2 p(x) – \sum_{x} \sum_{y} p(x, y) \log_2 p(y \mid x) \end{align} $$
第1項を変形します。$\sum_{y} p(x, y) = p(x)$ であるから、
$$ -\sum_{x} \sum_{y} p(x, y) \log_2 p(x) = -\sum_{x} p(x) \log_2 p(x) = H(X) $$
第2項はすでに確認したとおり $H(Y \mid X)$ です。
$$ -\sum_{x} \sum_{y} p(x, y) \log_2 p(y \mid x) = H(Y \mid X) $$
したがって、
$$ H(X, Y) = H(X) + H(Y \mid X) \qquad \square $$
対称性
同様に $p(x, y) = p(y) p(x \mid y)$ を使えば、
$$ H(X, Y) = H(Y) + H(X \mid Y) $$
も成り立ちます。つまり、
$$ H(X) + H(Y \mid X) = H(Y) + H(X \mid Y) $$
$n$ 個への一般化
$n$ 個の確率変数 $X_1, X_2, \dots, X_n$ に対する連鎖律は次のようになります。
$$ H(X_1, X_2, \dots, X_n) = \sum_{i=1}^{n} H(X_i \mid X_1, \dots, X_{i-1}) $$
これは2変数の連鎖律を繰り返し適用することで証明できます。
$$ \begin{align} H(X_1, X_2, \dots, X_n) &= H(X_1) + H(X_2, \dots, X_n \mid X_1) \\ &= H(X_1) + H(X_2 \mid X_1) + H(X_3, \dots, X_n \mid X_1, X_2) \\ &= \cdots \\ &= \sum_{i=1}^{n} H(X_i \mid X_1, \dots, X_{i-1}) \end{align} $$
条件付けによるエントロピー減少の証明
定理
$$ \boxed{H(Y \mid X) \leq H(Y)} $$
等号は $X$ と $Y$ が独立のときに限り成り立ちます。
この定理は「情報は増えない(Information cannot hurt)」と表現されます。$X$ を知ることで $Y$ の不確実性は減るか、少なくとも増えないことを意味します。
証明(ジェンセンの不等式を使用)
$H(Y) – H(Y \mid X) \geq 0$ を示します。
$$ \begin{align} H(Y) – H(Y \mid X) &= -\sum_{y} p(y) \log_2 p(y) + \sum_{x} \sum_{y} p(x, y) \log_2 p(y \mid x) \end{align} $$
$p(y) = \sum_{x} p(x, y)$ を使って第1項を書き直します。
$$ \begin{align} H(Y) – H(Y \mid X) &= -\sum_{x} \sum_{y} p(x, y) \log_2 p(y) + \sum_{x} \sum_{y} p(x, y) \log_2 p(y \mid x) \\ &= \sum_{x} \sum_{y} p(x, y) \log_2 \frac{p(y \mid x)}{p(y)} \\ &= \sum_{x} \sum_{y} p(x, y) \log_2 \frac{p(x, y)}{p(x)p(y)} \end{align} $$
最後のステップで $p(y \mid x) = p(x, y) / p(x)$ を代入しました。
$$ \frac{p(y \mid x)}{p(y)} = \frac{p(x, y)}{p(x) p(y)} $$
ここで、この量は相互情報量 $I(X; Y)$ そのものです。
$$ H(Y) – H(Y \mid X) = I(X; Y) = D_{\text{KL}}(p(x,y) \| p(x)p(y)) $$
KLダイバージェンスは常に非負(ギブスの不等式)であるため、
$$ I(X; Y) \geq 0 $$
ギブスの不等式の証明: $\log$ の凹性(ジェンセンの不等式)を使います。
$$ \begin{align} -D_{\text{KL}}(p \| q) &= \sum_{x} p(x) \log \frac{q(x)}{p(x)} \\ &\leq \log \sum_{x} p(x) \cdot \frac{q(x)}{p(x)} \quad (\because \text{ジェンセンの不等式、} \log \text{は凹関数}) \\ &= \log \sum_{x} q(x) \\ &= \log 1 = 0 \end{align} $$
したがって $D_{\text{KL}}(p \| q) \geq 0$ であり、$H(Y) – H(Y \mid X) = I(X; Y) \geq 0$ が示されました。 $\square$
相互情報量との関係
ベン図的理解
結合エントロピー、条件付きエントロピー、相互情報量の関係は、集合論のベン図に対応させると直感的に理解できます。
全体を「$X$ と $Y$ の全情報量」とみなし、2つの円 $H(X)$ と $H(Y)$ の和集合が $H(X,Y)$ に対応します。
$$ \begin{align} H(X, Y) &= H(X) + H(Y) – I(X; Y) \\ I(X; Y) &= H(X) – H(X \mid Y) = H(Y) – H(Y \mid X) \\ H(X \mid Y) &= H(X, Y) – H(Y) \\ H(Y \mid X) &= H(X, Y) – H(X) \end{align} $$
これを図示すると次のような構造になります。
| 領域 | 意味 |
|---|---|
| $H(X \mid Y)$ | $X$ 固有の不確実性($Y$ を知っても消えない) |
| $I(X; Y)$ | $X$ と $Y$ に共通する情報(重なり部分) |
| $H(Y \mid X)$ | $Y$ 固有の不確実性($X$ を知っても消えない) |
| $H(X, Y)$ | 全体 = $H(X \mid Y) + I(X; Y) + H(Y \mid X)$ |
各量の関係式まとめ
連鎖律と組み合わせると、以下の等式が成り立ちます。
$$ \begin{align} H(X, Y) &= H(X) + H(Y \mid X) \\ H(X, Y) &= H(Y) + H(X \mid Y) \\ I(X; Y) &= H(X) + H(Y) – H(X, Y) \\ I(X; Y) &= H(X) – H(X \mid Y) \\ I(X; Y) &= H(Y) – H(Y \mid X) \\ H(X, Y) &= H(X) + H(Y) – I(X; Y) \end{align} $$
連続確率変数への拡張(微分エントロピー)
微分エントロピーの定義
連続確率変数 $X$ の確率密度関数を $f(x)$ とするとき、微分エントロピーは
$$ h(X) = -\int_{-\infty}^{\infty} f(x) \log_2 f(x) \, dx $$
で定義されます。離散の場合と異なり、微分エントロピーは負の値を取りうることに注意してください。
結合微分エントロピーと条件付き微分エントロピー
連続確率変数 $X, Y$ に対して、
$$ h(X, Y) = -\int \int f(x, y) \log_2 f(x, y) \, dx \, dy $$
$$ h(Y \mid X) = -\int \int f(x, y) \log_2 f(y \mid x) \, dx \, dy $$
離散の場合と同じく連鎖律が成り立ちます。
$$ h(X, Y) = h(X) + h(Y \mid X) $$
正規分布の微分エントロピー
正規分布 $X \sim \mathcal{N}(\mu, \sigma^2)$ の微分エントロピーは
$$ h(X) = \frac{1}{2} \log_2 (2\pi e \sigma^2) $$
です。これは分散 $\sigma^2$ が与えられたとき、正規分布が微分エントロピーを最大化する分布であることが知られています。
導出を示します。$f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$ なので、
$$ \begin{align} h(X) &= -\int f(x) \log_2 f(x) \, dx \\ &= -\int f(x) \left[ -\frac{1}{2}\log_2(2\pi\sigma^2) – \frac{(x-\mu)^2}{2\sigma^2} \log_2 e \right] dx \\ &= \frac{1}{2}\log_2(2\pi\sigma^2) \int f(x)\,dx + \frac{\log_2 e}{2\sigma^2} \int (x-\mu)^2 f(x)\,dx \\ &= \frac{1}{2}\log_2(2\pi\sigma^2) + \frac{\log_2 e}{2\sigma^2} \cdot \sigma^2 \\ &= \frac{1}{2}\log_2(2\pi\sigma^2) + \frac{1}{2}\log_2 e \\ &= \frac{1}{2}\log_2(2\pi e \sigma^2) \end{align} $$
途中で $\int f(x) dx = 1$ と $\int (x-\mu)^2 f(x) dx = \sigma^2$ を使いました。
具体例: 離散確率変数での計算
天気 $X$ と傘の持参 $Y$ の同時確率分布を考えます。
| $Y=$ 傘あり | $Y=$ 傘なし | |
|---|---|---|
| $X=$ 晴れ | 0.1 | 0.4 |
| $X=$ 雨 | 0.4 | 0.1 |
周辺分布は $p(X=\text{晴れ}) = 0.5$, $p(X=\text{雨}) = 0.5$, $p(Y=\text{傘あり}) = 0.5$, $p(Y=\text{傘なし}) = 0.5$ です。
個別のエントロピー:
$$ H(X) = H(Y) = -0.5\log_2 0.5 – 0.5\log_2 0.5 = 1 \text{ bit} $$
結合エントロピー:
$$ \begin{align} H(X,Y) &= -[0.1\log_2 0.1 + 0.4\log_2 0.4 + 0.4\log_2 0.4 + 0.1\log_2 0.1] \\ &= -[2 \times 0.1 \times (-3.322) + 2 \times 0.4 \times (-1.322)] \\ &= 0.6644 + 1.0575 \\ &= 1.722 \text{ bits} \end{align} $$
条件付きエントロピー:
連鎖律から $H(Y \mid X) = H(X,Y) – H(X) = 1.722 – 1 = 0.722$ bits。
天気を知ると、傘の有無の不確実性は 1 ビットから 0.722 ビットに減ります。
相互情報量:
$$ I(X;Y) = H(Y) – H(Y \mid X) = 1 – 0.722 = 0.278 \text{ bits} $$
Pythonでの実装と可視化
離散確率変数の場合
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 同時確率分布の定義
# 天気(X): 0=晴れ, 1=雨
# 傘(Y): 0=傘あり, 1=傘なし
p_xy = np.array([
[0.1, 0.4], # X=晴れ
[0.4, 0.1] # X=雨
])
def entropy(p):
"""シャノンエントロピーを計算(底2)"""
p = p[p > 0] # log(0)を回避
return -np.sum(p * np.log2(p))
def joint_entropy(p_xy):
"""結合エントロピーを計算"""
return entropy(p_xy.flatten())
def conditional_entropy(p_xy, axis=0):
"""条件付きエントロピーを計算
axis=0: H(Y|X), axis=1: H(X|Y)
"""
if axis == 0:
# H(Y|X) = H(X,Y) - H(X)
p_x = p_xy.sum(axis=1)
return joint_entropy(p_xy) - entropy(p_x)
else:
# H(X|Y) = H(X,Y) - H(Y)
p_y = p_xy.sum(axis=0)
return joint_entropy(p_xy) - entropy(p_y)
def mutual_information(p_xy):
"""相互情報量を計算"""
p_x = p_xy.sum(axis=1)
p_y = p_xy.sum(axis=0)
return entropy(p_x) + entropy(p_y) - joint_entropy(p_xy)
# 各量を計算
p_x = p_xy.sum(axis=1)
p_y = p_xy.sum(axis=0)
H_X = entropy(p_x)
H_Y = entropy(p_y)
H_XY = joint_entropy(p_xy)
H_Y_given_X = conditional_entropy(p_xy, axis=0)
H_X_given_Y = conditional_entropy(p_xy, axis=1)
I_XY = mutual_information(p_xy)
print(f"H(X) = {H_X:.4f} bits")
print(f"H(Y) = {H_Y:.4f} bits")
print(f"H(X,Y) = {H_XY:.4f} bits")
print(f"H(Y|X) = {H_Y_given_X:.4f} bits")
print(f"H(X|Y) = {H_X_given_Y:.4f} bits")
print(f"I(X;Y) = {I_XY:.4f} bits")
# 連鎖律の検証
print(f"\n連鎖律の検証:")
print(f"H(X) + H(Y|X) = {H_X + H_Y_given_X:.4f} = H(X,Y) = {H_XY:.4f}")
print(f"H(Y) + H(X|Y) = {H_Y + H_X_given_Y:.4f} = H(X,Y) = {H_XY:.4f}")
# ベン図的な関係の検証
print(f"\nベン図の検証:")
print(f"H(X|Y) + I(X;Y) + H(Y|X) = {H_X_given_Y + I_XY + H_Y_given_X:.4f} = H(X,Y) = {H_XY:.4f}")
ベン図による可視化
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 同時確率分布(先ほどと同じ)
p_xy = np.array([[0.1, 0.4], [0.4, 0.1]])
p_x = p_xy.sum(axis=1)
p_y = p_xy.sum(axis=0)
# 各量を計算
H_X = -np.sum(p_x[p_x > 0] * np.log2(p_x[p_x > 0]))
H_Y = -np.sum(p_y[p_y > 0] * np.log2(p_y[p_y > 0]))
H_XY = -np.sum(p_xy[p_xy > 0] * np.log2(p_xy[p_xy > 0]))
I_XY = H_X + H_Y - H_XY
H_Y_X = H_XY - H_X
H_X_Y = H_XY - H_Y
fig, ax = plt.subplots(figsize=(10, 6))
# 2つの円を描画
circle1 = plt.Circle((-0.5, 0), 1.5, fill=False, edgecolor='blue',
linewidth=2, linestyle='-', label='H(X)')
circle2 = plt.Circle((0.5, 0), 1.5, fill=False, edgecolor='red',
linewidth=2, linestyle='-', label='H(Y)')
# 半透明の塗りつぶし
circle1_fill = plt.Circle((-0.5, 0), 1.5, fill=True,
facecolor='blue', alpha=0.1)
circle2_fill = plt.Circle((0.5, 0), 1.5, fill=True,
facecolor='red', alpha=0.1)
ax.add_patch(circle1_fill)
ax.add_patch(circle2_fill)
ax.add_patch(circle1)
ax.add_patch(circle2)
# ラベルを配置
ax.text(-1.3, 0, f'H(X|Y)\n= {H_X_Y:.3f}',
ha='center', va='center', fontsize=12, fontweight='bold', color='blue')
ax.text(0, 0, f'I(X;Y)\n= {I_XY:.3f}',
ha='center', va='center', fontsize=12, fontweight='bold', color='purple')
ax.text(1.3, 0, f'H(Y|X)\n= {H_Y_X:.3f}',
ha='center', va='center', fontsize=12, fontweight='bold', color='red')
# 外側にH(X), H(Y), H(X,Y)を表示
ax.text(-0.5, 1.8, f'H(X) = {H_X:.3f}', ha='center', fontsize=11, color='blue')
ax.text(0.5, 1.8, f'H(Y) = {H_Y:.3f}', ha='center', fontsize=11, color='red')
ax.text(0, -2.2, f'H(X,Y) = {H_XY:.3f}', ha='center', fontsize=11, color='black')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.set_aspect('equal')
ax.set_title('Entropy Venn Diagram', fontsize=14)
ax.legend(loc='upper right', fontsize=11)
ax.axis('off')
plt.tight_layout()
plt.show()
条件付けによるエントロピー減少の数値実験
import numpy as np
import matplotlib.pyplot as plt
def compute_entropies(alpha):
"""
パラメータalphaで依存度を制御した2変量分布を生成し、
各エントロピーを計算する。
alpha=0: 独立, alpha=1: 完全依存
"""
# X, Y ともに{0,1}
# 独立: p(x,y) = 0.25
# 完全依存: p(0,0)=p(1,1)=0.5, p(0,1)=p(1,0)=0
p_indep = np.array([[0.25, 0.25], [0.25, 0.25]])
p_dep = np.array([[0.5, 0.0], [0.0, 0.5]])
p_xy = (1 - alpha) * p_indep + alpha * p_dep
p_xy = np.clip(p_xy, 1e-12, 1) # log(0)回避
p_x = p_xy.sum(axis=1)
p_y = p_xy.sum(axis=0)
H_X = -np.sum(p_x * np.log2(p_x))
H_Y = -np.sum(p_y * np.log2(p_y))
H_XY = -np.sum(p_xy * np.log2(p_xy))
H_Y_X = H_XY - H_X
I_XY = H_X + H_Y - H_XY
return H_X, H_Y, H_XY, H_Y_X, I_XY
alphas = np.linspace(0, 0.99, 100)
results = np.array([compute_entropies(a) for a in alphas])
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左: 各エントロピーの変化
ax = axes[0]
ax.plot(alphas, results[:, 0], 'b-', label='H(X)', linewidth=2)
ax.plot(alphas, results[:, 1], 'r--', label='H(Y)', linewidth=2)
ax.plot(alphas, results[:, 2], 'k-', label='H(X,Y)', linewidth=2)
ax.plot(alphas, results[:, 3], 'g-.', label='H(Y|X)', linewidth=2)
ax.set_xlabel('Dependence parameter α', fontsize=12)
ax.set_ylabel('Entropy (bits)', fontsize=12)
ax.set_title('Entropy vs Dependence', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
# 右: 相互情報量と条件付きエントロピーの関係
ax = axes[1]
ax.plot(alphas, results[:, 1], 'r-', label='H(Y)', linewidth=2)
ax.plot(alphas, results[:, 3], 'g-', label='H(Y|X)', linewidth=2)
ax.plot(alphas, results[:, 4], 'm-', label='I(X;Y)', linewidth=2)
ax.fill_between(alphas, results[:, 3], results[:, 1], alpha=0.2, color='purple',
label='H(Y) - H(Y|X) = I(X;Y)')
ax.set_xlabel('Dependence parameter α', fontsize=12)
ax.set_ylabel('Entropy (bits)', fontsize=12)
ax.set_title('Conditioning reduces entropy', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
連続確率変数(2変量正規分布)の微分エントロピー
import numpy as np
import matplotlib.pyplot as plt
def diff_entropy_bivariate_normal(sigma1, sigma2, rho):
"""2変量正規分布の微分エントロピー h(X,Y)"""
det_sigma = sigma1**2 * sigma2**2 * (1 - rho**2)
return 0.5 * np.log2((2 * np.pi * np.e)**2 * det_sigma)
def diff_entropy_normal(sigma):
"""1変量正規分布の微分エントロピー h(X)"""
return 0.5 * np.log2(2 * np.pi * np.e * sigma**2)
def cond_diff_entropy_normal(sigma1, sigma2, rho):
"""条件付き微分エントロピー h(Y|X)(正規分布の場合)"""
# 条件付き分散: sigma2^2 * (1 - rho^2)
cond_var = sigma2**2 * (1 - rho**2)
return 0.5 * np.log2(2 * np.pi * np.e * cond_var)
sigma1, sigma2 = 1.0, 1.0
rhos = np.linspace(-0.99, 0.99, 200)
h_X = diff_entropy_normal(sigma1)
h_Y = diff_entropy_normal(sigma2)
h_XY = np.array([diff_entropy_bivariate_normal(sigma1, sigma2, r) for r in rhos])
h_Y_X = np.array([cond_diff_entropy_normal(sigma1, sigma2, r) for r in rhos])
mi = h_Y - h_Y_X # I(X;Y) = h(Y) - h(Y|X)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左: 微分エントロピーの変化
ax = axes[0]
ax.plot(rhos, np.full_like(rhos, h_X), 'b--', label='h(X)', linewidth=2)
ax.plot(rhos, np.full_like(rhos, h_Y), 'r--', label='h(Y)', linewidth=2)
ax.plot(rhos, h_XY, 'k-', label='h(X,Y)', linewidth=2)
ax.plot(rhos, h_Y_X, 'g-', label='h(Y|X)', linewidth=2)
ax.set_xlabel('Correlation ρ', fontsize=12)
ax.set_ylabel('Differential entropy (bits)', fontsize=12)
ax.set_title('Differential entropy of bivariate normal', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
# 右: 相互情報量
ax = axes[1]
ax.plot(rhos, mi, 'm-', linewidth=2)
ax.set_xlabel('Correlation ρ', fontsize=12)
ax.set_ylabel('I(X;Y) (bits)', fontsize=12)
ax.set_title('Mutual information vs correlation', fontsize=13)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
まとめ
本記事では、結合エントロピーと条件付きエントロピーについて解説しました。
- 結合エントロピー $H(X,Y)$: 2つの確率変数をまとめた不確実性
- 条件付きエントロピー $H(Y \mid X)$: $X$ を知った後に $Y$ について残る不確実性
- 連鎖律: $H(X,Y) = H(X) + H(Y \mid X)$
- エントロピー減少: $H(Y \mid X) \leq H(Y)$(条件付けは不確実性を減らす)
- 相互情報量との関係: $I(X;Y) = H(Y) – H(Y \mid X) = H(X) + H(Y) – H(X,Y)$
- 微分エントロピー: 連続版も同様の連鎖律が成り立つ
次のステップとして、以下の記事も参考にしてください。