我试图理解香农熵的概念并决定码长。在第一种情况下,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
对于由唯一符号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
。
答案 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=3
,HL = -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');
越长越困难,因为码字的数量增长得非常快。