![数据压缩入门](https://wfqqreader-1252317822.image.myqcloud.com/cover/817/31594817/b_31594817.jpg)
第3章 突破熵
3.1 理解熵
由于没有更好的方法,因此香农博士将一个数对应的LOG2函数值称为该数的熵,也就是表示这个数所需要的最少二进制位数。他进一步将熵的概念(既然已经提出了这一术语了,为什么不重复利用呢……)扩展到整个数据集,也就是表示整个数据集所需要的最少二进制位数。他完成了所有这方面的数学工作,并给出了下面这个优美的公式来计算一个集合的熵注1:
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/26.jpg?sign=1738853171-tiiwig6MI5drFqztGlk9abRdNTDmzzlt-0-def213d82784fc9a6dd5e5dfc415a253)
注1香农决定借用玻尔兹曼H定理中的符号(即大写的希腊字母eta)来表示熵。
这个公式乍看起来可能有些吓人,因此我们将它拆开来分析
。
熵(名词)
一个热力学量,表示的是一个系统中无法转换为机械功的热能的量,通常被解释为该系统的无序度或随机度(物理学中的解释)。
无序或缺乏可预测性,逐渐退化为混乱(H. P. Lovecraft)。
对在特定的消息或语言中信息传输速度的一种对数度量(信息论中的解释)。
更实际具体一些,我们先来看一组字母,例如:
首先,计算这个数据分组中所包含的元素集合
(这里所说的“集合”是数学意义上的集合,即集合中的每个元素只出现一次,且元素之间的顺序无关紧要)。
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/30.jpg?sign=1738853171-GdKHULwDCYcX9cYyZCqZsEn4OzygR4k5-0-4692bdb25e2e44cd438d30fc7fe54df5)
这就是中所包含的不同的符号的集合。
下一步,计算集合中的每个符号在数据分组中出现的概率,其计算公式为
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/31.jpg?sign=1738853171-RcmqCsmzO9lG0Jouz2HUc1yOlmbAb8ha-0-df8842c73001f188058a7c30460d3ed8)
这个计算公式是说,一个符号出现的频率或概率
,等于这个符号在数据分组
中出现的次数(也就是公式中的
)除以数据分组
的长度。
为了将数学转化为图表,我们来计算中每一个符号出现的概率。因为
中共有10个符号,所以
等于10,因此每个符号的概率都等于0.1的倍数。
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/1-6.jpg?sign=1738853171-W4kkTYCX2gEtwD3T0lKwWqfcz4gspruY-0-21ee8d880d924aeecdfcf20da6771518)
既然已经计算出了每一个符号出现的概率,下面就可以进一步计算香农所定义的数据分组的熵
。现在再回过头来看上面那个优美的公式,相信你已经不觉得它吓人了,因为它要比你想的简单得多:
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/26.jpg?sign=1738853171-tiiwig6MI5drFqztGlk9abRdNTDmzzlt-0-def213d82784fc9a6dd5e5dfc415a253)
第一步,对于每个符号,将其出现的概率乘以此概率以2为底的对数;然后,将第一步所得的数相加求和,再取其相反数,这样就得到了这一数据分组的熵。
下面来计算前面所举的示例的熵,如下表所示。
![](https://epubservercos.yuewen.com/4B5BC6/17103751004613106/epubprivate/OEBPS/Images/1-7.jpg?sign=1738853171-C99i7hZJ09qLko7FtTaGd6vt1849xM4R-0-5b1a46df448212aa8ba53992347cc85b)
对最后一列求和,得到–1.8455(允许有些小误差)。求熵公式的最前面还有一个负号(即求和符号∑前面的那个负号),因此得出结论:表示这组数据每个符号平均约需要1.8455个二进制位。搞定!