2つの確率変数がどの程度「関連し合っている」かを定量的に測りたい場面は、情報理論に限らず機械学習や通信工学、統計学など多くの分野で登場します。相関係数は線形な関係しか捉えられませんが、相互情報量(Mutual Information) は線形・非線形を問わず、2つの確率変数の間にある統計的な依存関係の強さを測ることができます。
相互情報量は、特徴量選択、独立成分分析(ICA)、情報ボトルネック法、通信路容量の定義など、理論・応用の両面で極めて重要な役割を果たします。
本記事の内容
- エントロピーの復習と結合エントロピー・条件付きエントロピーの定義
- 相互情報量 $I(X;Y)$ の定義とKLダイバージェンスとの関係
- ベン図による直感的な理解
- 相互情報量の基本的な性質(非負性・対称性・独立のとき $I = 0$)
- 連続確率変数への拡張と2次元正規分布での解析解
- 離散・連続の具体的な計算例とPython実装
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
エントロピーの復習
相互情報量の定義に入る前に、エントロピーの定義を簡潔に復習しておきましょう。
離散確率変数 $X$ が確率質量関数 $p(x)$ をもつとき、シャノンエントロピー $H(X)$ は次のように定義されます。
$$ H(X) = -\sum_{x} p(x) \log p(x) $$
エントロピーは確率変数の「不確かさの大きさ」を測る量であり、確率分布が一様に近いほど大きく、1つの値に集中しているほど小さくなります。
同様に、確率変数 $Y$ のエントロピーは次のとおりです。
$$ H(Y) = -\sum_{y} p(y) \log p(y) $$
ここで $\log$ は自然対数 $\ln$ とすることが多いですが、底を 2 にとれば単位はビット(bit)になります。本記事では自然対数を用い、単位はナット(nat)とします。
結合エントロピー $H(X,Y)$ と条件付きエントロピー $H(X|Y)$
相互情報量を理解するために、まず2変数のエントロピーの拡張を押さえておきましょう。
結合エントロピー $H(X, Y)$
2つの離散確率変数 $X$ と $Y$ の同時分布(結合分布)$p(x, y)$ に対して、結合エントロピー(Joint Entropy) を次のように定義します。
$$ H(X, Y) = -\sum_{x}\sum_{y} p(x, y) \log p(x, y) $$
結合エントロピーは、$X$ と $Y$ を合わせた系全体の不確かさを表します。1変数のエントロピーを同時分布に素直に拡張した形になっています。
条件付きエントロピー $H(X|Y)$
$Y$ の値が分かったときに、$X$ に残る不確かさを表す量が条件付きエントロピー(Conditional Entropy) です。
$$ H(X|Y) = -\sum_{x}\sum_{y} p(x, y) \log p(x|y) $$
これは「$Y$ を観測した後に $X$ について残る平均的な不確かさ」を意味します。直感的には、$Y$ が $X$ について多くの情報をもっているほど $H(X|Y)$ は小さくなり、$Y$ が $X$ と無関係であれば $H(X|Y) = H(X)$ のままになります。
エントロピーの連鎖律
条件付きエントロピーと結合エントロピーの間には、次の等式(連鎖律)が成り立ちます。
$$ H(X, Y) = H(Y) + H(X|Y) = H(X) + H(Y|X) $$
この連鎖律を導出してみましょう。結合エントロピーの定義に $p(x, y) = p(x|y)\,p(y)$ を代入します。
$$ \begin{align} H(X, Y) &= -\sum_{x}\sum_{y} p(x, y) \log p(x, y) \\ &= -\sum_{x}\sum_{y} p(x, y) \log \bigl[p(x|y)\,p(y)\bigr] \\ &= -\sum_{x}\sum_{y} p(x, y) \log p(x|y) – \sum_{x}\sum_{y} p(x, y) \log p(y) \\ &= H(X|Y) – \sum_{y} p(y) \log p(y) \quad \left(\because \sum_{x} p(x, y) = p(y)\right) \\ &= H(X|Y) + H(Y) \end{align} $$
同様に $p(x, y) = p(y|x)\,p(x)$ を用いれば $H(X, Y) = H(X) + H(Y|X)$ も得られます。
相互情報量 $I(X; Y)$ の定義
いよいよ本題の相互情報量です。相互情報量(Mutual Information) $I(X; Y)$ は、2つの確率変数 $X$ と $Y$ が共有する情報量を定量化する量であり、次のように定義されます。
$$ \begin{equation} I(X; Y) = \sum_{x}\sum_{y} p(x, y) \log \frac{p(x, y)}{p(x)\,p(y)} \end{equation} $$
この定義式は、同時分布 $p(x, y)$ と、$X$ と $Y$ が独立であると仮定した場合の分布 $p(x)\,p(y)$ のずれを測っています。
KLダイバージェンスとの関係
定義式をよく見ると、これは同時分布 $p(x, y)$ と周辺分布の積 $p(x)\,p(y)$ とのKLダイバージェンスにほかならないことがわかります。
$$ I(X; Y) = D_{\mathrm{KL}}\bigl[p(x, y) \,\|\, p(x)\,p(y)\bigr] $$
KLダイバージェンスは2つの確率分布の「隔たり」を測る量でした。相互情報量は、「同時分布 $p(x,y)$ が、$X$ と $Y$ が独立であると仮定した分布 $p(x)\,p(y)$ からどれだけ離れているか」を測っているのです。
つまり、$X$ と $Y$ が独立であれば $p(x,y) = p(x)\,p(y)$ なので $I(X; Y) = 0$ となり、依存関係が強いほど $I(X; Y)$ の値は大きくなります。
エントロピーを使った表現
相互情報量はエントロピーを使って次のようにも表現できます。
$$ \begin{align} I(X; Y) &= H(X) – H(X|Y) \\ &= H(Y) – H(Y|X) \\ &= H(X) + H(Y) – H(X, Y) \end{align} $$
1つ目の等式 $I(X; Y) = H(X) – H(X|Y)$ を導出してみましょう。
$$ \begin{align} I(X; Y) &= \sum_{x}\sum_{y} p(x, y) \log \frac{p(x, y)}{p(x)\,p(y)} \\ &= \sum_{x}\sum_{y} p(x, y) \log \frac{p(x|y)}{p(x)} \quad \left(\because p(x, y) = p(x|y)\,p(y)\right) \\ &= \sum_{x}\sum_{y} p(x, y) \log p(x|y) – \sum_{x}\sum_{y} p(x, y) \log p(x) \\ &= -H(X|Y) – \sum_{x} p(x) \log p(x) \quad \left(\because \sum_{y} p(x, y) = p(x)\right) \\ &= -H(X|Y) + H(X) \\ &= H(X) – H(X|Y) \end{align} $$
この結果は「$X$ のもつ不確かさ $H(X)$ から、$Y$ を知った後に残る不確かさ $H(X|Y)$ を引いたもの」が相互情報量であるという、直感的にも明快な解釈を与えてくれます。
3つ目の等式 $I(X; Y) = H(X) + H(Y) – H(X, Y)$ は、連鎖律 $H(X, Y) = H(X) + H(Y|X)$ を用いれば簡単に確認できます。
$$ \begin{align} H(X) + H(Y) – H(X, Y) &= H(X) + H(Y) – H(X) – H(Y|X) \\ &= H(Y) – H(Y|X) \\ &= I(X; Y) \end{align} $$
ベン図的理解
相互情報量と各エントロピーの関係は、集合論のベン図を使うと非常にすっきり理解できます。
2つの円を $H(X)$ と $H(Y)$ として描き、その重なり部分が相互情報量 $I(X; Y)$ です。
H(X, Y)
┌─────────────────────┐
│ │
│ H(X|Y) I(X;Y) H(Y|X) │
│ ┌──────┼──────┐ │
│ │ │ │ │
│ │ X │ Y │ │
│ │ │ │ │
│ └──────┼──────┘ │
│ │
└─────────────────────┘
H(X) H(Y)
このベン図から読み取れる関係をまとめると、次のようになります。
$$ \begin{align} H(X) &= H(X|Y) + I(X; Y) \\ H(Y) &= H(Y|X) + I(X; Y) \\ H(X, Y) &= H(X|Y) + I(X; Y) + H(Y|X) \\ I(X; Y) &= H(X) + H(Y) – H(X, Y) \end{align} $$
最後の式は、$H(X)$ と $H(Y)$ を足すと重なり部分 $I(X; Y)$ を二重に数えてしまうので、$H(X, Y)$ を引いて調整している形です。これは集合論における包除原理 $|A \cup B| = |A| + |B| – |A \cap B|$ と同じ構造をしています。
また、$X$ と $Y$ が独立のとき、重なりがなくなるので $I(X; Y) = 0$ であり、$H(X, Y) = H(X) + H(Y)$ となることも図から直感的に読み取れます。
相互情報量の性質
相互情報量にはいくつかの重要な性質があります。順に確認していきましょう。
非負性
$$ I(X; Y) \geq 0 $$
これは $I(X;Y) = D_{\mathrm{KL}}[p(x,y) \| p(x)\,p(y)]$ という表現と、KLダイバージェンスの非負性(ギブスの不等式)から直ちに従います。
相互情報量が常に 0 以上であるということは、「$Y$ を観測して $X$ の情報が減ることは決してない」ことを意味しています。等号 $I(X; Y) = 0$ が成立するのは $p(x, y) = p(x)\,p(y)$ のとき、すなわち $X$ と $Y$ が独立であるときに限ります。
対称性
$$ I(X; Y) = I(Y; X) $$
定義式中の $\log \frac{p(x,y)}{p(x)\,p(y)}$ は $X$ と $Y$ に関して対称であるため、相互情報量は $X$ と $Y$ の役割を入れ替えても値が変わりません。
$$ \begin{align} I(X;Y) &= \sum_{x}\sum_{y} p(x,y) \log \frac{p(x,y)}{p(x)\,p(y)} \\ &= \sum_{y}\sum_{x} p(x,y) \log \frac{p(x,y)}{p(y)\,p(x)} = I(Y;X) \end{align} $$
これはKLダイバージェンス $D_{\mathrm{KL}}[p \| q] \neq D_{\mathrm{KL}}[q \| p]$ が一般に非対称であるのと対照的です。相互情報量が対称になるのは、同時分布 $p(x,y)$ と独立分布 $p(x)\,p(y)$ という特定の組み合わせの間のKLダイバージェンスだからです。
エントロピーによる表現からも対称性を確認できます。$I(X;Y) = H(X) – H(X|Y)$ と $I(Y;X) = H(Y) – H(Y|X)$ は一見異なりますが、どちらも $H(X) + H(Y) – H(X,Y)$ に等しいので、結局同じ値になります。
独立のとき $I = 0$
$X$ と $Y$ が独立、すなわち $p(x,y) = p(x)\,p(y)$ のとき、
$$ \begin{align} I(X;Y) &= \sum_{x}\sum_{y} p(x)\,p(y) \log \frac{p(x)\,p(y)}{p(x)\,p(y)} \\ &= \sum_{x}\sum_{y} p(x)\,p(y) \log 1 \\ &= 0 \end{align} $$
となります。また逆に、$I(X;Y) = 0$ ならば $D_{\mathrm{KL}}[p(x,y) \| p(x)\,p(y)] = 0$ であり、KLダイバージェンスがゼロとなるのは2つの分布が一致するときに限るので、$p(x,y) = p(x)\,p(y)$ が成り立ちます。
つまり、相互情報量がゼロであることと、2つの確率変数が独立であることは同値です。
エントロピーとの大小関係
相互情報量には次の上限が存在します。
$$ I(X; Y) \leq \min\bigl(H(X),\, H(Y)\bigr) $$
これは $I(X; Y) = H(X) – H(X|Y)$ であり、条件付きエントロピーの非負性 $H(X|Y) \geq 0$ から $I(X; Y) \leq H(X)$ が得られます。対称性より $I(X; Y) \leq H(Y)$ も成り立つので、両方の上界が得られます。
等号 $I(X;Y) = H(X)$ が成り立つのは $H(X|Y) = 0$ のとき、すなわち $Y$ を知れば $X$ が完全に確定する場合です。
連続確率変数の場合
ここまでは離散確率変数を扱いましたが、連続確率変数の場合も和を積分に置き換えることで同様に定義できます。
連続確率変数 $X$, $Y$ が同時確率密度関数 $f(x, y)$ と周辺密度 $f_X(x)$, $f_Y(y)$ をもつ場合、相互情報量は次のように定義されます。
$$ I(X; Y) = \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} f(x, y) \log \frac{f(x, y)}{f_X(x)\,f_Y(y)} \, dx \, dy $$
連続の場合も、KLダイバージェンスとの関係は同様です。
$$ I(X; Y) = D_{\mathrm{KL}}\bigl[f(x, y) \,\|\, f_X(x)\,f_Y(y)\bigr] $$
エントロピーとの関係式も離散の場合と同じ形が成り立ちます。
$$ I(X; Y) = h(X) + h(Y) – h(X, Y) $$
ここで $h(\cdot)$ は微分エントロピー(differential entropy)を表します。微分エントロピーは離散のエントロピーと異なり負の値をとりうることに注意が必要ですが、相互情報量は連続の場合でも常に非負です。これは相互情報量がKLダイバージェンスとして定義されるためです。
2次元正規分布の場合
連続変量の重要な具体例として、2次元正規分布を考えましょう。$(X, Y)$ が相関係数 $\rho$ をもつ2次元標準正規分布に従う場合、相互情報量は解析的に求まることが知られています。
$$ I(X; Y) = -\frac{1}{2}\log(1 – \rho^2) $$
この式の導出を示します。2次元標準正規分布では、各微分エントロピーは次のとおりです。
$$ h(X) = h(Y) = \frac{1}{2}\log(2\pi e) $$
$$ h(X, Y) = \frac{1}{2}\log\bigl[(2\pi e)^2(1 – \rho^2)\bigr] = \log(2\pi e) + \frac{1}{2}\log(1 – \rho^2) $$
よって、
$$ \begin{align} I(X; Y) &= h(X) + h(Y) – h(X, Y) \\ &= \frac{1}{2}\log(2\pi e) + \frac{1}{2}\log(2\pi e) – \log(2\pi e) – \frac{1}{2}\log(1 – \rho^2) \\ &= \log(2\pi e) – \log(2\pi e) – \frac{1}{2}\log(1 – \rho^2) \\ &= -\frac{1}{2}\log(1 – \rho^2) \end{align} $$
が得られます。この結果から、次のことが読み取れます。
- $\rho = 0$(独立)のとき $I(X; Y) = 0$
- $|\rho| \to 1$(完全な線形関係)のとき $I(X; Y) \to \infty$
- 正規分布では無相関と独立が同値であることと整合している
具体的な計算例
離散確率変数の例
次のような同時分布をもつ2つの確率変数 $X \in \{0, 1\}$, $Y \in \{0, 1\}$ を考えます。
| $Y = 0$ | $Y = 1$ | $p_X(x)$ | |
|---|---|---|---|
| $X = 0$ | $3/8$ | $1/8$ | $1/2$ |
| $X = 1$ | $1/8$ | $3/8$ | $1/2$ |
| $p_Y(y)$ | $1/2$ | $1/2$ | $1$ |
周辺分布はどちらも一様分布なので、$H(X) = H(Y) = \log 2 \approx 0.693$ nat です。
相互情報量を定義から計算します。
$$ \begin{align} I(X; Y) &= \sum_{x \in \{0,1\}}\sum_{y \in \{0,1\}} p(x, y) \log \frac{p(x, y)}{p_X(x)\,p_Y(y)} \\ &= \frac{3}{8}\log\frac{3/8}{1/4} + \frac{1}{8}\log\frac{1/8}{1/4} + \frac{1}{8}\log\frac{1/8}{1/4} + \frac{3}{8}\log\frac{3/8}{1/4} \\ &= \frac{3}{8}\log\frac{3}{2} + \frac{1}{8}\log\frac{1}{2} + \frac{1}{8}\log\frac{1}{2} + \frac{3}{8}\log\frac{3}{2} \\ &= \frac{3}{4}\log\frac{3}{2} + \frac{1}{4}\log\frac{1}{2} \\ &= \frac{3}{4}\log\frac{3}{2} – \frac{1}{4}\log 2 \\ &\approx 0.1363 \text{ nat} \end{align} $$
$I(X;Y) > 0$ なので $X$ と $Y$ は独立ではなく、正の依存関係があることがわかります。実際に同時分布表を見ると、$X$ と $Y$ が同じ値をとる確率 $3/8$ が、異なる値をとる確率 $1/8$ よりも大きいので、正の関連があることが読み取れます。
$H(X) + H(Y) – H(X,Y)$ でも検算してみましょう。
$$ \begin{align} H(X, Y) &= -\left(\frac{3}{8}\log\frac{3}{8} + \frac{1}{8}\log\frac{1}{8} + \frac{1}{8}\log\frac{1}{8} + \frac{3}{8}\log\frac{3}{8}\right) \\ &= -\frac{3}{4}\log\frac{3}{8} – \frac{1}{4}\log\frac{1}{8} \\ &\approx 1.2499 \text{ nat} \end{align} $$
$$ I(X;Y) = H(X) + H(Y) – H(X,Y) \approx 0.693 + 0.693 – 1.250 \approx 0.136 \text{ nat} $$
先ほどの計算結果と一致することが確認できました。
連続確率変数の例(2次元正規分布)
相関係数 $\rho = 0.8$ の2次元標準正規分布における相互情報量を求めてみましょう。
$$ I(X; Y) = -\frac{1}{2}\log(1 – 0.8^2) = -\frac{1}{2}\log(1 – 0.64) = -\frac{1}{2}\log(0.36) \approx 0.5108 \text{ nat} $$
$\rho = 0.8$ は「かなり強い正の相関」に相当し、相互情報量も比較的大きな値になっています。
Pythonでの実装
離散データで相互情報量をスクラッチ計算
まず、定義に基づいて同時分布表から相互情報量を計算する関数を実装してみましょう。
import numpy as np
def mutual_information(joint_prob):
"""
同時確率分布(2次元配列)から相互情報量を計算する。
joint_prob[i, j] = p(X=i, Y=j)
"""
# 周辺分布を計算
p_x = joint_prob.sum(axis=1) # X の周辺分布
p_y = joint_prob.sum(axis=0) # Y の周辺分布
mi = 0.0
for i in range(joint_prob.shape[0]):
for j in range(joint_prob.shape[1]):
if joint_prob[i, j] > 0:
mi += joint_prob[i, j] * np.log(
joint_prob[i, j] / (p_x[i] * p_y[j])
)
return mi
# 先ほどの計算例で検証
joint_prob = np.array([
[3/8, 1/8],
[1/8, 3/8]
])
mi = mutual_information(joint_prob)
print(f"相互情報量 I(X; Y) = {mi:.4f} nat")
print(f"相互情報量 I(X; Y) = {mi / np.log(2):.4f} bit")
# 各エントロピーも計算して検算
p_x = joint_prob.sum(axis=1)
p_y = joint_prob.sum(axis=0)
H_X = -np.sum(p_x * np.log(p_x))
H_Y = -np.sum(p_y * np.log(p_y))
H_XY = -np.sum(joint_prob * np.log(joint_prob))
print(f"\nH(X) = {H_X:.4f}")
print(f"H(Y) = {H_Y:.4f}")
print(f"H(X,Y) = {H_XY:.4f}")
print(f"H(X) + H(Y) - H(X,Y) = {H_X + H_Y - H_XY:.4f}")
実行すると次のような出力が得られます。
相互情報量 I(X; Y) = 0.1363 nat
相互情報量 I(X; Y) = 0.1966 bit
H(X) = 0.6931
H(Y) = 0.6931
H(X,Y) = 1.2499
H(X) + H(Y) - H(X,Y) = 0.1363
手計算で求めた値と一致することが確認できます。
scikit-learn による相互情報量の計算
実務ではカテゴリデータのラベル列から相互情報量を計算したい場面が多くあります。scikit-learn の mutual_info_score を使うと、離散ラベル列から簡単に計算できます。
import numpy as np
from sklearn.metrics import mutual_info_score
# 依存関係のあるサンプルデータを生成
rng = np.random.default_rng(42)
n = 10000
# X を生成(0 または 1 の等確率)
x = rng.integers(0, 2, size=n)
# Y は 75% の確率で X と同じ値をとる
noise = rng.random(n)
y = np.where(noise < 0.75, x, 1 - x)
# scikit-learn で相互情報量を計算
mi_score = mutual_info_score(x, y)
print(f"推定された相互情報量: {mi_score:.4f} nat")
# 理論値と比較
# p(X=Y) = 0.75, p(X!=Y) = 0.25 なので
# 同時分布: p(0,0)=p(1,1)=0.375, p(0,1)=p(1,0)=0.125
joint_theory = np.array([[0.375, 0.125], [0.125, 0.375]])
mi_theory = mutual_information(joint_theory)
print(f"理論的な相互情報量: {mi_theory:.4f} nat")
mutual_info_score は分割表(contingency table)を内部で構築し、経験的な同時分布から相互情報量を計算します。サンプル数を大きくすれば、理論値に収束していくことが確認できます。
2次元正規分布の可視化
相関係数 $\rho$ と相互情報量の関係をプロットしてみましょう。
import numpy as np
import matplotlib.pyplot as plt
# 相関係数の範囲
rho = np.linspace(-0.99, 0.99, 500)
# 2次元正規分布の相互情報量
mi = -0.5 * np.log(1 - rho**2)
# 可視化
plt.figure(figsize=(8, 5))
plt.plot(rho, mi, linewidth=2, color="steelblue")
plt.xlabel(r"Correlation coefficient $\rho$", fontsize=13)
plt.ylabel(r"Mutual information $I(X; Y)$ [nat]", fontsize=13)
plt.title("Mutual Information of Bivariate Normal Distribution", fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color="gray", linestyle="--", alpha=0.5)
plt.axvline(x=0, color="gray", linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()
このプロットからは、$\rho = 0$ で相互情報量が 0 となり、$|\rho|$ が 1 に近づくにつれて相互情報量が急激に増大する様子が確認できます。グラフは $\rho$ に関して左右対称であり、相互情報量が相関の符号(正・負)によらないことも視覚的に理解できます。
まとめ
本記事では、相互情報量の定義・性質・計算方法について解説しました。
- 相互情報量 $I(X; Y)$ は、同時分布 $p(x,y)$ と独立分布 $p(x)\,p(y)$ の KLダイバージェンスとして定義され、2変数間の統計的依存関係の強さを測る
- エントロピーとの関係式 $I(X; Y) = H(X) – H(X|Y) = H(X) + H(Y) – H(X, Y)$ が成り立ち、ベン図で直感的に理解できる
- 相互情報量は非負かつ対称であり、$I(X; Y) = 0$ と $X$, $Y$ の独立性は同値である
- 連続確率変数にも拡張でき、2次元正規分布では $I(X; Y) = -\frac{1}{2}\log(1 – \rho^2)$ と解析的に求まる
- scikit-learn の
mutual_info_scoreを使えば、離散データの相互情報量を手軽に計算できる
次のステップとして、以下の記事も参考にしてください。