数据压缩入门
上QQ阅读APP看书,第一时间看更新

第3章 突破熵

由于没有更好的方法,因此香农博士将一个数对应的LOG2函数值称为该数的,也就是表示这个数所需要的最少二进制位数。他进一步将熵的概念(既然已经提出了这一术语了,为什么不重复利用呢……)扩展到整个数据集,也就是表示整个数据集所需要的最少二进制位数。他完成了所有这方面的数学工作,并给出了下面这个优美的公式来计算一个集合的熵注1

注1香农决定借用玻尔兹曼H定理中的符号(即大写的希腊字母eta)来表示熵。

这个公式乍看起来可能有些吓人注意,熵的计算公式中使用的lb() 是数学意义上的,与我们在第2章定义的LOG2() 函数不同。因此,这里通过lb() 计算出的结果不会向上取整,同时也允许该值为负。,因此我们将它拆开来分析你可以在Rosetta Code网站上找到这一算法在各种语言中的实现。

熵(名词)

一个热力学量,表示的是一个系统中无法转换为机械功的热能的量,通常被解释为该系统的无序度或随机度(物理学中的解释)。

无序或缺乏可预测性,逐渐退化为混乱(H. P. Lovecraft)。

对在特定的消息或语言中信息传输速度的一种对数度量(信息论中的解释)。

更实际具体一些,我们先来看一组字母,例如:

其中的字母是否排好序无关紧要,它不会对熵产生影响,本章后面会提到这一点。我们之所以选择排好序的示例,是为了让读者一眼就能看出每个字母的个数。

首先,计算这个数据分组中所包含的元素集合(这里所说的“集合”是数学意义上的集合,即集合中的每个元素只出现一次,且元素之间的顺序无关紧要)。

这就是中所包含的不同的符号的集合。

下一步,计算集合中的每个符号在数据分组中出现的概率,其计算公式为

这个计算公式是说,一个符号出现的频率或概率,等于这个符号在数据分组中出现的次数(也就是公式中的)除以数据分组的长度。

为了将数学转化为图表,我们来计算中每一个符号出现的概率。因为中共有10个符号,所以等于10,因此每个符号的概率都等于0.1的倍数。

既然已经计算出了每一个符号出现的概率,下面就可以进一步计算香农所定义的数据分组的熵。现在再回过头来看上面那个优美的公式,相信你已经不觉得它吓人了,因为它要比你想的简单得多:

第一步,对于每个符号,将其出现的概率乘以此概率以2为底的对数;然后,将第一步所得的数相加求和,再取其相反数,这样就得到了这一数据分组的熵。

下面来计算前面所举的示例的熵,如下表所示。

对最后一列求和,得到–1.8455(允许有些小误差)。求熵公式的最前面还有一个负号(即求和符号∑前面的那个负号),因此得出结论:表示这组数据每个符号平均约需要1.8455个二进制位。搞定!