简单了解数据压缩

概述

简单地说,数据压缩算法有5类:

  1. 变长编码(variable-length codes,VLC)
  2. 统计压缩(statisticalcompression)
  3. 字典编码(dictionary encodings)
  4. 上下文模型(contextmodeling)
  5. 多上下文模型(multicontext modeling)

每类算法中针对不同数据又有很多具体实现。

数据压缩

对数据进行压缩,通常有两个思路:

  • 减少数据中不同符号的数量(即让“字母表”尽可能小);
  • 用更少的位数对更常见的符号进行编码(即最常见的“字母”所用的位数最少)。

进行实际的数据压缩时,需要综合考虑以下些因素。

  • 不同数据的处理方法不同,比如压缩一本书中的文字和压缩浮点型的数,其对应的算法就大不相同。
  • 有些数据必须经过转换才能变得更容易压缩。
  • 数据可能是偏态的。例如,夏天的整体气温偏高,也就是说高气温出现的频率比接近零度的气温出现的频率高很多。

数据压缩的世界

音乐的压缩

在1996年前,几乎所有人在用WAV格式。WAV格式才是创建、存储和传输音频数据的主流格式,但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。

1996年,一群来自不同公司的聪明人组成了一个联合工作组,推出了MP3这种文件格式。MP3格式出现之后,一首音频质量很好、3分钟左右的完整歌曲,文件大小只有1~3 MB。

MP3格式就是一种音频压缩技术,音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。

图像压缩

1978年,互联网诞生,批互联网连接建立起来的时候,能发送的数据量非常少。只能发送和接收文本数据,如图:
在这里插入图片描述真实的图像信息以24位/像素格式存储,对早期的调制解调器来说这样的数据量实在是太大了。因此,压缩专家将图像压缩设为目标。

视频压缩

2001年,出现了YouTube网站。这时,视频信息的主流传输格式是MOV,然而这一格式如同将一系列JPG图像按顺序排列,所以相应的文件很大。因此,只加载网页就能观看视频的想法在当时实在是令人难以置信。

基因图谱

2008年,为了治疗人类疾病,降低疾病死亡率,科学家开始绘制和测试人类基因组。单个基因组序列就包含了大量的数据,仅仅是描述人类基因组成的数据就超过了14GB。这样的数据大小超出了大多数系统能处理的范围。

数据压缩再一次成为解决问题的利器。研究人员发现,BWT是最有效的存储DNA信息的压缩格式,甚至无须解压就能对数据进行操作。

压缩的经济效应

压缩后的文件会变得更小。这也就意味着,同样的数据传输所需的时间会变短,相应的费用也会减少。分发者的分发成本会降低,消费者的支出也会减少。

计算时间就是金钱,数据压缩可以说是缩短内容分发者和消费者之间距离最经济可行的方法。

信息论

信息论

信息论:即从数学的角度研究如何利用符号序列、脉冲序列或其他形式对信息进行编码,以及信息能以多快的速度在计算机电路或者电信信道中传输。

  • 物理学中的熵:一个热力学量,表示的是一个系统中无法转换为机械功的热能的量,通常被解释为该系统的无序度或随机度
  • 信息论中的熵:对在特定的消息或语言中信息传输速度的一种对数度量

我们简单的理解熵:表示一个数所需要的最少二进制位数。

eg:我们可以把任意的十进制通过 l o g 2 log_2 log2函数求出所需要的二进制的位数,如,255, l o g 2 ( 255 ) = 8 log_2(255)=8 log2(255)=8,则可以用8位二进制表示,即,11111111。

熵的计算公式

H ( s ) = − ∑ i = 1 n p i l o g 2 ( p i ) H(s)=-\sum_{i=1}^np_ilog_2(p_i) H(s)=i=1npilog2(pi)

通过计算一组数据(SET={A、B、B、C、C、C、D、D、D、D})的熵来说明公式计算过程及含义:

数据如下

符号 次数 概率
A 1 0.1
B 2 0.2
C 3 0.3
D 4 0.4

根据上表计算A、B、C符号的概率(频率)

计算熵:

下标 概率 p i p_i pi l o g 2 ( p i ) log_2(p_i) log2(pi) p i ∗ l o g 2 ( p i ) p_i*log_2(p_i) pilog2(pi)
1 0.1 -3.321 -0.3321
2 0.2 -2.321 -0.4642
3 0.3 -1.736 -0.5208
4 0.4 -1.321 -0.5284
x 总和 -1.8455

最后加上负号,得出结论,表示这组数据每个符号平均约需要1.8455个二进制位。

**意义:**刚才的例子,我们可以大致认为平均每个值用2个二进制位(通过向上取整运算获得),可有如下编码:
A − > 00 A -> 00 A>00
B − > 01 B -> 01 B>01
C − > 10 C -> 10 C>10
D − > 11 D -> 11 D>11

则我们的数据集合SET变为
S E T = { 00 , 01 , 01 , 10 , 10 , 10 , 11 , 11 , 11 , 11 } SET=\{00,01,01,10,10,10, 11,11,11,11\} SET={ 00,01,01,10,10,10,11,11,11,11}

理解概率

从本质上来说,香农所定义的熵(我们所关注的信息论的熵),是以一种倒排序的方式建立在数据流中每个符号出现概率的估算之上的(刚才算过了频率)。

总的来说,一个符号出现得越频繁,它对整个数据集包含的信息内容的贡献就会越少。

以钓鱼为例,你坐在岸边钓鱼,隔几分钟,你就会看一眼鱼浮,发现它并没有变化,但每隔一小时左右,就会有鱼咬钩,这才是你真正感兴趣的事情。也就是说,很长的时间里没有什么有用的信息,真正有用的信息偶尔才会出现。如果用0表示没有鱼,用1表示鱼上钩,那么你记录的信息里很容易出现这样的片段:0000000010000000001000000000001。

熵值越高,携带信息更多(是鱼的信息),需要更多的二进制位来表示。

突破——熵

按照香农对熵的定义,他只考虑了符号出现的概率,完全没有考虑符号之间的排序。而对真实数据集来说,排序是一项基本的信息,符号之间的关系同样如此。

例如,排好序的[1,2,3,4] 和没有排序的[4,1,2,3] 这两个集合,按照香农的定义,两者的熵相同,但是凭直觉我们就能发现,其中的一个集合包含了额外的排序信息。

标准的数字长度

数值的 l o g 2 log_2 log2表示形式虽然高效,但对于制造计算机元件的方式来说并不实用。

问题在于,如果用最少的二进制位数来表示一个数,在解码相应的二进制字符串时会产生混乱,因为我们并不知道该数对应的 l o g 2 log_2 log2长度。

具体的例子,我们现在的电脑是32位或者64位,int为32bit,long为64bit,代表计算机能处理的数据位数,如果不限制数字长度,不利于计算机的实现。

在计算机内存中,任何二进制位流都会舍入到下一个字节对齐的大小。例如,只存储了7个二进制位的数据时,计算机仍然会报告说我们所存储的数据长度与计算机一次读取的最小字节数相同。

猜你喜欢

转载自blog.csdn.net/qq_39021670/article/details/109387203