【統計,Python】エントロピーとは【メモ】

エントロピーとは

エントロピーとは確率分布の「乱雑さ」を示す指標になります。

確率分布\(p(X)\)エントロピー\(H(p(X))\)は以下のように定義されます。

\begin{aligned}
H(p(X)) = - \sum_{x \in X} p(x) \log p(x)
\end{aligned}

エントロピーは情報量(\( -\log p(x)\))の平均値なので平均情報量と呼ばれたりもします。

具体例

では、簡単な2値\(( x_0, x_1 )\)の確率分布でエントロピーがどうなるか見てみます。

例えば、確率分布が\(p(x_0)=0.5, p(x_1)=0.5 \)のような平等にでる(乱雑な)時にはエントロピーは0.693(小数点第4位以下は切り捨て)になります。

逆に確率分布が\(p(x_0)=0.1, p(x_1)=0.9 \)のような\(x_1\)のほうが頻繁に出るような時にはエントロピーは0.325(小数点第4位以下は切り捨て)のように先ほどと比べて小さくなります。

Pythonで計算してみる

これぐらいなら自分で実装しても良いのですが、scipyというライブラリにエントロピーを計算してくれるentropyメソッドがあるので使ってみます。

先程の例をPythonで

from scipy.stats import entropy

p_list = [0.5, 0.5]
print(f"{p_list}  entory:{entropy(p_list)}"
#=> [0.5, 0.5]  entory:0.6931471805599453


p_list = [0.1, 0.9]
print(f"{p_list}  entory:{entropy(p_list)}")
#=> [0.1, 0.9]  entory:0.3250829733914482

次に\(p(x_0)\)と\(p(x_1)\)を少しずつ変えていったエントロピーを計算してみます。

import matplotlib.pyplot as plt
entropy_list, p_list = [], []

p = 0.1
for _ in range(9):
    entropy = compute_entropy([p,(1-p)])
    entropy_list.append(entropy)
    p_list.append(p)
    p += 0.1

plt.plot(p_list, entropy_list)
plt.ylabel("entropy")
plt.xlabel("$p(x_0)$")

綺麗に上に凸のグラフになりました。

全ソースコードはGitHubにあげました

タイトルとURLをコピーしました