块中符号非等概率出现的香农熵
Shannon's entropy for non-equiprobable occurence of symbols in a block
我正在尝试理解香农熵的概念并决定代码长度。在第一种情况下,b
是一个包含 5 个符号的数组。通常,b
中可以有 1 到 8 之间的任何整数值。为此,Shanneon 的熵 = NaN。
clear all
b = [1,3,2,6,1];
p_1 = sum(b==1)/length(b);
p_2 = sum(b==2)/length(b);
p_3 = sum(b==3)/length(b);
p_4 = sum(b==4)/length(b);
p_5 = sum(b==5)/length(b);
p_6 = sum(b==6)/length(b);
p_7 = sum(b==7)/length(b);
p_8 = sum(b==8)/length(b);
ShEntropy = -p_1 * log2(p_1) - (p_2) * log2(p_2) - p_3 * log2(p_3) -p_4 * log2(p_4) -p_5 * log2(p_5) -p_6 * log2(p_6)...
-p_7 * log2(p_7) -p_8 * log2(p_8)
%codelength
L = max(- log2(p_1), -log2(p_2), -log2(p_3), -log2(p_4), -log2(p_5), -log2(p_6), -log2(p_7), -log2(p_8))
更新:
附件是一个图表的屏幕截图,它允许确定从固定的遍历源生成的相关序列的字长 L
。
(pubmedcentralcanada.ca/pmcc/articles/PMC4736934/bin/rsos150527supp1.pdf) 他们在其中显示了字长的计算。在图中,由于最大熵在L=8时达到,所以字长为8.
**问题** : Eq(2)中的公式是香农熵率,与通常的iid源公式不同。我不明白分子中的 N_2L
是什么?在原始问题中(更新前)数组 b
的长度为 N =5
。所以,熵的值是一个标量。但是在Eq(2)中,我无法理解如何实现它,因为本文中的Shannons熵是基于$N$和2L
对于由唯一符号 k
组成的任何序列(对于我的情况 k=8
),如何实现 Eq(2)?
我的理解是,如果 length(b) = N
例如。 N = 20
,然后我将 Eq(2) 计算为 S_T 对于 L = 1
,S_T 对于 L=2
等等,直到 S_T 对于 N=20
.然而,我的困惑出现了,因为熵是根据唯一符号的数量计算的,在二进制的情况下是 k=2
.
你做错的是p log(p)的极限p->0为0。因此,你只能将p>0计算为p*log(p)。对于 p=0,这将是 0*inf,即 NaN,但它应该为零。
这种类型的东西会有所帮助:
entropy = @(p) -sum( p(p>0) .* log2(p(p>0)) );
希望对您有所帮助。
edit:试图对您的评论做出澄清:上面的公式计算了发出 N
符号的源的熵,比如 s1, ..., sN 有概率看到 n-th 符号 sn 是 pn。
如果你有一个发射二进制的源,那么你只有两个符号,比如说,-1 和 +1,概率为 p 和 1-p,这个源的熵是 -p*log(p) - (1-p)*log(1-p)
。故事结束。
然而,如果我们分别对待每个符号,这只是源的熵。这可能是因为源发出的代码字由许多相邻的符号组成,并且源的真实结构只有在我们查看组成代码字的序列时才会显示出来,比如 L
个符号。例如,在自然语言中,如果您仅将文本视为字母的出现,您会发现很少的结构(e 会比 x 更频繁,但仅此而已),结构的真实性质在只有当您一起查看符号序列时,语言才会变得明显,例如,sc 后面可能跟着 h,甚至更长的结构,如单词和单词序列。
为了反映这一点,我们可以查看由 L
个连续符号形成的码字的熵。如果您的源是二进制的,则有 N=2^L
个可能的长度为 L
的词(例如,对于 L=2
,有四个代码字(00、01、10、11),对于 L=3
有八个,依此类推)。每个词都可以关联一个概率,同理计算熵,HL = -sum(p(p>0).*log2(p(p>0)))
.
如果您无法从分析上知道概率,您可以通过观察一个长样本并计算每个 N=2^L
代码字出现的频率来尝试以数字方式获得它。 L
越长越难,因为码字的数量增长非常快。
我正在尝试理解香农熵的概念并决定代码长度。在第一种情况下,b
是一个包含 5 个符号的数组。通常,b
中可以有 1 到 8 之间的任何整数值。为此,Shanneon 的熵 = NaN。
clear all
b = [1,3,2,6,1];
p_1 = sum(b==1)/length(b);
p_2 = sum(b==2)/length(b);
p_3 = sum(b==3)/length(b);
p_4 = sum(b==4)/length(b);
p_5 = sum(b==5)/length(b);
p_6 = sum(b==6)/length(b);
p_7 = sum(b==7)/length(b);
p_8 = sum(b==8)/length(b);
ShEntropy = -p_1 * log2(p_1) - (p_2) * log2(p_2) - p_3 * log2(p_3) -p_4 * log2(p_4) -p_5 * log2(p_5) -p_6 * log2(p_6)...
-p_7 * log2(p_7) -p_8 * log2(p_8)
%codelength
L = max(- log2(p_1), -log2(p_2), -log2(p_3), -log2(p_4), -log2(p_5), -log2(p_6), -log2(p_7), -log2(p_8))
更新:
附件是一个图表的屏幕截图,它允许确定从固定的遍历源生成的相关序列的字长 L
。
(pubmedcentralcanada.ca/pmcc/articles/PMC4736934/bin/rsos150527supp1.pdf) 他们在其中显示了字长的计算。在图中,由于最大熵在L=8时达到,所以字长为8.
**问题** : Eq(2)中的公式是香农熵率,与通常的iid源公式不同。我不明白分子中的 N_2L
是什么?在原始问题中(更新前)数组 b
的长度为 N =5
。所以,熵的值是一个标量。但是在Eq(2)中,我无法理解如何实现它,因为本文中的Shannons熵是基于$N$和2L
对于由唯一符号 k
组成的任何序列(对于我的情况 k=8
),如何实现 Eq(2)?
我的理解是,如果 length(b) = N
例如。 N = 20
,然后我将 Eq(2) 计算为 S_T 对于 L = 1
,S_T 对于 L=2
等等,直到 S_T 对于 N=20
.然而,我的困惑出现了,因为熵是根据唯一符号的数量计算的,在二进制的情况下是 k=2
.
你做错的是p log(p)的极限p->0为0。因此,你只能将p>0计算为p*log(p)。对于 p=0,这将是 0*inf,即 NaN,但它应该为零。
这种类型的东西会有所帮助:
entropy = @(p) -sum( p(p>0) .* log2(p(p>0)) );
希望对您有所帮助。
edit:试图对您的评论做出澄清:上面的公式计算了发出 N
符号的源的熵,比如 s1, ..., sN 有概率看到 n-th 符号 sn 是 pn。
如果你有一个发射二进制的源,那么你只有两个符号,比如说,-1 和 +1,概率为 p 和 1-p,这个源的熵是 -p*log(p) - (1-p)*log(1-p)
。故事结束。
然而,如果我们分别对待每个符号,这只是源的熵。这可能是因为源发出的代码字由许多相邻的符号组成,并且源的真实结构只有在我们查看组成代码字的序列时才会显示出来,比如 L
个符号。例如,在自然语言中,如果您仅将文本视为字母的出现,您会发现很少的结构(e 会比 x 更频繁,但仅此而已),结构的真实性质在只有当您一起查看符号序列时,语言才会变得明显,例如,sc 后面可能跟着 h,甚至更长的结构,如单词和单词序列。
为了反映这一点,我们可以查看由 L
个连续符号形成的码字的熵。如果您的源是二进制的,则有 N=2^L
个可能的长度为 L
的词(例如,对于 L=2
,有四个代码字(00、01、10、11),对于 L=3
有八个,依此类推)。每个词都可以关联一个概率,同理计算熵,HL = -sum(p(p>0).*log2(p(p>0)))
.
如果您无法从分析上知道概率,您可以通过观察一个长样本并计算每个 N=2^L
代码字出现的频率来尝试以数字方式获得它。 L
越长越难,因为码字的数量增长非常快。