我想你是误解什么第一个参数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个字母中的每一个预计会以相同的频率出现,并且你不能得到比这更统一的信息!
我认为这可能是因为实施。如果使用“MM”方法,除了重复值的熵取决于这些值之外,其行为与预期相同,但不应该如此。 “ML”方法正确处理了这一点。 编辑:交叉验证可能是一个更好的地方反正。直到你提出这个建议,我才知道它。 –
如果是实现,则尝试查看'getAnywhere(“entropy.empirical”)''''getAnywhere(“entropy.MillerMadow”)'和'getAnywhere(“entropy.plugin”)'。 – Laterow
谢谢。我查看了源代码,但我不确定为什么它的行为如此。总之,它取得数据,将其与freqs函数一起分类,然后将日志函数应用于它。 –