静かなる名辞

pythonとプログラミングのこと


【python】pythonで情報エントロピーの計算

 情報理論でとてもよく出てくる情報エントロピー。計算するにはどうすれば良いのだろう?

選択肢1:定義どおり作る

 定義はとても簡単です。注意するべきことは、入力に0が来たときのパターンを想定しないで作るとmath domain errorが出る(\log_20は定義できないからね・・・)。

from math import log2

def H(lst):
    return -sum([x*log2(x) if x != 0 else 0 for x in lst])

print(H([0.5, 0.5])) # 1.0

選択肢2:scipyを使う

 scipyにそのものずばりのentropyという関数がある。

scipy.stats.entropy — SciPy v1.1.0 Reference Guide

 確率として渡してあげなくても(ぜんぶ足して1にならないケース)正規化してくれたり、カルバック・ライブラー情報量が計算できるオプションがあったり色々素敵なのだが、デフォルトでは\logの底がeだったりする。ちゃんとbaseを指定してあげよう。

from scipy.stats import entropy

print(entropy([0.5, 0.5], base=2)) # 1.0