为什么我得到的信息熵大于 1?

机器算法验证 数理统计 Python
2022-01-25 07:00:21

我实现了以下函数来计算熵:

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

结果:

>>> 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

我的理解是熵介于 0 和 1 之间,0 表示非常确定,1 表示非常不确定。为什么我得到大于 1 的熵度量?

我知道如果我增加对数基数的大小,熵度量会更小,但我认为基数 2 是标准的,所以我认为这不是问题。

我一定遗漏了一些明显的东西,但是什么?

3个回答

等于概率_

熵衡量随机变量的“信息”或“不确定性”。当您使用基数 2 时,它以位为单位;并且变量中可以有不止一位信息。

在此示例中,一个样本“包含”大约 1.15 位信息。换句话说,如果您能够完美地压缩一系列样本,则平均每个样本需要那么多位。

熵的最大值是logk, 在哪里k是您正在使用的类别数。它的数值自然取决于您使用的对数的底数。

以 2 为底的对数为例,如问题所示:log210log221, 所以结果大于1如果类别数是肯定是错误的1或者2. 一个大于1超过就会出错log2k.

鉴于此,通过以下方式缩放熵是相当普遍的logk,因此结果确实介于01,

较早的答案,特别是:“熵与概率不同。” 和“熵的最大值是 log 𝑘”都是正确的。

如前所述,“熵衡量随机变量的“信息”或“不确定性”。信息可以用比特来衡量,这样做时应该使用 log2。但是,如果使用不同的信息单元,则信息量会发生变化,因为该单元可以编码更多信息。例如,1 位可以编码两个事件 0,1,而 1 个禁令可以编码 10 个不同的事件,因此 1 禁令 = 3.322 位(3 位 = 8 个事件)。

总之,只要在比较中使用相同的熵单位,使用 0-1 和 >1 之间的熵值实际上并没有什么不同。但是,对于某些应用程序(交叉熵损失),使用 0 到 1 之间的值可能更方便。