6信息论基础(第2版)

编码定理证明

随机编码论证

随机编码联合典型性信道编码定理

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第6章 编码定理证明(Coding Theorem Proofs)

一、导读

6.1 本章学习目标

通过本章的学习,你将能够:

理解随机编码论证的核心思想:掌握为什么随机选择码本可以证明好码的存在性

掌握联合典型性译码的分析方法:能够使用联合典型性进行错误概率分析

理解信源编码定理的完整证明:掌握典型序列编码和Kraft不等式在证明中的应用

理解信道编码定理的完整证明:掌握随机码本构造和Union bound的使用

掌握Fano不等式在反面证明中的应用:理解如何用Fano不等式推导 converse

理解典型序列译码与最大似然译码的关系:比较不同译码准则的性能

能够独立完成简单的信息论证明:培养严谨的信息论推理能力

理解存在性证明与构造性证明的区别:为什么香农的证明是非构造性的

6.2 为什么本章如此重要

编码定理的证明是信息论最精彩的部分之一。香农的伟大洞见在于:与其试图构造一个具体的好码,不如证明随机选择的码本以高概率是好的。这种概率方法彻底改变了人们对编码问题的看法。

理论重要性:

这些证明不仅确立了信息论的基本极限,还引入了许多重要的数学工具:典型序列、联合典型性、随机编码、Union bound、Fano不等式等。这些工具在网络信息论、统计学习理论、组合优化等领域都有广泛应用。

方法论重要性:

随机编码论证是一种强大的存在性证明技术。它告诉我们,虽然可能无法显式构造最优对象,但可以证明这样的对象"几乎总是"存在。这种思路在理论计算机科学中反复出现。

实践启发性:

虽然香农的随机码本在实际中不可行(复杂度太高),但证明中的关键思想启发了后续实用编码方案的设计。LDPC码和Turbo码的成功部分归功于它们近似实现了随机码本的性能。

6.3 核心问题引导

在学习本章之前,请思考以下问题:

为什么要用随机编码? 既然随机码本不实用,为什么还要研究它?

Union bound是什么? 为什么在错误概率分析中经常使用这个看似粗糙的工具?

典型序列译码和最大似然译码有什么区别? 哪个更容易分析?哪个性能更好?

Fano不等式如何用于证明反面? 它如何将错误概率与信息量联系起来?

为什么香农的证明是非构造性的? 存在性证明和构造性证明各有什么优缺点?

错误概率随码长如何变化? 为什么指数级衰减很重要?

随机编码的"平均"性能与"最坏情况"性能有什么关系?

如何从离散信道的证明推广到连续信道? 需要哪些技术调整?


二、核心概念详解

6.1 随机编码论证

6.1.1 基本思想

传统思路:要证明存在一个好码,尝试构造它。

香农的思路:证明随机选择的码本以正概率是好的,因此好码存在。

关键洞察:

  • 不需要找到具体的好码,只需要证明好码存在
  • 随机码本的平均性能给出了存在性保证
  • 如果平均错误概率很小,那么至少有一个码本的错误概率也很小

数学表述:

设 $\mathcal{C}$ 是所有可能码本的集合,$P_e(\mathcal{C})$ 是码本 $\mathcal{C}$ 的错误概率。

如果 $\mathbb{E}_{\mathcal{C}}[P_e(\mathcal{C})] < \epsilon$,则存在某个 $\mathcal{C}^$ 使得 $P_e(\mathcal{C}^) < \epsilon$。

6.1.2 随机码本的生成

对于离散无记忆信道,随机码本生成过程:

选择输入分布 $p(x)$(通常是最优分布 $p^*(x)$)

对于每个消息 $m \in \{1, 2, \ldots, 2^{nR}\}$:

- 独立生成码字 $x^n(m)$,每个符号独立服从 $p(x)$

所有码字构成码本 $\mathcal{C}$

重要性质:

  • 不同码字之间独立
  • 每个码字的符号之间独立(i.i.d.)
  • 码本是随机的,但一旦生成就固定

6.1.3 为什么随机码本有效

直觉解释:

随机码本的码字在序列空间中"均匀散布"。对于给定的接收序列 $y^n$,只有少数码字会与它"看起来相关"(即联合典型)。如果码率不太高,正确码字是唯一联合典型的可能性很大。

几何图像:

想象序列空间是一个高维球体。每个码字周围有一个"典型区域"(与之联合典型的接收序列集合)。如果码字数量不多,这些区域很少重叠,接收端可以准确判断哪个码字被发送。

代码示例6-1:随机码本可视化

python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

def visualize_random_codebook(n_symbols=2, n_dim=10, n_codewords=16):
    """
    可视化随机码本在高维空间中的分布
    
    参数:
        n_symbols: 字母表大小
        n_dim: 序列长度(维度)
        n_codewords: 码字数量
    """
    
    # 生成随机码本
    codebook = np.random.randint(0, n_symbols, size=(n_codewords, n_dim))
    
    # 降维到2D以便可视化
    pca = PCA(n_components=2)
    codebook_2d = pca.fit_transform(codebook.astype(float))
    
    plt.figure(figsize=(10, 8))
    plt.scatter(codebook_2d[:, 0], codebook_2d[:, 1], 
               c=range(n_codewords), cmap='viridis', s=100, edgecolors='black')
    
    for i in range(n_codewords):
        plt.annotate(f'{i}', (codebook_2d[i, 0], codebook_2d[i, 1]),
                    fontsize=8, ha='center', va='center')
    
    plt.xlabel('第一主成分', fontsize=12)
    plt.ylabel('第二主成分', fontsize=12)
    plt.title(f'随机码本可视化 ({n_codewords}个{n_dim}维码字)', fontsize=14)
    plt.colorbar(label='码字索引')
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('random_codebook_viz.png', dpi=150)
    plt.show()
    
    # 计算最小汉明距离
    min_dist = n_dim
    for i in range(n_codewords):
        for j in range(i+1, n_codewords):
            dist = np.sum(codebook[i] != codebook[j])
            min_dist = min(min_dist, dist)
    
    print(f"码本参数: {n_codewords}个码字, 长度{n_dim}")
    print(f"最小汉明距离: {min_dist}")
    print(f"归一化最小距离: {min_dist/n_dim:.4f}")

# 测试
visualize_random_codebook(n_symbols=2, n_dim=20, n_codewords=16)

6.2 联合典型性译码

6.2.1 译码规则

联合典型性译码器:

给定接收序列 $y^n$,译码器执行以下步骤:

寻找消息 $m$,使得 $(x^n(m), y^n) \in A_\epsilon^{(n)}$(联合典型集)

如果存在唯一的这样的 $m$,输出 $\hat{m} = m$

否则,报错(error)

与最大似然译码的比较:

最大似然译码:$\hat{m} = \arg\max_m p(y^n | x^n(m))$

  • 最大似然译码是最优的(最小错误概率),但分析复杂
  • 联合典型性译码次优,但易于分析
  • 对于大 $n$,两者性能接近

6.2.2 错误事件定义

定义以下错误事件:

  • $E_0$:正确码字与接收序列不联合典型,即 $(x^n(M), Y^n) \notin A_\epsilon^{(n)}$
  • $E_i$($i \neq M$):错误码字 $i$ 与接收序列联合典型,即 $(x^n(i), Y^n) \in A_\epsilon^{(n)}$

总错误事件:$E = E_0 \cup \bigcup_{i \neq M} E_i$

6.2.3 错误概率分析

步骤1:分析 $P(E_0)$

由AEP,当 $n$ 足够大时:

$$P(E_0) < \epsilon$$

步骤2:分析 $P(E_i)$ for $i \neq M$

由于码字独立生成,$x^n(i)$ 与 $Y^n$ 独立(当 $i \neq M$)。

由联合典型性引理:

$$P((x^n(i), Y^n) \in A_\epsilon^{(n)}) \leq 2^{-n(I(X;Y) - 3\epsilon)}$$

步骤3:Union bound

$$\begin{align*}

P(E) &= P(E_0 \cup \bigcup_{i \neq M} E_i) \\

&\leq P(E_0) + \sum_{i \neq M} P(E_i) \\

&< \epsilon + (2^{nR} - 1) \cdot 2^{-n(I(X;Y) - 3\epsilon)} \\

&< \epsilon + 2^{nR} \cdot 2^{-n(I(X;Y) - 3\epsilon)} \\

&= \epsilon + 2^{-n(I(X;Y) - R - 3\epsilon)}

\end{align*}$$

当 $R < I(X;Y) - 3\epsilon$ 时,第二项指数级趋于0。

结论:只要 $R < I(X;Y)$,可以选择足够大的 $n$ 使得 $P(E) < \epsilon'$。

代码示例6-2:错误概率仿真

python
import numpy as np
import matplotlib.pyplot as plt

def simulate_error_probability(n, R, C, n_trials=1000):
    """
    模拟错误概率随码长的变化
    
    参数:
        n: 码长
        R: 传输速率 (bits/use)
        C: 信道容量 (bits/use)
        n_trials: 试验次数
    
    返回:
        估计的错误概率
    """
    
    errors = 0
    
    for _ in range(n_trials):
        # 生成随机码本
        n_messages = int(2**(n * R))
        codebook = np.random.randint(0, 2, size=(n_messages, n))
        
        # 随机选择一个消息
        true_msg = np.random.randint(0, n_messages)
        true_codeword = codebook[true_msg]
        
        # 通过BSC(0.1)传输
        p = 0.1
        noise = np.random.rand(n) < p
        received = true_codeword ^ noise
        
        # 联合典型性译码(简化版:汉明距离最近)
        distances = [np.sum(codebook[m] != received) for m in range(n_messages)]
        decoded_msg = np.argmin(distances)
        
        if decoded_msg != true_msg:
            errors += 1
    
    return errors / n_trials

# 测试不同码长
C = 0.531  # BSC(0.1)的容量
R = 0.4    # 低于容量

n_values = [5, 10, 15, 20, 25, 30]
error_probs = []

for n in n_values:
    pe = simulate_error_probability(n, R, C, n_trials=200)
    error_probs.append(pe)
    print(f"n={n}: P_e = {pe:.4f}")

# 可视化
plt.figure(figsize=(10, 6))
plt.semilogy(n_values, error_probs, 'bo-', linewidth=2, markersize=8)
plt.xlabel('码长 n', fontsize=12)
plt.ylabel('错误概率 P_e', fontsize=12)
plt.title(f'错误概率 vs 码长 (R={R}, C={C})', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=1, color='r', linestyle='--', alpha=0.3, label='上界')
plt.legend()
plt.tight_layout()
plt.savefig('error_prob_vs_n.png', dpi=150)
plt.show()

6.3 信源编码定理证明

6.3.1 正面证明(Achievability)

目标:证明对于任意 $R > H(X)$,存在编码方案使得错误概率任意小。

证明:

典型集编码:

- 选择块长 $n$

- 枚举典型集 $A_\epsilon^{(n)}$ 中的序列

- 典型集大小 $|A_\epsilon^{(n)}| \leq 2^{n(H(X)+\epsilon)}$

- 为每个典型序列分配唯一的 $n(H(X)+\epsilon)$ 比特索引

编码:

- 如果 $x^n \in A_\epsilon^{(n)}$,输出其索引($n(H(X)+\epsilon)$ 比特)

- 否则,输出特殊标记 + 原始序列

错误概率:

- 错误发生在 $x^n \notin A_\epsilon^{(n)}$ 时

- 由AEP,$P(x^n \notin A_\epsilon^{(n)}) < \epsilon$(当 $n$ 足够大)

压缩率:

- 典型序列:$n(H(X)+\epsilon)$ 比特 → 每符号 $H(X)+\epsilon$ 比特

- 非典型序列:额外开销,但概率小于 $\epsilon$

- 平均压缩率:$R \approx H(X) + \epsilon$

当 $\epsilon \to 0$,$R \to H(X)$。证毕。

6.3.2 反面证明(Converse)

目标:证明任何压缩率 $R < H(X)$ 的编码方案必然有非零错误概率。

证明(使用Fano不等式):

设编码器 $f: \mathcal{X}^n \to \{1, 2, \ldots, 2^{nR}\}$,译码器 $g$。

定义估计值 $\hat{X}^n = g(f(X^n))$,错误概率 $P_e = P(X^n \neq \hat{X}^n)$。

由Fano不等式:

$$H(X^n|\hat{X}^n) \leq H_b(P_e) + P_e \log_2(|\mathcal{X}|^n - 1) \leq 1 + P_e n \log_2 |\mathcal{X}|$$

另一方面:

$$\begin{align*}

H(X^n) &= H(X^n|\hat{X}^n) + I(X^n;\hat{X}^n) \\

&\leq H(X^n|\hat{X}^n) + H(\hat{X}^n) \\

&\leq 1 + P_e n \log_2 |\mathcal{X}| + nR

\end{align*}$$

由于 $X^n$ 是i.i.d.,$H(X^n) = nH(X)$。因此:

$$nH(X) \leq 1 + P_e n \log_2 |\mathcal{X}| + nR$$

整理得:

$$P_e \geq \frac{n(H(X) - R) - 1}{n \log_2 |\mathcal{X}|} = \frac{H(X) - R - 1/n}{\log_2 |\mathcal{X}|}$$

当 $R < H(X)$ 且 $n \to \infty$ 时,$P_e$ 有正的下界。证毕。

6.4 信道编码定理证明

6.4.1 正面证明(Achievability)

目标:证明对于任意 $R < C$,存在编码方案使得错误概率任意小。

证明(随机编码 + 联合典型性译码):

码本生成:

- 选择最优输入分布 $p^*(x)$

- 生成 $2^{nR}$ 个独立码字,每个符号i.i.d.服从 $p^*(x)$

编码:发送消息 $m$ 对应的码字 $x^n(m)$

译码:联合典型性译码

错误分析(如前所述):

$$P(E) \leq \epsilon + 2^{-n(I(X;Y) - R - 3\epsilon)}$$

当 $R < I(X;Y) = C$ 时,$P(E) \to 0$。

6.4.2 反面证明(Converse)

目标:证明任何速率 $R > C$ 的编码方案必然有非零错误概率。

证明:

设有一个 $(2^{nR}, n)$ 码,消息 $M$ 均匀分布于 $\{1, \ldots, 2^{nR}\}$。

考虑马尔可夫链:$M \to X^n \to Y^n \to \hat{M}$

由数据处理不等式:

$$I(M;Y^n) \leq I(X^n;Y^n)$$

计算右边:

$$\begin{align*}

I(X^n;Y^n) &= H(Y^n) - H(Y^n|X^n) \\

&= H(Y^n) - \sum_{i=1}^n H(Y_i|X_i) \quad (\text{无记忆性})\\

&\leq \sum_{i=1}^n [H(Y_i) - H(Y_i|X_i)] \\

&= \sum_{i=1}^n I(X_i;Y_i) \\

&\leq nC

\end{align*}$$

所以 $I(M;Y^n) \leq nC$。

另一方面,由Fano不等式:

$$H(M|\hat{M}) \leq 1 + P_e nR$$

而:

$$\begin{align*}

H(M) &= H(M|\hat{M}) + I(M;\hat{M}) \\

&\leq 1 + P_e nR + I(M;Y^n) \quad (\text{数据处理})\\

&\leq 1 + P_e nR + nC

\end{align*}$$

由于 $M$ 均匀分布,$H(M) = nR$。因此:

$$nR \leq 1 + P_e nR + nC$$

整理得:

$$P_e \geq 1 - \frac{1}{nR} - \frac{C}{R}$$

当 $R > C$ 且 $n \to \infty$ 时,$P_e \geq 1 - C/R > 0$。证毕。

代码示例6-3:验证Fano不等式在反面证明中的作用

python
import numpy as np
import matplotlib.pyplot as plt

def fano_converse_bound(R, C, n):
    """
    使用Fano不等式的反面上界
    
    参数:
        R: 传输速率
        C: 信道容量
        n: 码长
    
    返回:
        错误概率下界
    """
    return max(0, 1 - 1/(n*R) - C/R)

# 测试
C = 0.5  # 信道容量
R_values = np.linspace(0.51, 1.5, 50)

plt.figure(figsize=(10, 6))

for n in [10, 50, 100, 500]:
    pe_bounds = [fano_converse_bound(R, C, n) for R in R_values]
    plt.plot(R_values, pe_bounds, linewidth=2, label=f'n={n}')

plt.xlabel('传输速率 R (bits/use)', fontsize=12)
plt.ylabel('错误概率下界', fontsize=12)
plt.title(f'Fano不等式给出的错误概率下界 (C={C})', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axvline(x=C, color='r', linestyle='--', alpha=0.5, label=f'R=C={C}')
plt.legend()
plt.ylim(0, 1)
plt.tight_layout()
plt.savefig('fano_converse.png', dpi=150)
plt.show()

print("Fano不等式反面证明分析")
print("=" * 60)
print(f"信道容量 C = {C}")
print()
for R in [0.6, 0.8, 1.0, 1.2]:
    for n in [10, 100, 1000]:
        pe = fano_converse_bound(R, C, n)
        print(f"R={R}, n={n}: P_e ≥ {pe:.4f}")
    print()

6.5 错误指数

6.5.1 定义

错误指数度量了错误概率随码长的衰减速率:

$$E(R) = \lim_{n \to \infty} -\frac{1}{n} \log_2 P_e(n, R)$$

其中 $P_e(n, R)$ 是码长为 $n$、速率为 $R$ 的最优码的最小错误概率。

6.5.2 Gallager边界

Gallager证明了以下上下界:

上界(随机编码上界):

$$P_e \leq 2^{-nE_r(R)}$$

其中 $E_r(R)$ 是随机编码指数。

下界(球包下界):

$$P_e \geq 2^{-nE_{sp}(R)}$$

6.5.3 物理意义

  • 当 $R$ 接近 $C$ 时,错误指数趋近于0(衰减很慢)
  • 当 $R$ 远离 $C$ 时,错误指数增大(衰减很快)
  • 实际系统设计中,需要在速率和可靠性之间权衡

代码示例6-4:错误指数计算

python
import numpy as np
import matplotlib.pyplot as plt

def random_coding_exponent_bsc(R, C, p):
    """
    BSC信道的随机编码指数(简化模型)
    
    参数:
        R: 速率
        C: 容量
        p: 交叉概率
    
    返回:
        错误指数估计
    """
    if R >= C:
        return 0
    
    # 简化模型:线性近似
    return (C - R) * np.log2(np.e) * 0.5  # 系数是示意性的

# 测试
p = 0.1
C = 1 - (-p*np.log2(p) - (1-p)*np.log2(1-p))

R_values = np.linspace(0.01, C, 50)
exponents = [random_coding_exponent_bsc(R, C, p) for R in R_values]

plt.figure(figsize=(10, 6))
plt.plot(R_values, exponents, 'b-', linewidth=2.5)
plt.xlabel('传输速率 R (bits/use)', fontsize=12)
plt.ylabel('错误指数 E(R)', fontsize=12)
plt.title(f'BSC信道的随机编码指数 (p={p})', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axvline(x=C, color='r', linestyle='--', alpha=0.5, label=f'C={C:.4f}')
plt.legend()
plt.tight_layout()
plt.savefig('error_exponent.png', dpi=150)
plt.show()

print(f"BSC(p={p}) 错误指数分析")
print(f"容量 C = {C:.4f}")
print()
for R in [0.1, 0.2, 0.3, 0.4, 0.5]:
    if R < C:
        E = random_coding_exponent_bsc(R, C, p)
        print(f"R={R}: E(R)={E:.4f}, 衰减率 ~ 2^(-{E:.4f}n)")

三、程序员的视角

6.1 证明技巧的实际应用

Union bound:在系统可靠性分析中广泛使用。例如,分布式系统中多个组件同时失效的概率上界。

随机编码思想:在机器学习中,随机初始化神经网络的权重本质上也是一种"随机编码",证明了好网络的存在。

典型性论证:在大数据处理中,假设数据是"典型的"可以简化算法设计。

6.2 从理论到实践

虽然香农的证明是非构造性的,但它启发了许多实用算法:

  • LDPC码:近似实现随机码本的性能,使用稀疏图结构降低复杂度
  • Turbo码:通过迭代译码逼近容量
  • Polar码:第一个被证明可以达到容量的实用码

6.3 常见陷阱

混淆存在性和构造性:证明好码存在不等于能高效找到它

忽略常数因子:渐近分析可能隐藏重要的常数因子

有限码长效应:理论结果是 $n \to \infty$ 的极限,实际系统 $n$ 有限


四、代码实战

6.1 完整的信道编码定理仿真

python
import numpy as np
import matplotlib.pyplot as plt

class ChannelCodingSimulation:
    """信道编码定理仿真"""
    
    def __init__(self, channel_type='bsc', channel_param=0.1):
        self.channel_type = channel_type
        self.channel_param = channel_param
        
        if channel_type == 'bsc':
            self.capacity = 1 - (-channel_param*np.log2(channel_param) - 
                                (1-channel_param)*np.log2(1-channel_param))
    
    def generate_random_codebook(self, n, n_messages):
        """生成随机码本"""
        return np.random.randint(0, 2, size=(n_messages, n))
    
    def transmit_bsc(self, codeword, p):
        """通过BSC传输"""
        noise = np.random.rand(len(codeword)) < p
        return codeword ^ noise
    
    def decode_joint_typicality(self, received, codebook, n_messages):
        """
        联合典型性译码(简化为最小汉明距离)
        """
        distances = [np.sum(codebook[m] != received) for m in range(n_messages)]
        return np.argmin(distances)
    
    def simulate(self, n, R, n_trials=100):
        """
        仿真通信系统
        
        参数:
            n: 码长
            R: 速率
            n_trials: 试验次数
        
        返回:
            错误概率
        """
        n_messages = int(2**(n * R))
        errors = 0
        
        for _ in range(n_trials):
            # 生成码本
            codebook = self.generate_random_codebook(n, n_messages)
            
            # 随机选择消息
            true_msg = np.random.randint(0, n_messages)
            
            # 传输
            received = self.transmit_bsc(codebook[true_msg], self.channel_param)
            
            # 译码
            decoded_msg = self.decode_joint_typicality(received, codebook, n_messages)
            
            if decoded_msg != true_msg:
                errors += 1
        
        return errors / n_trials


# 运行仿真
if __name__ == "__main__":
    sim = ChannelCodingSimulation(channel_type='bsc', channel_param=0.1)
    
    print("信道编码定理仿真")
    print("=" * 60)
    print(f"信道: BSC(p=0.1), 容量 C = {sim.capacity:.4f} bits/use")
    print()
    
    R = 0.4  # 低于容量
    
    n_values = [5, 10, 15, 20, 25, 30]
    error_probs = []
    
    for n in n_values:
        pe = sim.simulate(n, R, n_trials=200)
        error_probs.append(pe)
        print(f"n={n:2d}: P_e = {pe:.4f}")
    
    # 可视化
    plt.figure(figsize=(10, 6))
    plt.semilogy(n_values, error_probs, 'bo-', linewidth=2, markersize=8)
    plt.xlabel('码长 n', fontsize=12)
    plt.ylabel('错误概率 P_e', fontsize=12)
    plt.title(f'错误概率 vs 码长 (R={R}, C={sim.capacity:.4f})', fontsize=14)
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('coding_theorem_simulation.png', dpi=150)
    plt.show()

6.2 Fano不等式验证工具

python
import numpy as np

def verify_fano_inequality(n_classes, accuracy):
    """
    验证Fano不等式
    
    参数:
        n_classes: 类别数
        accuracy: 分类准确率
    
    返回:
        条件熵, Fano上界
    """
    p_error = 1 - accuracy
    
    # 计算条件熵 H(Y|Ŷ)
    # 假设错误均匀分布在其他类上
    h_error = np.log2(n_classes - 1) if n_classes > 1 else 0
    h_binary = -p_error * np.log2(p_error + 1e-30) - (1-p_error) * np.log2(1-p_error + 1e-30)
    
    h_conditional = h_binary + p_error * h_error
    
    # Fano上界
    fanos_upper = h_binary + p_error * np.log2(n_classes)
    
    return h_conditional, fanos_upper

# 测试
print("Fano不等式验证")
print("=" * 60)

for n_cls in [2, 4, 10, 100]:
    for acc in [0.9, 0.95, 0.99]:
        h_cond, fanos = verify_fano_inequality(n_cls, acc)
        print(f"类别={n_cls:3d}, 准确率={acc}: H(Y|Ŷ)={h_cond:.4f}, Fano上界={fanos:.4f}, 满足={h_cond <= fanos + 1e-6}")
    print()

五、深入思考

5.1 历史背景

香农的原始证明使用了典型序列和随机编码的思想,但当时的证明不够严格。后续研究者(如Wolfowitz, Feinstein, Gallager等)完善了证明细节。

Gallager在1968年的博士论文中系统地研究了错误指数,建立了随机编码上界和球包下界。这些结果至今仍是编码理论的基础。

5.2 前沿方向

有限块长分析:经典结果是渐近的,现代研究关注有限码长下的精确界限。Polyanskiy等人提出的"正常近似"给出了实用的性能估计。

量子信道编码:量子版本的信道编码定理涉及量子典型子空间和量子联合典型性,证明技术更加复杂。

网络信息论:多用户场景下的编码定理证明需要处理干扰、协作等复杂因素。

5.3 延伸阅读

Cover & Thomas《信息论基础》第7章、第8章

Gallager《Information Theory and Reliable Communication》

Polyanskiy et al. "Channel Coding Rate in the Finite Blocklength Regime"


六、实验笔记

实验1:验证Union bound的紧度

目标:研究Union bound在错误概率分析中的紧度。

步骤:

仿真随机码本的实际错误概率

计算Union bound给出的上界

比较两者的差距

分析差距随码长和速率的变化

预期结果:Union bound在低速率时较松,在高速率时较紧。

实验2:不同译码准则的比较

目标:比较联合典型性译码、最大似然译码和最小距离译码的性能。

步骤:

实现三种译码器

在相同码本和信道条件下测试

比较错误概率和计算复杂度

思考题:

  • 哪种译码器最容易分析?
  • 哪种性能最好?
  • 实际系统中常用哪种?

七、本章小结

本章详细介绍了信源编码定理和信道编码定理的证明。

随机编码论证是信息论证明的核心技术。通过证明随机码本的平均性能良好,我们得出好码存在的结论。这种方法虽然非构造性,但为实用编码方案的设计提供了指导。

联合典型性译码虽然不是最优译码准则,但其易于分析的特性使其成为理论证明的首选。对于大码长,它的性能接近最大似然译码。

Fano不等式在反面证明中起关键作用,它将错误概率与条件熵联系起来,从而推导出速率的下界。

错误指数量化了错误概率的衰减速率,在系统设计中需要在速率和可靠性之间权衡。

理解这些证明不仅有助于掌握信息论的理论基础,还能培养处理复杂概率论证的能力。这些技巧在机器学习、统计学、理论计算机科学等领域都有广泛应用。


八、习题

习题6.1(Union bound):设某系统有10个独立组件,每个组件失效概率为0.01。使用Union bound给出至少一个组件失效的概率上界,并计算精确值。

习题6.2(Fano不等式):对于一个4类分类问题,如果准确率为95%,使用Fano不等式给出条件熵的上界。

习题6.3(随机编码):证明对于BSC信道,随机生成的码本中,任意两个码字的期望汉明距离为 $n/2$。

习题6.4(编程题):实现一个完整的信道编码定理仿真,包括码本生成、传输、译码和错误统计。绘制错误概率随码长变化的曲线。

习题6.5(挑战题):推导BSC信道的随机编码指数 $E_r(R)$ 的表达式。

习题6.6(分析题):比较信源编码定理和信道编码定理的证明思路,指出它们的相似之处和差异。

习题6.7(应用题):在设计一个深空通信系统时,你需要选择码长和速率。已知信道容量为0.5 bits/use,要求错误概率小于 $10^{-6}$。根据编码定理,你会如何选择参数?

习题6.8(证明题):证明对于对称信道,均匀输入分布达到容量。

习题6.9(开放性问题):研究Polar码如何实现对信道容量的逼近,撰写一篇500字左右的分析报告。

习题6.10(综合题):结合信源编码和信道编码,设计一个端到端的通信系统。分析系统的总失真(源失真 + 信道错误引起的失真)与传输速率的关系。

6/9编码定理
0%