信息论与编码_信息论与编码期末复习二

本文深入探讨信息论与编码中的可变长前缀码,重点讲解霍夫曼编码的原理和优化问题。通过信源编码定理,阐述如何通过霍夫曼编码实现期望长度最小化的最优前缀码。同时,文章提到了霍夫曼编码在处理概率变化和额外比特问题上的局限性,以及算数编码和Lempel-Ziv编码作为替代方案的优势。
摘要由CSDN通过智能技术生成

3afecfa94256f8c4e587a28b20c8a1c9.png

在这一节,将讨论可变长符号码(前缀码是符号码的一种),它每次只对一个信源符号进行编码,而不是对N个信源符号的巨大字符串进行编码。这些码是无损的:这与上一节讨论的分组码不同,符号码能毫无差错地压缩和解压缩;但是有可能存在这样一种情况,即编码后的字符串有时比原本的信源串还长。

我们的基本思想是这样的,通过给更有可能出现的结果分配一个短一点的码字,给不太可能出现的结果分配长的码字,从而在平均的意义下达到压缩的目的。

下面是一些关键问题:

1)假如符号码是无损的,会有什么影响?例如一些码字确实可以更短,那么剩下的码字必须增至多长?

2)如何保证压缩过程是可行的?我们又该如何保证符号码易于译码?

3)关于最优符号码,为了获得最佳的压缩,该如何分配码长?可实现的最佳压缩是什么?

下述定理说明了香农信息量和熵确实处于关键位置。

信源编码定理(符号码):存在总体X的可变长度编码C,使得已编码符号的平均长度L(C,X)

[H(X),H(X)+1)。

只有当每个结果的码长都等于它的香农信息量时,这个平均长度才等于熵H(X)。我们还将定义一个最优符号码的算法,即所谓的霍夫曼编码算法。

一、实用符号码

对实用的符号码有些基本的要求。

1)任何已编码的字符串必须有唯一的译码。对任意的两个不同的字符串不会有相同的编码,也就是编码这个映射必须是一个单射。

2)符号码必须易于译码。如果符号码到达时马上就可以识别出码字的结尾,那么这个码就很容易译码,这意味着没有一个码字是另一个码字的前缀。我们将会证明,如果限定我们的符号码为前缀码,不会令性能有任何损失。事实上,前缀码是和树结构相对应的。

3)编码应取得尽可能多的压缩。

1.1 Kraft不等式

忽略不同符号的概率。我们先引入Kraft不等式,再解释其由来。

Kraft不等式:对于任何定义在二元符号集{0,1}上的可唯一译码的码C(X),其码长必须满足

其中

,长度为l的码子的费用为

下面说明费用的来源的一些直观理解。

如果采用{00,01,10,11}之类的码,并缩短其中的一个码字,例如00—>0,那么只有当我们加长其他码字时,才可以保持其可唯一译码性。因此,能够花费在码字上的预算显然是受限的,并且越短的码字费用越高。

考虑两种情形:

case1:如果单纯从长度l=3的码字来构造一个码字,要保持可唯一译码性,我们可以找出8种码字。当然,一旦我们选择了这8种码字,那么我们就不能在码字中再加入其它长度的码字了(违反前缀码定义,注意,前缀码是可以唯一译码的,但能唯一译码的不一定就是前缀码)。

case2:如果要包含一个长度为1的码字“0”,而其它码字的长度为3,此时我们仅仅只能得到四个码字{100,101,110,111}。仔细思考一下,我们便能发现我们再也不能有其它的选择长度为3码字的方法,使得我们得到更多码字。如此,从数量上来说,一个长度为3的码字所需要付出的代价比一个长度为1的码字会小4倍。

我们定义可花费在码字上的总预算为1,我们很自然的定义长度为l的码子的费用为

,这确实是一个合适的定价度量。例如,长度为3的码字各花费1/8,长度为1的码字各花费1/2。可以将预算花费在任何码字上,如果超出了预算,那么这个码字一定不会是可唯一译码的。另一方面,如果
,那么码也许是可唯一译码的。这也就是Kraft不等式的来源,一个可唯一译码的必要的条件,但并不充分。

完全性:如果一个可唯一译码的码,其Kraft不等式的等号成立,那么它叫做完全码。

我们想要可唯一译码的码,而前缀码是一个可唯一译码的码,也易于译码。所以我们只关注前缀码,那么情况会简单些。而对于任何信源,都存在亦为前缀码的最优符号码。

Kraft不等式和前缀码:已知一组码字长度满足Kraft不等式,那么就存在一个可唯一译码的前缀码具有这样的码字长度。

Kraft不等式更应该被称为Kraft-McMillan不等式:Kraft证明了,如果不等式被满足,那么存在一个具有给定码字长度的前缀码;McMillan证明了,可唯一译码性意味着不等式的成立。

1.2 符号码的信源编码定理

现在将概率{

}加入。给定一组符号概率(例如下图),如何设计最佳符号码,使得其具有最小可能期望长度L(C,X)的符号码?最小可能期望是多少?如何分配码字长度并非显而易见的,假如我们给更可能出现的符号分配短一些的码字,那么期望长度可能会被减小;另一方面,由Kraft不等式可知,缩短一些码字的长度必定会造成其他码字的增长。

46f0a2116d180bde0936fb13cb5e9716.png

我们希望将码字的期望长度最小化

cee05daafb6a4e3a76a64ae3e3a66d43.png

正如我们所期望的那样,熵作为码字期望长度的下界出现。

期望长度的下界:可唯一译码的码的期望长度L(C,X)的下界是H(X)。

最优信源码长只有码长等于香农信息量

65f385f6b072e48a2df5cb3cf4f0e4a0.png

时,期望长度才能最小化,并等于H(X)

关于码长{

}的任何选择都隐含地定义了概率分布{
},
,
.

在此概率分布下,这些码长将是最优的。假如码是完全的,那么z=1,并且隐式概率由

表示。

因此,不能将其压缩到低于熵的水平,符号码的信源编码定理则告诉我们能将其压缩的期望范围。

符号码的信源编码定理:对于一个总体X,存在一个前缀码C,其期望长度满足

d7e724140e451386a86b3a98d1b9745a.png

一个很显然的事实是,如果使用一个码,其码长不等于最优码长,那么平均消息长度将会比熵大。

1.3 霍夫曼编码算法

那么我们给定一组概率,如何才能设计一个最优前缀码。所谓最优,是假定目标是对期望长度L(C,X)最小化。霍夫曼码就是一种优美而简单的最优前缀码。

该算法是一种贪心算法,我们在算法导论的贪心策略一篇专门证明了其最优子结构性质和贪心选择性质,因而这里只简单给出算法流程。

ebdf85b2f2365af86643e16b8e3ca627.png

因此,对于一个信源而言,没有比霍夫曼码更好的符号码。

霍夫曼编码为一个总体产生了一个最优符号码,但这并不意味着我们完成了所有工作。“总体”和“符号码”在使用时需要格外小心。

若希望对于不变总体中的一个结果序列进行通信,则霍夫曼码可能是方便的,但实际情况中,相关的总体总是动态变化的。例如,如果所压缩的是文本,那么符号频率会随着上下文而变化:英文中的字母u跟在字母q之后的概率比它跟在字母e之后的概率要大得多(这里我们暂时如此理解)。

霍夫曼码并不能很好的处理总体概率变化的情形。当然,解决这个问题我们有两种自然额思路:

1)符号的概率一旦发生变化,就重新计算霍夫曼码。

2)否认适应性选择,取而代之的是提前检查整个文件,并计算出一个好的概率分布,在传输过程中此概率分布会始终保持不变。但在该种情况下,还必须针对码本身进行通信。这种方法不仅繁琐受限,并且还是次优的,因为用于确定码的初始消息和文档本身都是部分冗余的,从而这种方法浪费了一些比特。

霍夫曼码中还有一个问题,即所谓的"额外比特"问题,同理想平均长度H(X)相比,霍夫曼码所达到的长度满足H(X)

L(C,X)
H(X)+1。因此,霍夫曼码会导致每个符号有0~1个比特的额外开销。若H(X)很大,则这种开销所占份额并不重要,但在很多应用中,熵可能只是每个符号1比特或者更小,因此开销L(C,X)-H(X)可能在编码文件长度中占主导地位。

由于上述种种原因,所以尽管霍夫曼码被大肆鼓吹为“最优”,但在实际应用中仍然存在很多缺陷,它们确实是最优符号码,但在实际应用中并不需要符号码。

霍夫曼码中的缺陷可以用算数编码来矫正,后者缺少一种约束,即不必将每个符号都翻译成整数个比特,我们将深入了解该种编码。

最后给出一个称为相对熵的概念:

相对熵

所度量的是当总体的真实概率分布为p,而使用隐式概率为q的码时,每个符号所浪费的比特数。

二、符号流码

算数编码是一种优美的方法,它体现了压缩信源数据需要建立该信源的概率建模这样一种思想。

Lempel-Ziv编码是一种“通用”的方法,其主要设计思想:用一种压缩算法以较好的性能来处理任何信源。

关于算数编码的具体实现,下面文章写的非常非常详细了,实现原理源自一篇论文(ARITHMETIC CODING FORDATA COIUPRESSION),严格的检索号我懒得打了。

H264系列十 算术编码 CABAC CAVLC​www.jianshu.com
4bc486e9487ca93e3d18f7eeee04b78f.png

算数编码不仅提供了一种方法,压缩数据是来自某给定模型的字符串;它同时也给出了由一个模型随机生成随机字符串的方法。

关于Lempel-Ziv编码,我以一个栗子来讲述其编码规则。

首先是编码的算法流程:

41e66f8739b9e8361e445a570affa020.png

7e01d33c467a610fedd8074090dcf5ef.png

解码很简单,看看栗子就懂了,下面是栗子。

e8afab48bea1e70dad439d44bfaaeaad.png

与前三章所讨论的分组码、霍夫曼码和算数编码方法相比,Lempel-Ziv算法无需知道任何的信源概率模型。但是,给定一个遍历的信源(也就是,在充分长的时间尺度上,无记忆的信源),可以证明Lempel-Ziv算法会渐进地将它压缩到信源熵。这就是为什么称它是“通用”压缩算法的原因。

只要记住已经出现的子串,以便在它下次出现时有一个较短的名字,就可以实现压缩。对于大多数信源,实现这个通用性能所需的渐进时间尺度长的不切实际,因为需要记忆的典型子串数可能是巨大的。在实际应用中,算法的实用性能基于这样一个事实:许多文件包含特定的短字符序列的多次重复,这是很适合我们算法的一种冗余形式。

——————————————————————————————————————

按照这个进度,我好像复习不完了,数据挖掘真的令我的猪头大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值