讲清楚一个简单的概念之数据压缩

1,536 阅读6分钟

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。

上面这段话摘自百度百科,大概描述清楚了数据压缩是怎么一回事。

概念

本质上,所谓"压缩"就是找出文件内容的概率分布,将那些出现概率高的部分代替成更短的形式。所以,内容越是重复的文件,就可以压缩地越小。比如,"ABABABABABABAB"可以压缩成"7AB"。相应地,如果内容毫无重复,就很难压缩。极端情况就是,遇到那些均匀分布的随机字符串,往往连一个字符都压缩不了。比如任意排列的10个阿拉伯数字(5271839406),就是无法压缩的;再比如,无理数(比如π)也很难压缩。压缩就是一个消除冗余的过程,相当于用一种更精简的形式,表达相同的内容。 可以想象,压缩过一次以后,文件中的重复字符串将大幅减少。好的压缩算法,可以将冗余降到最低,以至于再也没有办法进一步压缩。所以,压缩已经压缩过的文件(递归压缩),通常是没有意义的。

分类

  • 有损

有损压缩是指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解。有损压缩适用于重构信号不一定非要和原始信号完全相同的场合。通常可以分为特征抽取和量化两大类,特征抽取包括基于模式的编码、分形编码等,量化包括零记忆量化、预测编码、直接映射和变换编码等方法。

  • 无损

无损压缩是指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。通常使用的是统计编码技术,包括哈夫曼编码、算术编码和游程编码等。

编码

压缩可以分解成两个步骤:

  • 第一步是得到文件内容的概率分布,哪些部分出现的次数多,哪些部分出现的次数少;
  • 第二步是对文件进行编码,用较短的符号替代那些重复出现的部分。 编码的方式有很多,比如RLE、哈夫曼、Rice、LZW等

这里简单介绍下游程编码(RLE)

原数据0000000000000001111111000000011111111111(40位)

该字符串含有15个0,7个1,7个0以及11个1,因此我们将该字符压缩为15(二进制表示:1111),7(0111),7(0111),1(0001)。所有字符串都是有交替出现的01组成的,因此我们只需要将游程的长度编码即可。

编码后数据1111011101110001(16位)

极限

概率分布一般是确定的,现在就来考虑编码,怎样找到最短的符号作为替代符。 如果文件内容只有两种情况(比如扔硬币的结果),那么只要1个二进制位就够了,1表示正面,0表示表示负面。如果文件内容包含三种情况(比如球赛的结果),那么最少需要2个二进制位。如果文件内容包含六种情况(比如扔筛子的结果),那么最少需要3个二进制位。

一般来说,在均匀分布的情况下,假定一个字符(或字符串)在文件中出现的概率是p,那么在这个位置上最多可能出现1/p种情况。需要log2(1/p)个二进制位表示替代符号。

期望

pnlog2(1/pn)=E(log2(1/p))∑pn*log2(1/pn) = E(log2(1/p))

可以理解成平均每一个符号占用的二进制位

例子

前提:假定有两个文件都包含1024个符号,在ASCII码的情况下,它们的长度是相等的,都是1KB。

情况一:甲文件的内容50%是a,30%b,20%是c,则平均每个符号要占用1.49个二进制位。

0.5log2(1/0.5)+0.3log2(1/0.3)+0.2log2(1/0.2)=1.490.5*log2(1/0.5) + 0.3*log2(1/0.3) + 0.2*log2(1/0.2)= 1.49

每个符号要占用1.49个二进制位,那么压缩1024个符号,理论上最少需要1526个二进制位,约0.186KB,相当于压缩掉了 81% 的体积。

情况二:乙文件的内容10%是a,10%是b,......,10%是j,则平均每个符号要占用3.32个二进制位。

0.1log2(1/0.1)10=3.320.1*log2(1/0.1)*10= 3.32

每个符号要占用3.32个二进制位,那么压缩1024个符号,理论上最少需要3400个二进制位,约0.415KB,相当于压缩掉了 58% 的体积。

结论

对比上面两个算式,可以看到文件内容越是分散(随机),所需要的二进制位就越长。所以,这个值可以用来衡量文件内容的随机性(又称不确定性)。这就叫做 [信息熵](information entropy)。

信息熵

概念

信息熵是消除不确定性所需信息量的度量,也即未知事件可能含有的信息量。

理解信息熵

  • 信息熵只反映内容的随机性,与内容本身无关。不管是什么样内容的文件,只要服从同样的概率分布,就会计算得到同样的信息熵。
  • 信息熵越大,表示占用的二进制位越长,因此就可以表达更多的符号。所以,人们有时也说,信息熵越大,表示信息量越大。不过,由于第一点的原因,这种说法很容易产生误导。较大的信息熵,只表示可能出现的符号较多,并不意味着你可以从中得到更多的信息。
  • 信息熵与热力学的熵,基本无关。这两个熵不是同一件事,信息熵表示无序的信息,热力学的熵表示无序的能量

信息熵和压缩的关系

  • 信息熵越高的数据压缩效率越低
  • 降低冗余的过程本身就是一个减熵行为