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

时间:2016-07-07 14:59:13

标签: r entropy

根据维基百科,均匀分布是最大熵概率分布"。因此,如果我有两个序列(一个均匀分布且一个具有重复值),两个长度为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位熵?

1 个答案:

答案 0 :(得分:3)

我认为你误解了y中代表的第一个参数entropy()。如?entropy中所述,它提供了一个计数向量。这些计数一起给出了每个符号的相对频率,从这些符号中可以得到这些信息的离散信息来源。是组成的。

要了解它是如何发挥作用的,请看一个简单的例子,一个只有两个符号的二进制信息源(1/0,开/关,A / B,你有什么)。在这种情况下,以下所有内容将给出两个符号的相对频率相同的源的熵(即,一半符号为A s,一半为B s):

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=参数传递给1的长字符串,就像在entropy(rep(1, 1024))中一样,您正在描述一个的独立模拟信息源。均匀分布。从长远来看或者在很长的消息中,预计其1024个字母中的每个字母都会以相同的频率发生,并且你不能比这更加统一!