estimation of entropy of Gaussian

連続型確率変数のエントロピーの計算法を調べてもなかなか良いのが出てこなかったので苦労した。 というわけで、それに関連するポスト。

確率変数Xのエントロピーは次式で定義される。

\displaystyle  h(X) = - \int^{\infty}_{-\infty} p(x)\log p(x) dx

今回の実験では、求めるエントロピーの真の値がわかっている必要があるので1変数正規分布を利用する。 1変数正規分布N(\mu, \sigma^2)に従う連続型確率変数のエントロピーは次式で求められる。

\displaystyle  ln\left(\sigma\sqrt{2\pi e}\right)

今回は標準正規分布N(0, 1)を用いる。 なおこの設定では当たり前だが、確率密度関数は既知だとする。

確率密度関数が既知なので、それに従う乱数をn個生成し、その確率密度を計算すると、n個の確率密度によるサンプル\{p(x_1), \ldots, p(x_n)\}を作ることができる。 つまりエントロピーを以下のようにサンプル近似する。

\displaystyle  \hat{h}(X) := - \frac{1}{n} \sum^n_{i=1} \log p(x)

実行結果は以下のようになった。

file://c:/Users/Hiroyuki/Dropbox/nkt1546789.github.io/python_ml/estimation_of_MI.png

ここから、サンプル数を増やしていけば、真の値に近づいていく、つまり、

\displaystyle  \hat{h}(x) \rightarrow h(x) \ (n \rightarrow \infty)

が言える。

結論として、エントロピーはサンプル近似することができるということがわかった。 ただし、ここで疑問がある。 通常は、サンプル\{x_1, \ldots, x_n\}のみが与えられていて、確率密度関数は未知である。 そこで、確率密度関数を推定して、\hat{p}(x)が得られたとする。 次は確率密度のサンプルを生成したいわけだが、これは可能なのだろうか。 すなわち任意の関数に従う乱数を生成することは可能なのだろうか。 これが疑問で仕方ないので、また調べる。

なお、使ったコードは以下である。

# coding: utf-8
import numpy as np
import pylab as pl
from scipy import stats

th = np.log(np.sqrt(2*np.pi*np.e))
print "theoritical:", th
ns = np.logspace(1, 6, 100)
hs = [np.sum(-np.log(stats.norm.pdf(stats.norm.rvs(0, 1, n))))/n for n in ns]
ths = np.repeat(th, 100)
pl.semilogx(ns, hs)
pl.semilogx(ns, ths, c="r")
pl.title("estimation of entropy of Gaussian N(0, 1)")
pl.xlabel("$n$")
pl.ylabel(r"$\hat{H}(X)$")
pl.show()

estimation of entropy of Gaussian」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中