为什么均匀分布的熵低于 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,你有什么).在这种情况下,以下所有内容将给出两个符号的相对频率相同的源的熵(即一半符号是 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
s,如 entropy(rep(1, 1024))
,您描述的信息源是 a均匀分布的离散模拟。在长 运行 或非常长的消息中,预计其 1024 个字母中的每一个字母都以相同的频率出现,没有比这更统一的了!
根据维基百科,均匀分布是 "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,你有什么).在这种情况下,以下所有内容将给出两个符号的相对频率相同的源的熵(即一半符号是 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
s,如 entropy(rep(1, 1024))
,您描述的信息源是 a均匀分布的离散模拟。在长 运行 或非常长的消息中,预计其 1024 个字母中的每一个字母都以相同的频率出现,没有比这更统一的了!