信息论基础 | 第五章 编码理论
2025-11-10 11:02:47 星期一
5.1 关于编码的例子
首先给出定义
定义 关于随机变量 \(X\) 的信源编码 \(C\) 是从 \(X\) 的取值空间 \(\mathcal{X}\) 到 \(\mathcal{D}^*\) 的一个映射,其中 \(\mathcal{D}^*\) 表示 \(D\) 元字母表 \(D\) 上有限长度的字符串构成的集合。用 \(C(x)\) 表示 \(x\) 的码字并用 \(l(x)\) 表示 \(C(x)\) 的长度。
例题 \(C(\text{红})=00\),\(C(\text{蓝})=11\) 是 \(\mathcal{X}=\{\text{红}, \text{蓝}\}\) 关于字母表 \(D=\{0,1\}\) 的一个信源编码。
定义 设随机变量 \(X\) 的概率密度函数为 \(p(x)\),定义信源编码 \(C(x)\) 的期望长度 \(L(C)\) (expected length) 为
其中 \(l(x)\) 表示对应于 \(x\) 的码字长度。
不失一般性,可假定 \(D\) 元字母表为 \(D=\{0,1,\cdots,D-1\}\)。
下面我们逐步对编码的定义条件作进一步的限制。
定义 如果编码将 \(X\) 的取值空间中的每个元素映射成 \(\mathcal{D}^*\) 中不同的字符串,即
则称这个编码是非奇异的(nonsingular)。
注:上面的所谓非奇异,用数学的话术就是"单射"。并且非奇异不能保证可译性。
为此我们引入:
定义 编码 \(C\) 的扩展 (extension) \(C^*\) 是从 \(\mathcal{X}\) 上的有限长字符串到 \(\mathcal{D}\) 上的有限长字符串的映射,定义为
其中 \(C(x_1)C(x_2)\cdots C(x_n)\) 表示相应码字的串联。
例 5.1.4 若 \(C(x_1)=00\), \(C(x_2)=11\),则 \(C(x_1,x_2)=0011\)。
定义 如果一个编码的扩展编码是非奇异的,则称该编码是唯一可译的 (uniquely decodable)。
换言之,惟一可译码的任一编码字符串只来源于惟一可能的信源字符串。尽管如此,仍然可能需要通过整个编码字符串,才能最终确定信源字符串。甚至有时对于确定字符串中的第一个字符,我们也必须这样。
定义 若码中无任何码字是其他码字的前缀,则称该编码为前缀码 (prefix code) 或即时码 (instantaneous code)。
例子:考虑A=0 B=10 C=110 D=1110, 在这个编码里面,没有任何码字是其他码字的前缀,这就是前缀码

关系:非奇异不一定唯一可译,唯一可译但不一定是即时码
5.2 Kraft不等式
定理 5.2.1(Kraft不等式,前缀码存在定理):对于 \(D\) 元字母表,存在码字长度为 \(l_1, l_2, \ldots, l_m\) 的前缀码的充要条件是这些码字长度满足 Kraft 不等式:
证明:
必要性。我们构建一个D叉树,设码字的最大长度为 \(l_{\text{max}}\),那么作为D叉树而言,树的最底层最多有 \(D^{l_{\text{max}}}\) 个元素。现在选取码长为 \(l_i\) 的码字,由于是前缀码,不能是别的码字的"前缀",所以该码字的节点以后就没有分叉了,该码字独占了子树,若没有独占,那么该子树延伸到最底层的时候,应该有 \(D^{l_{\text{max}}-l_i\) 个元素,那么我们对 \(i\) 求和,就得到了 \(\sum_i D^{l_{\text{max}}-l_i} \le D^{l_{\text{max}}}\),同时除掉 \(D^{l_{\text{max}}}\) 就得到了该不等式。
充分性。首先我们将码字长度按照从小到大排序,从一个空的D叉树开始,第一个深度为 \(l_1\) 的节点记为第一个码字1(由必要性部分的证明,这样会去掉最底层的 \(D^{l_{\text{max}}}-D^{l_1}\) 个节点),在剩余的节点中,寻找第一个深度为 \(l_2\) 的节点,记为第二个码字2,这样会去掉最底层的 \(D^{l_{\text{max}}}-D^{l_2}\) 个节点,以此类推。
这个算法可以进行下去的原因就在于Kraft不等式。我们从归纳法的角度考虑,在我们准备分配第 \(k\) 个码字的时候,我们已经分好了前面 \(k-1\) 个码字,此时我们已经在底层 \(D^{l_{\text{max}}}\) 个节点里面去掉了 \(\sum_{i=1}^{k-1} D^{l_{\text{max}} - l_i}\) 个节点,由Kraft不等式,\(\sum_{i=1}^{m} D^{-l_i} \leq 1\),对于前面 \(k-1\) 个码字而言,显然 \(\sum_{i=1}^{k-1} D^{-l_i} < \sum_{i=1}^{m} D^{-l_i} \leq 1\),同时乘 \(D^{l_{\text{max}}}\),\(\sum_{i=1}^{k-1} D^{l_{\text{max}} - l_i} < D^{l_{\text{max}}}\),这个不等式告诉我们,即使我们移除了前 \((k-1)\) 个码字的所有后代,底层仍然有节点剩余。既然底层还有节点剩余,那么在树的第 \(l_k\) 层,必然存在节点,其通往底层的整条路径都还没有被之前的码字阻断。
综上,前缀码的存在性就证明了。
例题:现有码字 00, 01, 11, 100, 10100, 10101, 10110, 10111,验证 Kraft 不等式。
解:这些码字对应的码长分别为:
- 00, 01, 11:长度 2
- 100:长度 3
- 10100, 10101, 10110, 10111:长度 5
使用二进制字母表 (\(D=2\)),计算 Kraft 和:
由于 Kraft 和等于 1,满足 Kraft 不等式,因此存在具有这些码长的前缀码。
5.3 最优码
前缀码最小码长问题:设 \(l_1 \cdots l_m\) 满足 Kraft 不等式,考虑最小期望长度:
利用 Lagrange 乘数法,\(J = \sum_{i=1}^m p_i l_i + \lambda (\sum_{i=1}^m D^{-l_i})\)
但 \(l_i \in Z\),所以我们只能选择 \(\{l_1, \ldots, l_m\}\) 接近于 \(\{l_1^*, \ldots, l_m^*\}\)
定理 5.3.1 R.V. \(X\) 的任一 \(D\) 元前缀码的期望长度 \(L \geq H_D(X)\)
Proof.
其中 \(r_i = D^{-l_i} / \sum D^{-l_i}\),\(C = \sum D^{-l_i}\)。
等号成立 \(\Leftrightarrow p = r\)。即 \(p_i = D^{-l_i}\)。
5.4 最优码长的界
在编码中,\(l_i^* = \log_D \frac{1}{p_i}\) 不一定是整数,因此令 \(\forall i \in \{1,\ldots,m\}\):
该组 \(\{l_1, \ldots, l_m\}\) 满足 Kraft 不等式:
而且 \(l_i\) 满足:
定理 5.4.1 设 \(l_{1}^{*}, l_{2}^{*}, \cdots, l_{m}^{*}\) 是关于信源分布 \(\mathbf{p}\) 和一个 \(D\) 元字母表的一组最优码长,\(L^{*}\) 为最优码的相应期望长度(\(L^{*}=\sum p_{i} l_{i}^{*}\)),则
证明:设 \(l_{i} = \left\lceil \log _{D} \frac{1}{p_{i}} \right\rceil\),则 \(l_{i}\) 满足 Kraft 不等式且由式 (5-32) 可知
但由于 \(L^{*}\) 是最优码的期望长度,它不大于 \(L = \sum p_{i} l_{i}\)。再由定理 5.3.1 可知 \(L^{*} \geqslant H_{D}(X)\)。定理得到证明。
5.4 最优码长的界
根据定理5.3.1,实际编码时,码长必须是整数,所以可能会比熵最多多出 1 比特(对每个符号而言)。
问题:如果每个符号都多接近 1 比特,当符号很多时,压缩效率不够高。
所以我们考虑而是把n个符号打包成一个“超字符”进行编码。
1. 分组编码
核心思路:将 \(n\) 个符号打包成"超字符"进行编码。
- 设 \((X_1, X_2, \dots, X_n)\) 是 \(n\) 个 i.i.d. 符号
- 每个原始符号的平均码长定义为:
对"超字符"应用定理 5.4.1:
由于 i.i.d. 性质,\(H(X_1, \dots, X_n) = n H(X)\),代入得:
结论:当分组长度 \(n\) 增大时,每符号平均码长 \(L_n\) 可以无限接近熵 \(H(X)\)。
2. 扩展到平稳随机过程
对于平稳随机过程,有:
当 \(n \to \infty\) 时:
其中 \(H(\mathcal{X})\) 是随机过程的熵率。
结论:熵率是平稳随机过程数据压缩的终极极限。
3. 使用错误概率分布的后果(定理 5.4.3)
当使用错误分布 \(q(x)\) 设计编码(码长 \(l(x) = \lceil \log \frac{1}{q(x)} \rceil\))时:
定理 5.4.3 指出平均码长满足:
其中 \(D(p \| q) = \sum p(x) \log \frac{p(x)}{q(x)}\) 是相对熵(KL 散度)。
proof. 证明:期望码长为
类似地,可以得到期望码长的下界。
于是,若真实分布为 \(p(x)\),而编码使用的是非真实分布 \(q(x)\),则会导致期望描述长度增加 \(D(p \| q)\)。
解释:
- 如果 \(q = p\),则 \(D(p\|q)=0\),平均码长接近 \(H(p)\)
- 如果 \(q \neq p\),平均码长增加 \(D(p\|q)\)
- 相对熵 \(D(p\|q)\) 量化了因使用错误分布而导致的额外描述成本
5.5 唯一可译码的Kraft不等式
回到之前讨论的码长最小化问题:
现在我们考虑将条件放宽,之前是在前缀码的条件下考虑的,这一次我们把范围放大,在唯一可译码里面考虑。就相当于条件放宽了,那么L就有可能取到更小的值。 但是下面的定理告诉我们,这不可能,换言之,前缀码的性质已经足够好了,没必要再考虑唯一可译码(非前缀码)的部分了。
定理 5.5.1(McMillan) 任意惟一可译的 D 元码的码字长度必然满足 Kraft 不等式
反之,若给定满足上述不等式的一组码字长度,则可以构造出具有同样码字长度的惟一可译码。
证明略。
5.6 赫夫曼码
核心思想
为出现概率高的符号分配短的码字,为出现概率低的符号分配长的码字,从而使平均编码长度最短。
赫夫曼码是一种前缀码,任何码字都不是另一个码字的前缀,保证了解码无歧义。
示例演示
初始概率分布
| 符号 | 概率 |
|---|---|
| A | 0.4 |
| B | 0.3 |
| C | 0.2 |
| D | 0.1 |
第一步:创建初始节点
节点: (A:0.4), (B:0.3), (C:0.2), (D:0.1)
第一次合并:找到概率最小的两个节点,是 C(0.2) 和 D(0.1)。把它们合并成一个新的节点,我们叫它 N1。新节点的概率是两者之和 0.2 + 0.1 = 0.3。
在合并时,我们做一个规定:给概率较小的那个分支分配“1”,概率较大的那个分配“0”。(这个约定可以反过来,只要全程一致就行)
所以,C(0.2) 和 D(0.1) 相比,D 的概率更小,我们给 D 分配 1,给 C 分配 0。

第二次合并:现在所有节点中,概率最小的是 B(0.3) 和 N1(0.3)。(两者一样大,任选一个合并即可)。把它们合并成一个新节点 N2,概率为 0.6。
我们规定左边的分支是 0,右边的分支是 1。

最后一次合并:只剩下 A(0.4) 和 N2(0.6) 了。合并它们,形成根节点 Root,概率为 1.0。
同样,左边分支 0,右边分支 1。

从最顶上的根节点(Root)开始,走到每一个符号的路径,就是该符号的赫夫曼码。
A:路径是 0 -> 码字: 0
B:路径是 1 -> 0 -> 码字: 10
C:路径是 1 -> 1 -> 0 -> 码字: 110
D:路径是 1 -> 1 -> 1 -> 码字: 111
| 符号 | 概率 | 赫夫曼码 | 路径说明 |
|---|---|---|---|
| A | 0.4 | 0 | 根→左 |
| B | 0.3 | 10 | 根→右→左 |
| C | 0.2 | 110 | 根→右→右→左 |
| D | 0.1 | 111 | 根→右→右→右 |
性能分析
计算平均码长
L = (0.4 × 1) + (0.3 × 2) + (0.2 × 3) + (0.1 × 3)
= 0.4 + 0.6 + 0.6 + 0.3
= 1.9 比特
验证前缀码性质
- A(0) 不是 B(10)、C(110)、D(111) 的前缀
- B(10) 不是 C(110)、D(111) 的前缀
- C(110) 不是 D(111) 的前缀
与熵的比较
该信源的熵 H(X) ≈ 1.846 比特,赫夫曼码的平均码长(1.9比特)已非常接近理论极限。
5.9 算术编码
单个符号的算术码(存在性定理)
对于单个符号 \(a_k\),算术码的思想是将其映射到 \([0,1)\) 区间中的一个子区间,用该区间内某个数的二进制表示作为码字。
具体步骤
-
符号排序
- 将符号按概率降序排列:\(a_1 > a_2 > \cdots > a_K\)
- 对应概率:\(p(a_1) \ge p(a_2) \ge \cdots \ge p(a_K)\)
-
累积概率定义
\[F(a_k) = \sum_{a_i \ge a_k} p(a_i) \]- 这是从概率最大的符号开始累积
- \(F(a_k)\) 表示符号 \(a_k\) 对应区间的左端点
-
修正累积概率
\[\overline{F}(a_k) = \sum_{a_i > a_k} p(a_i) + \frac{p(a_k)}{2} \]- 这实际上是符号 \(a_k\) 对应区间的中点
- 区间为:\([F(a_k), F(a_k)+p(a_k))\)
-
二进制表示
- 将 \(\overline{F}(a_k)\) 转换为二进制小数
- 取前 \(l_k\) 位作为码字
-
码长选择
\[l_k = \lceil -\log p(a_k) \rceil + 1 \]- 保证码字能唯一确定符号 \(a_k\)
- 多出的 1 位是为了避免边界歧义
-
性能保证
- 平均码长:\(\overline{l} < H(X) + 2\)
- 虽比赫夫曼码稍差,但仍接近熵界
总结
-
Kraft不等式 即时码 \(\leftrightarrow \ \rightarrow \ \sum D^{-l_{k}} \leq 1\)
-
McMillan不等式 唯一可译码 \(\longrightarrow \ \sum D^{-l_{k}} \leq 1\)
-
数据压缩的熵界 \(L \triangleq \sum p_{i} l_{i} \geq H_{D}(X)\)
-
香农码 \(l_{i}=-\left\lceil\log _{D} p_{i}\right\rceil \quad H_{D}(X) \leq L<H_{D}(X)+1\)
-
Huffman码 \(L^{*}=\min _{\sum^{D^{-1} \leq 1}} \sum p_{i} l_{i} \quad H_{D}(X) \leq L^{*}<H_{D}(X)+1\)
-
偏码 \(\mathrm{X} \sim \mathrm{p}(\mathrm{x}), l(x)=-[\log q(x)], L=\sum p(x) l(x)\)
\(H(p)+D(p \| q) \leq L<H(p)+D(p \| q)+1\) -
随机过程 \(H\left(X_{1}, X_{2}, \cdots, X_{n}\right) \leq n L_{n}<H\left(X_{1}, X_{2}, \cdots, X_{n}\right)+1\)
-
平稳过程 \(L_{n} \rightarrow H(X)\)

浙公网安备 33010602011771号