信息论基础 | 第五章 编码理论

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(C)=\sum_{x\in\mathcal{X}} p(x) l(x) \]

其中 \(l(x)\) 表示对应于 \(x\) 的码字长度。

不失一般性,可假定 \(D\) 元字母表为 \(D=\{0,1,\cdots,D-1\}\)

下面我们逐步对编码的定义条件作进一步的限制。

定义 如果编码将 \(X\) 的取值空间中的每个元素映射成 \(\mathcal{D}^*\) 中不同的字符串,即

\[x_1 \neq x_2 \Rightarrow C(x_1) \neq C(x_2) \]

则称这个编码是非奇异的(nonsingular)。

注:上面的所谓非奇异,用数学的话术就是"单射"。并且非奇异不能保证可译性。

为此我们引入:
定义 编码 \(C\) 的扩展 (extension) \(C^*\) 是从 \(\mathcal{X}\) 上的有限长字符串到 \(\mathcal{D}\) 上的有限长字符串的映射,定义为

\[C(x_1,x_2,\cdots,x_n) = C(x_1)C(x_2)\cdots C(x_n) \tag{5-5} \]

其中 \(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, 在这个编码里面,没有任何码字是其他码字的前缀,这就是前缀码
image

关系:非奇异不一定唯一可译,唯一可译但不一定是即时码


5.2 Kraft不等式

定理 5.2.1(Kraft不等式,前缀码存在定理):对于 \(D\) 元字母表,存在码字长度为 \(l_1, l_2, \ldots, l_m\) 的前缀码的充要条件是这些码字长度满足 Kraft 不等式:

\[\sum_{k=1}^m D^{-l_k} \leq 1 \]

证明
必要性。我们构建一个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 和:

\[\sum D^{-l_i} = 3 \times 2^{-2} + 1 \times 2^{-3} + 4 \times 2^{-5} = \frac{3}{4} + \frac{1}{8} + \frac{4}{32} = 0.75 + 0.125 + 0.125 = 1 \]

由于 Kraft 和等于 1,满足 Kraft 不等式,因此存在具有这些码长的前缀码。


5.3 最优码

前缀码最小码长问题:设 \(l_1 \cdots l_m\) 满足 Kraft 不等式,考虑最小期望长度:

\[\begin{cases} \min L = \sum_{i=1}^m p_i l_i \\ \sum_{i=1}^m D^{-l_i} \leq 1 \end{cases} \]

利用 Lagrange 乘数法,\(J = \sum_{i=1}^m p_i l_i + \lambda (\sum_{i=1}^m D^{-l_i})\)

\[\frac{\partial J}{\partial l_i} = p_i - \lambda D^{-l_i} \log D = 0, \quad 得 \quad D^{-l_i} = \frac{p_i}{\lambda \log D} \Rightarrow \lambda = \frac{1}{\log D} \]

\[\Rightarrow p_i = D^{-l_i}, \quad 即 \quad l_i^* = -\log_D p_i \]

\[\min L = \sum p_i l_i^* = -\sum p_i \log_D p_i = H_D(X) \]

\(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.

\[\begin{aligned} L - H_D(X) &= \sum p_i l_i + \sum p_i \log_D p_i \\ &= -\sum p_i \log_D D^{-l_i} + \sum p_i \log_D p_i \\ &= \sum p_i \log_D \frac{p_i}{D^{-l_i}} \\ &= \sum p_i \log_D \left[ \frac{p_i}{D^{-l_i}/\sum D^{-l_i}} \cdot \frac{1}{\sum D^{-l_i}} \right] \\ &= \sum p_i \log_D \frac{p_i}{r_i} + \log_D \frac{1}{C} \\ &= D(p||r) + \log_D \frac{1}{C} \\ &\geq 0 \end{aligned} \]

其中 \(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_i = \left\lceil \log_D \frac{1}{p_i} \right\rceil \]

该组 \(\{l_1, \ldots, l_m\}\) 满足 Kraft 不等式:

\[\sum_{i=1}^m D^{-l_i} = \sum_{i=1}^m D^{-\left\lceil \log_D \frac{1}{p_i} \right\rceil} \leq \sum_{i=1}^m D^{-\log_D \frac{1}{p_i}} = \sum_{i=1}^m p_i = 1 \]

而且 \(l_i\) 满足:

\[\log_D \frac{1}{p_i} \leq l_i < \log_D \frac{1}{p_i} + 1 \]

\[\Rightarrow \sum p_i \log_D \frac{1}{p_i} \leq \sum p_i l_i < \sum p_i \log_D \frac{1}{p_i} + 1 \]

\[\Rightarrow H_D(X) \leq L < H_D(X) + 1 \]

定理 5.4.1\(l_{1}^{*}, l_{2}^{*}, \cdots, l_{m}^{*}\) 是关于信源分布 \(\mathbf{p}\) 和一个 \(D\) 元字母表的一组最优码长,\(L^{*}\) 为最优码的相应期望长度(\(L^{*}=\sum p_{i} l_{i}^{*}\)),则

\[H_{D}(X) \leqslant L^{*} < H_{D}(X) + 1 \]

证明:设 \(l_{i} = \left\lceil \log _{D} \frac{1}{p_{i}} \right\rceil\),则 \(l_{i}\) 满足 Kraft 不等式且由式 (5-32) 可知

\[H_{D}(X) \leqslant L = \sum p_{i} l_{i} < H_{D}(X) + 1 \]

但由于 \(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. 符号
  • 每个原始符号的平均码长定义为:

\[L_n = \frac{1}{n} \mathbb{E}[l(X_1, \dots, X_n)] \]

对"超字符"应用定理 5.4.1:

\[H(X_1, \dots, X_n) \le \mathbb{E}[l(X_1, \dots, X_n)] < H(X_1, \dots, X_n) + 1 \]

由于 i.i.d. 性质,\(H(X_1, \dots, X_n) = n H(X)\),代入得:

\[H(X) \le L_n < H(X) + \frac{1}{n} \]

结论:当分组长度 \(n\) 增大时,每符号平均码长 \(L_n\) 可以无限接近熵 \(H(X)\)

2. 扩展到平稳随机过程

对于平稳随机过程,有:

\[\frac{H(X_1, \dots, X_n)}{n} \le L_n < \frac{H(X_1, \dots, X_n)}{n} + \frac{1}{n} \]

\(n \to \infty\) 时:

\[L_n^* \to H(\mathcal{X}) \]

其中 \(H(\mathcal{X})\) 是随机过程的熵率。

结论:熵率是平稳随机过程数据压缩的终极极限。

3. 使用错误概率分布的后果(定理 5.4.3)

当使用错误分布 \(q(x)\) 设计编码(码长 \(l(x) = \lceil \log \frac{1}{q(x)} \rceil\))时:

定理 5.4.3 指出平均码长满足:

\[H(p) + D(p \| q) \le \mathbb{E}_p[l(X)] < H(p) + D(p \| q) + 1 \]

其中 \(D(p \| q) = \sum p(x) \log \frac{p(x)}{q(x)}\) 是相对熵(KL 散度)。

proof. 证明:期望码长为

\[El(X)=\sum_{x} p(x)\left\lceil\log \frac{1}{q(x)}\right\rceil \]

\[<\sum_{x} p(x)\left(\log \frac{1}{q(x)}+1\right)\]

\[=\sum_{x} p(x) \log \frac{p(x)}{q(x)}+1 \]

\[=\sum_{x} p(x) \log \frac{p(x)}{q(x)}+\sum_{x} p(x) \log \frac{1}{p(x)}+1\]

\[=D(p \| q)+H(p)+1 \]

类似地,可以得到期望码长的下界。

于是,若真实分布为 \(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不等式

回到之前讨论的码长最小化问题:

\[\begin{cases} \min L = \sum_{i=1}^m p_i l_i \\ \sum_{i=1}^m D^{-l_i} \leq 1 \end{cases} \]

现在我们考虑将条件放宽,之前是在前缀码的条件下考虑的,这一次我们把范围放大,在唯一可译码里面考虑。就相当于条件放宽了,那么L就有可能取到更小的值。 但是下面的定理告诉我们,这不可能,换言之,前缀码的性质已经足够好了,没必要再考虑唯一可译码(非前缀码)的部分了。

定理 5.5.1(McMillan) 任意惟一可译的 D 元码的码字长度必然满足 Kraft 不等式

\[\sum D^{-l_i} \leqslant 1 \]

反之,若给定满足上述不等式的一组码字长度,则可以构造出具有同样码字长度的惟一可译码。

证明略。


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。
image

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

我们规定左边的分支是 0,右边的分支是 1。
image

最后一次合并:只剩下 A(0.4) 和 N2(0.6) 了。合并它们,形成根节点 Root,概率为 1.0。

同样,左边分支 0,右边分支 1。

image

从最顶上的根节点(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)\) 区间中的一个子区间,用该区间内某个数的二进制表示作为码字。

具体步骤

  1. 符号排序

    • 将符号按概率降序排列:\(a_1 > a_2 > \cdots > a_K\)
    • 对应概率:\(p(a_1) \ge p(a_2) \ge \cdots \ge p(a_K)\)
  2. 累积概率定义

    \[F(a_k) = \sum_{a_i \ge a_k} p(a_i) \]

    • 这是从概率最大的符号开始累积
    • \(F(a_k)\) 表示符号 \(a_k\) 对应区间的左端点
  3. 修正累积概率

    \[\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))\)
  4. 二进制表示

    • \(\overline{F}(a_k)\) 转换为二进制小数
    • 取前 \(l_k\) 位作为码字
  5. 码长选择

    \[l_k = \lceil -\log p(a_k) \rceil + 1 \]

    • 保证码字能唯一确定符号 \(a_k\)
    • 多出的 1 位是为了避免边界歧义
  6. 性能保证

    • 平均码长:\(\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)\)

posted @ 2025-11-12 10:32  夜秋子  阅读(34)  评论(0)    收藏  举报