为什么均匀分布的熵低于 R 中的重复值?

Why is the entropy of a uniform distribution lower than repeated values in R?

根据维基百科,均匀分布是 "maximum entropy probability distribution"。因此,如果我有两个长度为 k 的序列(一个均匀分布,一个具有重复值),那么我会期望均匀分布序列的熵高于重复值序列。但是,这不是 运行 R 中的以下代码时观察到的情况:

require(entropy)
entropy(runif(1024), method="ML", unit="log2")
entropy(rep(1,1024), method="ML", unit="log2")

第一个输出产生大约 9.7 位的熵,而第二个输出恰好产生 10 位的熵(1024 的以 2 为底的对数 = 10)。为什么均匀分布的熵不会超过10位?

我认为您误解了 entropy() 中的第一个参数 y 表示的内容。正如 ?entropy 中提到的,它给出了一个计数向量。这些计数共同给出了组成此 "discrete source of information" 上的消息的每个符号的相对频率。

要了解结果如何,请看一个更简单的示例,即只有两个符号的二进制信息源(1/0、on/off、A/B,你有什么).在这种情况下,以下所有内容将给出两个符号的相对频率相同的源的熵(即一半符号是 As,一半是 Bs):

entropy(c(0.5, 0.5))
# [1] 0.6931472
entropy(c(1,1))
# [1] 0.6931472
entropy(c(1000,1000))
# [1] 0.6931472
entropy(c(0.0004, 0.0004))  
# [1] 0.6931472
entropy(rep(1,2))
# [1] 0.6931472

因为它们都指的是相同的基础分布,其中概率在可用符号中最大程度地分布,所以它们每个都为双状态信息源 (log(2) = 0.6931472)) 提供最高可能的熵。

当您改为 entropy(runif(2)) 时,您为从均匀分布中随机选择的两个符号提供相对概率。除非这两个随机选择的数字完全相等,否则您是在告诉 entropy() 您有一个信息源,其中包含两个使用频率不同的符号。因此,您将始终获得低于 log(2) 的计算熵。这是一个简单的例子来说明我的意思:

set.seed(4)
(x <- runif(2))
# [1] 0.585800305 0.008945796
freqs.empirical(x)  ## Helper function called by `entropy()` via `entropy.empirical()`
# [1] 0.98495863 0.01504137

## Low entropy, as you should expect 
entropy(x)
# [1] 0.07805556

## Essentially the same thing; you can interpret this as the expected entropy
## of a source from which a message with 984 '0's and 15 '1's has been observed
entropy(c(984, 15))

总之,通过向 y= 参数传递一长串 1s,如 entropy(rep(1, 1024)),您描述的信息源是 a均匀分布的离散模拟。在长 运行 或非常长的消息中,预计其 1024 个字母中的每一个字母都以相同的频率出现,没有比这更统一的了!