結合エントロピーと条件付きエントロピーを導出して理解する

情報理論では、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)$
  • 微分エントロピー: 連続版も同様の連鎖律が成り立つ

次のステップとして、以下の記事も参考にしてください。