Eu implementei a seguinte função para calcular a entropia:
from math import log
def calc_entropy(probs):
my_sum = 0
for p in probs:
if p > 0:
my_sum += p * log(p, 2)
return - my_sum
Resultado:
>>> calc_entropy([1/7.0, 1/7.0, 5/7.0])
1.1488348542809168
>>> from scipy.stats import entropy # using a built-in package
# give the same answer
>>> entropy([1/7.0, 1/7.0, 5/7.0], base=2)
1.1488348542809166
Meu entendimento era que a entropia está entre 0 e 1, 0 significa muito certo e 1 significa muito incerto. Por que obtenho uma medida de entropia maior que 1?
Sei que se aumentar o tamanho da base de log, a medida de entropia será menor, mas pensei que a base 2 fosse padrão, então não acho que esse seja o problema.
Eu devo estar perdendo algo óbvio, mas o que?
mathematical-statistics
python
entropy
Akavall
fonte
fonte
Respostas:
Entropia não é o mesmo que probabilidade .
A entropia mede a "informação" ou "incerteza" de uma variável aleatória. Quando você está usando a base 2, ela é medida em bits; e pode haver mais de um bit de informação em uma variável.
Neste exemplo, um exemplo "contém" cerca de 1,15 bits de informação. Em outras palavras, se você pudesse compactar perfeitamente uma série de amostras, precisaria em média de muitos bits por amostra.
fonte
O valor máximo da entropia é , em que é o número de categorias que você está usando. Seu valor numérico dependerá naturalmente da base de logaritmos que você está usando.klogk k
Usando logaritmos de base 2 como exemplo, como na pergunta: é e é , portanto, um resultado maior que é definitivamente errado se o número de categorias for ou . Um valor maior que estará errado se exceder .0 log 2 2 1 1 1 2 1 log 2 klog21 0 log22 1 1 1 2 1 log2k
Em vista disso, é bastante comum escalar entropia por , para que os resultados caiam entre e ,0 1logk 0 1
fonte
Tente isto (observe a base ):e
Dando:
fonte