情報理論でとてもよく出てくる情報エントロピー。計算するにはどうすれば良いのだろう?
選択肢1:定義どおり作る
定義はとても簡単です。注意するべきことは、入力に0が来たときのパターンを想定しないで作るとmath domain errorが出る(は定義できないからね・・・)。
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にならないケース)正規化してくれたり、カルバック・ライブラー情報量が計算できるオプションがあったり色々素敵なのだが、デフォルトではの底が
だったりする。ちゃんとbaseを指定してあげよう。
from scipy.stats import entropy print(entropy([0.5, 0.5], base=2)) # 1.0