Mutual Information

このページでは,相互情報量 (mutual information) の計算関数mutualについて説明します.

相互情報量

2変数に対する相互情報量

\[ I(X:Y) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} p(x, y) \ln \frac{p(x, y)}{p(x)p(y)} \ \mathrm{d}x \mathrm{d}y\]

です.

ヒストグラムを使った計算例

以下は,ヒストグラム推定を使った計算例です.

using InformationTheory

# 正規分布に基づくランダムデータを生成
x = randn(10000)
y = randn(10000)

# ヒストグラム推定を使うことを指定
est = MutualInformation.Hist()

# 相互情報量の推定
mi = mutual(est, x, y)

# 結果の出力
println(mi)

ヒストグラムを使用する際には,binsを指定できます.

est = MutualInformation.Hist(bins = (-5:0.25:5, -5:0.25:5))

k-近傍法を使った計算例

k-近傍法は,Kraskov et. al.(2004)が提案した手法に基づいて計算されます. 論文中では$I^{(1)}$$I^{(2)}$が提案されていますが,ここでは$I^{(1)}$の方法を採用して,

\[ I(X:Y) = \psi(k) + \psi(N)- \langle \psi(n_x + 1) + \psi(n_y + 1) \rangle\]

で計算します. $\psi$はディガンマ関数で,$N$はデータ数です. $n_x$$n_y$は,各点の最近傍距離$\epsilon_k$内に存在する点の数を表します. この距離は,NearestNeighbors.jlのkd木を使用して高速に推定されます. 距離推定には論文で提示されている通り,Chebyshev距離を用いています.

using InformationTheory

# 正規分布に基づくランダムデータを生成
x = randn(10000)
y = randn(10000)

# KSG推定を使うことを指定
est = MutualInformation.KSG()

# 相互情報量の推定
mi = mutual(est, x, y)

# 結果の出力
println(mi)

k-近傍法では,kを指定できます.

est = MutualInformation.KSG(k = 10)

高次元の相互情報量

より高次元の相互情報量

\[ I([X_1, X_2, \dots] : [Y_1, Y_2, \dots])\]

についても推定可能です.

ヒストグラムを使った計算例

ここでは,$I([X_1, X_2]:[Y_1,Y_2])$を推定する例を示します.

using InformationTheory

# 正規分布に基づくランダムデータを生成
x1 = randn(10000)
x2 = randn(10000)
y1 = randn(10000)
y2 = randn(10000)

# ヒストグラム推定を使うことを指定
est = MutualInformation.Hist()

# 相互情報量の推定
mi = mutual(est, (x1, x2), (y1, y2))

# 結果の出力
println(mi)

k-近傍法を使った計算例

using InformationTheory

# 正規分布に基づくランダムデータを生成
x1 = randn(10000)
x2 = randn(10000)
y1 = randn(10000)
y2 = randn(10000)

# KSG推定を使うことを指定
est = MutualInformation.KSG()

# 相互情報量の推定
mi = mutual(est, (x1, x2), (y1, y2))

# 結果の出力
println(mi)

次元の数には制限ありませんが,高次元になるほど推定精度は下がり,推定時間も伸びます.

参考文献

  • Kraskov A., Stögbauer H., Grassberger P., Estimating mutual information, Phys. Rev. E, Vol. 69 (2004), p. 066138.