情報理論では、1つの確率変数の不確実性をシャノンエントロピー $H(X)$ で測ります。しかし、現実の問題では複数の確率変数を同時に扱うことが多く、「2つの変数をまとめた不確実性」や「片方を知ったときに残る不確実性」を定量化する必要があります。
例えば、天気予報の精度を測るとき、「気温」と「湿度」をまとめた不確実性はどれくらいでしょうか。気温を観測した後、湿度の不確実性はどれだけ減るでしょうか。あるいは画像認識で、特定のピクセル領域 $X$ を見たときにクラスラベル $Y$ の不確実性はどれだけ減るでしょうか。これらの問いは、いずれも「複数変数のエントロピー」を扱う枠組みで初めて答えられます。
結合エントロピー(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での計算と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 自己情報量とエントロピーの定義をわかりやすく解説 — 1変数のエントロピー $H(X) = -\sum_x p(x) \log_2 p(x)$ の意味と「平均情報量(ビット数)」としての解釈
- 相互情報量の定義と応用をわかりやすく解説 — 2変数間で共有される情報量。本記事の後半で結合・条件付きエントロピーとつなげる
- KLダイバージェンス(相対エントロピー) — 「ギブスの不等式 $D_{\text{KL}} \geq 0$」の証明に使う、2分布間の距離尺度
- 確率分布の周辺化・条件付き分布 — $p(x,y) = p(x)p(y|x)$ の積分解(連鎖律の前提)
特にエントロピー $H(X)$ を「予測しにくさのビット数」として直感的に押さえておくと、その自然な拡張として結合・条件付きエントロピーが理解できます。下図は1変数エントロピーの直感を示したものです。

上の図から、エントロピーは「分布が平等に近いほど大きく、偏っているほど小さくなる」ことが読み取れます。等確率4択($H=2$ bit)と偏った4択($H \approx 1.32$ bit)を比べると、後者は実質的に「次に来る値がだいたい予想できる」ため、平均情報量も小さくなるわけです。この直感を保ったまま、2変数の世界へ拡張していきます。
結合エントロピー
直感的な理解
まず、2つの確率変数 $X$ と $Y$ をまとめたとき、全体としてどれだけ不確実性があるかを考えます。コインを2枚投げたとき、1枚だけの不確実性(1ビット)よりも、2枚まとめた不確実性(2ビット)のほうが大きくなるのは自然です。
イメージとしては、$H(X,Y)$ は「$(X, Y)$ という1つの組を当てるのに平均何ビット必要か」を測っています。$X, Y$ が独立なら情報は単純に足し合わさり、依存があれば「片方を知れば他方が予測しやすい」ぶんだけ短縮されます。

定義
離散確率変数 $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$ ビットと一致します。独立だからです。
逆に、2枚のコインを「接着して同じ面しか出ない」ようにした極端な依存の場合、結合エントロピーは1ビットにまで縮みます。$X$ を見れば $Y$ は完全に決まるからで、「2変数まとめた」情報は実質的に1変数ぶんしかないわけです。ここまでで結合エントロピーの全体像が掴めました。次は、この $H(X, Y)$ を「$X$ の不確実性」と「$X$ を知った後の $Y$ の不確実性」に分解する仕掛けに進みます。
条件付きエントロピー
直感的な理解
条件付きエントロピー $H(Y \mid X)$ は、「$X$ の値を知った後に、$Y$ についてまだ残っている不確実性」を表します。
例えば、天気 $X$ を知った後の傘の有無 $Y$ の不確実性は、天気を知らないときの $Y$ の不確実性よりも小さいはずです。雨が降ると分かっていれば、人々が傘を持つ確率は跳ね上がるので、$Y$ の予測しやすさが向上するわけです。

上の図のように、$X$ の各値 $x$ に対して別々に $H(Y \mid X=x)$ を測り、それを $X$ の分布 $p(x)$ で平均したものが $H(Y \mid X)$ です。「$X$ の各場面ごとの $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$ 全体を条件にしています。
$H(Y \mid X = x)$ は $X$ の値ごとに変化しますが、$H(Y \mid X)$ はそれを $X$ の分布で平均した「決まった一つの数」です。期待値で潰す操作を忘れると、定義式の $\sum_x \sum_y p(x, y)$ の意味を見失ってしまうので注意してください。
ここまでで結合エントロピーと条件付きエントロピーを別々に定義しました。両者は無関係ではなく、$p(x, y) = p(x)p(y \mid 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} $$
この $n$ 変数版の連鎖律は、言語モデルにおける文の確率分解 $p(w_1, \dots, w_T) = \prod_t p(w_t \mid w_{ 連鎖律によって「結合エントロピーは個別+条件付きに分解できる」ことが示せました。すると次に気になるのは、条件付きエントロピーは元の $H(Y)$ と比べてどう変わるのか、です。直感的には「$X$ を知れば $Y$ の不確実性は減る」と思えますが、本当にそうなるのかを次節で証明します。 $$
\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$ 注意: あくまで「平均としての $H(Y \mid X) \leq H(Y)$」が成り立つ、ということです。特定の $x$ について $H(Y \mid X = x) > H(Y)$ となるケースは存在します(たとえば「ある観測値が逆に混乱を招く」状況)。しかし $X$ の分布で平均すれば必ず減るというのが、この不等式の主張です。 ここで証明の中に自然に相互情報量 $I(X; Y)$ が現れました。これは「条件付けによってどれだけエントロピーが減ったか」を測る量で、結合・条件付きエントロピーと密接につながります。次節でこの関係を整理します。 結合エントロピー、条件付きエントロピー、相互情報量の関係は、集合論のベン図に対応させると直感的に理解できます。 全体を「$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}
$$ これを図示すると次のような構造になります。 連鎖律と組み合わせると、以下の等式が成り立ちます。 $$
\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}
$$ これらの式はベン図を1つ思い浮かべれば、必要なときに即座に書き下せます。情報理論の証明で繰り返し使う「文法」のようなものなので、ぜひこの図と一緒に覚えておきましょう。 上の図は、同じ周辺分布をもつ2つの同時分布(独立な場合と強依存な場合)を比べたものです。独立な場合は $H(X, Y) = H(X) + H(Y)$ で「2枚分」の情報があるのに対し、強依存の場合は $X$ を知れば $Y$ も決まるため、$H(X, Y) = H(X) = H(Y)$ となり「1枚分」に縮みます。差はちょうど $I(X; Y)$ で、独立なら0、強依存なら $H(Y)$ そのものになります。 ここまでは離散の世界の話でした。実用上は連続な変数(センサ値、画像の輝度、機械学習の特徴量など)を扱うことが多いため、連続版への拡張を確認しておきましょう。 連続確率変数 $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$ を使いました。 この式は通信路容量の計算で頻繁に登場します。たとえば加法的ガウス雑音通信路(AWGN)の容量 $C = \frac{1}{2} \log_2(1 + S/N)$ は、出力 $Y = X + N$ の微分エントロピーの差分から導出されます。正規分布が「分散を固定したときに微分エントロピーを最大化する」性質を持つことが、シャノンの通信路符号化定理の屋台骨を支えているのです。 ここまでで結合・条件付きエントロピーの定義・性質・連鎖律・連続版までを一通り押さえました。次は具体的な数値で「実際にどんな値になるのか」を確認しましょう。 天気 $X$ と傘の持参 $Y$ の同時確率分布を考えます。 周辺分布は $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}
$$ つまり「天気を観測することで、傘の有無について 0.278 ビット分の情報を得られる」と解釈できます。1ビット中の0.278という値は、「ほぼ完全に独立」と「ほぼ完全に決定論的」の間の中庸を表しており、現実の予測タスクで典型的に出会う値域です。 上図のように、同じ周辺分布でも結合分布の「対角に偏る/反対角に偏る/均等」によって、$H(X, Y)$、$H(Y \mid X)$、$I(X; Y)$ がそれぞれ異なる値を取ります。結合分布の形を見ただけで、これらの量がおおよそどう動くか見当が付くようになると、情報理論的議論が一気に身近になります。 数値で確かめたところで、ここからは Python で各量を計算し、可視化していきます。手計算と一致するかを確認しつつ、より複雑な分布での挙動も見ていきましょう。 出力結果から、以下が確認できます。 このように、定義式から愚直に計算するだけで、抽象的に見えた等式が数値レベルで一致するのは小気味よいものです。次は、これらの量をベン図で可視化してみましょう。 ベン図の各領域の面積比は、エントロピー値の比に対応しています。中央の重なり $I(X;Y) \approx 0.278$ が「天気と傘の共有情報」、左右の三日月形 $H(X \mid Y) = H(Y \mid X) \approx 0.722$ がそれぞれ「相手を知っても消えない固有の不確実性」を表しています。$X$ と $Y$ が対称な分布なので、ベン図も左右対称になっている点も確認できます。 このグラフから、依存度パラメータ $\alpha$ を 0(独立)から 1(完全依存)に動かすと、以下のことが読み取れます。 右図の塗りつぶし領域($H(Y)$ と $H(Y \mid X)$ の間)が、ちょうど $I(X; Y)$ に等しいことが視覚的に確認できます。これが「条件付けはエントロピーを減らす(情報は増えない)」という定理の幾何学的解釈です。 連続版の出力から、以下が読み取れます。 ガウスの場合の閉形式 $I(X; Y) = -\frac{1}{2} \log_2(1 – \rho^2)$ は実務上非常によく使う公式です。線形相関と情報理論的依存性をつなぐ橋渡しになるので、ぜひ覚えておきましょう。 ここまでで定義・性質・実装まで一通り終わりました。最後に、これらの量が情報理論の他概念(KLダイバージェンス、データ処理不等式、機械学習)とどうつながるかを俯瞰しておきます。 結合・条件付きエントロピーは、それ自体が目的というよりも、情報理論の様々な定理や機械学習アルゴリズムを構築する「部品」として真価を発揮します。代表的な4つのつながりを見ていきましょう。 3つの確率変数がマルコフ連鎖 $X \to Y \to Z$ を成すとき(つまり $Z$ が $X$ に対して $Y$ を通じてのみ依存する)、以下の不等式が成り立ちます。 $$
I(X; Z) \leq I(X; Y)
$$ これは「$Y$ をどう加工しても、$X$ に関する情報が増えることはない」という直感を厳密に保証する定理です。証明は条件付き相互情報量と連鎖律を使います。 $$
I(X; Y, Z) = I(X; Y) + I(X; Z \mid Y) = I(X; Z) + I(X; Y \mid Z)
$$ マルコフ性 $X \to Y \to Z$ より $I(X; Z \mid Y) = 0$($Y$ を知れば $X$ と $Z$ は独立)、また $I(X; Y \mid Z) \geq 0$ なので、 $$
I(X; Y) = I(X; Z) + I(X; Y \mid Z) \geq I(X; Z)
$$ DPI は機械学習で「特徴抽出は情報を失いうるが、決して増やせない」という事実を裏付けています。深層学習で多層を重ねることが意味を持つのは、各層が「タスクに必要な情報を選別」しているからであって、「情報を生み出している」わけではない、という点に注意が必要です。 条件付けによるエントロピー減少の証明で見たとおり、相互情報量は KL ダイバージェンスとして書き直せます。 $$
I(X; Y) = D_{\text{KL}}\bigl(p(x, y) \,\|\, p(x)p(y)\bigr)
$$ つまり相互情報量とは「独立を仮定した分布」から「実際の同時分布」までの KL 距離にほかなりません。この見方をすると、$I(X; Y) = 0 \iff X \perp Y$ が KL の非負性から即座に従います。 さらに条件付き相互情報量 $I(X; Y \mid Z)$ も KL の期待値として書けるため、グラフィカルモデル(ベイズネット)の条件付き独立性判定や、変分推論における ELBO の解析がすべて統一的に扱えます。 機械学習で「どの特徴量がラベルに関係しているか」を測る基本的な指標が相互情報量 $I(X_j; Y)$ です。 決定木(CART, ID3, C4.5)の分岐基準である情報利得 (information gain) も、まさに条件付きエントロピーの差として定義されます。 $$
\text{IG}(X_j) = H(Y) – H(Y \mid X_j) = I(X_j; Y)
$$ 各ノードで「分岐後の条件付きエントロピーを最も減らす特徴量」を選ぶことで、木は情報量的に効率的な分類器に育っていきます。 シャノンの情報源符号化定理は「データを平均 $H(X)$ ビット未満では誤りなく圧縮できない」と主張します。さらに通信路容量は $$
C = \max_{p(x)} I(X; Y)
$$ として与えられ、これは「入力分布を最適化したときの、入出力間の相互情報量の最大値」です。条件付きエントロピー $H(Y \mid X)$ が通信路ノイズの不確実性を、相互情報量 $I(X; Y)$ が実際に届く情報量を表す、というのが理論の核です。 近年の自己教師あり学習や表現学習では、情報ボトルネック法 (Information Bottleneck) が理論的支柱の一つになっています。これは入力 $X$ から表現 $Z$ を作るとき、ターゲット $Y$ との相互情報量 $I(Z; Y)$ を最大化しつつ $I(X; Z)$ を最小化する、というラグランジュ最適化問題です。 $$
\mathcal{L}_{\text{IB}} = I(X; Z) – \beta I(Z; Y)
$$ 無関係な情報を捨て、タスクに必要な情報だけを保持する「最小十分表現」を学習することを意味しており、まさに結合・条件付きエントロピーの枠組みが現代の深層学習を支えていることが分かります。 このように、本記事で導入した量は情報理論の「公理」ではなく、現代のあらゆる確率的推論・機械学習に通底する「基本道具」です。最後にこれまでの内容を整理し、次に学ぶべきトピックを示します。 本記事では、結合エントロピーと条件付きエントロピーについて解説しました。 これらは「2変数の確率分布を情報の言葉で語る」ための基本セットで、機械学習・通信理論・統計力学にまたがる広い領域で活躍します。とくに「条件付ければエントロピーは減る」「相互情報量は対称」「マルコフ連鎖で情報は単調減少」という3つの定理は、応用先で繰り返し顔を出すので、まず手で書き下せるくらいに馴染んでおくと良いでしょう。 次のステップとして、以下の記事も参考にしてください。条件付けによるエントロピー減少の証明
定理
証明(ジェンセンの不等式を使用)
相互情報量との関係

ベン図的理解
領域
意味
$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)$
各量の関係式まとめ

連続確率変数への拡張(微分エントロピー)
微分エントロピーの定義
結合微分エントロピーと条件付き微分エントロピー
正規分布の微分エントロピー
具体例: 離散確率変数での計算
$Y=$ 傘あり
$Y=$ 傘なし
$X=$ 晴れ
0.1
0.4
$X=$ 雨
0.4
0.1

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()
応用 — 情報理論の他概念とのつながり
1. データ処理不等式 (Data Processing Inequality, DPI)

2. KL ダイバージェンスとの関係

3. 機械学習 — 特徴量選択と決定木
sklearn.feature_selection.mutual_info_classif などで実装されており、相関係数では検出できない非線形な依存関係も捉えられるのが強みです。4. 通信路容量と情報源符号化
5. 表現学習・情報ボトルネック
まとめ