Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么均匀分布的熵低于R中的重复值?_R_Entropy - Fatal编程技术网

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

为什么均匀分布的熵低于R中的重复值?,r,entropy,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=10的

根据维基百科,均匀分布是最大熵概率分布。因此,如果我有两个序列,一个是均匀分布的,一个是重复值的,长度都是k,那么我期望均匀分布序列的熵比重复值序列的熵高。但是,在R中运行以下代码时,观察不到这一点:

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

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

我想你误解了熵中的第一个参数y代表什么。如?熵中所述,它给出了一个计数向量。这些计数一起给出了每个符号的相对频率,这些符号构成了这个离散信息源上的消息

为了了解结果,请看一个更简单的示例,即仅包含两个符号1/0、开/关、a/B的二进制信息源。在这种情况下,以下所有条件将给出两个符号的相对频率相同的源的熵,即一半符号为As,一半符号为Bs:

因为这些都是指相同的基本分布,其中概率在可用符号之间最大程度地分布,所以它们各自给出了两状态信息源log2=0.6931472的最高可能熵

如果改为entropyrunif2,则提供了从均匀分布中随机选择的两个符号的相对概率。除非这两个随机选择的数字完全相等,否则你就是在告诉熵,你有一个信息源,它有两个不同频率的符号。因此,计算得到的熵总是低于log2。这里有一个简单的例子来说明我的意思:

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,如entropyrep1,1024中所示,您描述的信息源是均匀分布的离散模拟。从长远来看,或者在一条很长的消息中,它的1024个字母中的每一个都会以相同的频率出现,而且你不能得到比这更一致的结果

我想这可能是因为实施的原因。如果使用MM方法,则行为与预期相同,但重复值的熵取决于这些值,不应如此。ML方法正确地处理了这个问题。编辑:交叉验证可能是一个更好的地方。我不知道是不是,直到你提出。如果是实现,那么试着看看getAnywhereentropy.emerical,getAnywhereentropy.MillerMadow和getAnywhereentropy.plugin.Thank。我已经看过了源代码,但我不确定它为什么会这样。总之,它获取数据,使用freqs函数将其存储,然后对其应用log函数。感谢您的帮助。我想做的是测量数组的熵。数组中的每个元素都包含一个数字,该数字对应于该元素在内存中被访问的次数(用于安全研究)。为了正确测量熵,我需要先在该数组上应用freqs函数吗?@AlphaBravo抱歉,我无法帮助您,也无法就如何将熵计算应用于您的特定应用程序提供任何有用的建议。由于freqs.empirical会对传递给它的任何数据进行标准化,使它们的频率总和为1,所以无论是传递原始计数还是已经标准化的数据,都没有区别。
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))