エントロピー
$ E = -\sum_{i=1}^{n} p_i \log_2 p_i
定義ではlogの底は2の筈だが、log2ではなくlogを使うとscipyのentropyと値が一致する、調査中。
確率0の場合 log2(0) = -inftyとなるので、ここでは 0 log(0) = 0 で対処している。
code:p.py
import numpy as np
import scipy as sp
def entropy(p_list):
p_log = np.zeros_like(p_list)
for i, p in enumerate(p_list):
if p == 0:
p_logi = 0
else:
p_logi = p*np.log(p)
# p_logi = p*np.log2(p)
print(p_log)
return - (p_log).sum()
p = np.array(1/6, 1/3, 1/2)
print(entropy(p), p, sp.stats.entropy(p))
p = np.array(1, 0, 0)
print(entropy(p), p, sp.stats.entropy(p))
p = np.array(7/10, 2/10, 1/10)
print(entropy(p), p, sp.stats.entropy(p))
p = np.array(1/3, 1/3, 1/3, 0,0,0)
print(entropy(p), p, sp.stats.entropy(p))
p = np.array(1/5, 1/5, 1/5, 1/5, 1/5)
print(entropy(p), p, sp.stats.entropy(p))