エントロピーとは
エントロピーとは確率分布の「乱雑さ」を示す指標になります。
確率分布\(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にあげました