Shannon对块中

时间:2017-02-07 00:35:03

标签: matlab entropy information-theory

我试图理解香农熵的概念并决定码长。在第一种情况下,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。

**问题**:方程(2)中的公式是香农的熵率,它与iid来源的通常公式不同。我无法理解分子中的N_2L是什么?在原始问题中(更新前),数组b的长度为N =5。因此,熵的值是标量。但是在方程(2)中,我无法理解如何实现它,因为本文中的Shannons熵基于$ N $和2L image of supplementary

对于由唯一符号k组成的任何序列(对于我的案例k=8),如何实现Eq(2)?  我的理解是,如果length(b) = N例如。 N = 20,然后我将Eq(2)计算为L = 1的S_T,L=2的S_T,依此类推至N=20的S_T。然而,我的混淆是因为熵是根据唯一符号的数量计算的,如果二进制是k=2

1 个答案:

答案 0 :(得分: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)) );

希望有所帮助。

修改:尝试添加澄清以回应您的评论:上述公式计算发出N个符号的来源的熵,例如s1,...,sN有可能看到第n个符号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(例如,对于L=3HL = -sum(p(p>0).*log2(p(p>0)))有四个代码字(00,01,10,11)有八个,依此类推)。每个单词都可以与概率相关联,并且熵的计算方式相同,N=2^L

如果您无法通过分析知道概率,可以尝试通过观察长样本并计算每个L代码字的频率来数字化。 SELECT tp.ID, tp.value FROM TablePair tp JOIN TableObject tob ON tp.pairId = tob.refId JOIN (SELECT ObjectId FROM TablePair tp JOIN TableObject tob ON tp.pairId = tob.refId WHERE (id = '1' AND value = 'val1') OR (id = '2' AND value = 'val2') OR (id = '3' AND value = 'val3') GROUP BY objectId HAVING COUNT(1) = 3) tF ON tF.ObjectId = tob.ObjectId WHERE (tp.id = '1' AND tp.value = 'val1') OR (tp.id = '2' AND tp.value = 'val2') OR (tp.id = '3' AND tp.value = 'val3'); 越长越困难,因为码字的数量增长得非常快。