熵和编码长度
源自知乎的一个答案
信息论中,熵代表着根据信息的概率分布对信息编码所需要的最短平均编码长度。
举个简单的例子来理解一下这件事情:假设有个考试作弊团伙,需要连续不断地向外传递4选1单选题的答案。直接传递ABCD的ascii码的话,每个答案需要8个bit的二进制编码,从传输的角度,这显然有些浪费。信息论最初要解决的,就是数据压缩和传输的问题,所以这个作弊团伙希望能用更少bit的编码来传输答案。很简单,答案只有4种可能性,所以二进制编码需要的长度就是取2为底的对数:
\(log_2(4)\)
2个bit就足够进行四个答案的编码了(00,01,10,11)。
在上面这个例子中,其实隐含了一种假设,就是四个答案出现概率是相等的,均为p=1/4,所以编码需要长度的计算可以理解为如下的形式:
$H(X)=E[-log_2(P(X))]=-\sum_{x \in {A,B,C,D}}{P(x)log_2(P(x))} $
此时已经有些像熵的定义了。回顾一下熵的定义,正是求\(-log_2(p)\)的期望值,所以我们把这个思路也套用一下:
\(log_2(4)=log_2(\frac{1}{1/4} )=-log_2(1/4 )=-log_2(p)\)
这正是熵,因为ABCD出现的概率均为p=1/4,所以上面式子算出来结果刚好是2。从这个角度,熵就是对每个可能性编码需要长度的期望值。
答案出现概率相等的例子可能并不贴近实际,在中国考试界,坊间传闻:“不知道选什么的时候就蒙C”,这个信息是可以帮助作弊团队改善编码长度的。假设A出现的概率不变仍为1/4,C出现的概率变成了1/2,B和D则分别是1/8:P(A)=1/4,P(B)=1/8,P(C)=1/2,P(D)=1/8。在这种情况下,考虑到传递答案的过程中,C出现的次数(概率)最高,所以可以为C用短一些的编码,而出现次数较少的B和D则可以考虑用长一些的编码。这样的话,平均下来,对于一定的信息总量,需要的编码总长度就会少一些。根据熵的定义的思路,对于出现概率为p的事件,考虑用长度为\(-log_2(p)\)的二进制进行编码。所以考虑如下面的编码:
A: 10
B: 110
C: 0
D: 111
对照熵的公式来计算一下编码长度的期望值,也就是平均编码长度:
\(H(X)=-\sum_{x \in \{A,B,C,D\}}{P(x)log_2(P(x))} =\frac{1}{4} \times 2+\frac{1}{8} \times 3+\frac{1}{2} \times 1+\frac{1}{8} \times 3=1.75\)
再详细点,假设作弊团伙要传递200个答案出去。为了方便说明,这200个答案中ABCD出现的次数恰好都严格和其出现概率成比例,也就是A:50次,B:25次,C:100次,D:25次。所以传递200个答案一共需要的bit数是:
\(50 \times 2+25 \times 3+100 \times 1+25 \times 3=350\)
那么平均下来每个答案耗费了350/200=1.75个bit编码长度。
在实际情况中,并不是每个信息都可以单纯按照上面的两个例子进行二进制编码。比如一个事件出现概率为0.3,那么我们也不知道该如何用一个-log2(0.3)=1.74个bit的二进制编码表示。但是平均编码长度的概念是可以拓展的,代表了对随机变量的平均不确定度的度量。比如ABCD四个答案出现概率相等时,是一种最无序最不确定的状态,谁也蒙不准下一个答案是什么;但是如果C出现概率高了,那么答案出现就不是那么没规律,我们蒙C时的信心就高了一些。