静かなる名辞

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.0.0 Reference Guide

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

from scipy.stats import entropy

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