第2章 熵的关系与性质(Entropy Relations and Properties)
一、导读
2.1 本章学习目标
通过本章的学习,你将能够:
掌握熵的基本不等式:理解并证明非负性、最大值原理、吉布斯不等式等基础性质
熟练运用链式法则:能够将联合熵分解为条件熵之和,处理多变量信息论问题
理解数据处理不等式:掌握信息在传递过程中不会增加这一核心原理,理解其在统计推断中的意义
掌握Fano不等式:理解错误概率与条件熵之间的关系,能够应用Fano不等式推导下界
理解熵的凸性与凹性:区分熵函数的凹性和相对熵的凸性,理解这些性质在优化中的应用
掌握典型不等式的证明技巧:学会使用Jensen不等式、对数求和不等式等工具证明信息论不等式
理解充分统计量与信息的关系:掌握数据处理不等式在统计学中的应用
能够解决复杂的信息论不等式问题:综合运用各种性质和技巧进行理论推导
2.2 为什么本章如此重要
如果说第1章介绍了信息论的"词汇",那么本章则教授信息论的"语法"。熵的各种性质和不等式构成了信息论推理的基础规则,几乎所有重要的信息论结果都依赖于这些基本性质。
理论重要性:
信道编码定理的证明依赖于数据处理不等式和典型序列的性质;率失真理论的核心是Fano不等式的推广;网络信息论中的各种容量区域边界都源于基本的熵不等式。没有这些工具,我们无法建立信息论的理论大厦。
实践重要性:
在机器学习中,交叉熵损失的凸性保证了优化的可行性;在信号处理中,数据处理不等式告诉我们不能通过后处理提高信噪比;在统计推断中,充分统计量的概念直接来自数据处理不等式。理解这些性质能够帮助我们避免设计不可能成功的算法。
方法论重要性:
信息论不等式的证明技巧(如Jensen不等式的应用、典型化论证、辅助随机变量方法)是理论计算机科学和统计学习理论中的重要工具。掌握这些技巧不仅有助于理解信息论,也能提升整体的数学推理能力。
本章的内容看似抽象,但每一个不等式背后都有深刻的物理直觉和广泛的应用场景。我们将通过大量的例子和代码演示,帮助你建立对这些性质的直观理解。
2.3 核心问题引导
在学习本章之前,请思考以下问题:
为什么知道额外信息永远不会增加平均不确定性? 这听起来显而易见,但如何用数学严格表述和证明?条件熵 $H(Y|X) \leq H(Y)$ 的等号何时成立?
如果我对数据进行任何处理,信息只会丢失吗? 数据处理不等式 $I(X;Y) \geq I(X;Z)$(当 $X \to Y \to Z$)似乎暗示了这一点。但这与我们常说的"特征工程可以提高模型性能"是否矛盾?
为什么均匀分布具有最大熵? 这个事实在约束优化中有何应用?如果给定均值和方差,什么分布具有最大熵?
Fano不等式如何量化"猜测的难度"? 如果我们试图从观测 $Y$ 猜测随机变量 $X$,错误概率 $P_e$ 与条件熵 $H(X|Y)$ 之间有什么定量关系?
熵函数是凹的还是凸的?相对熵呢? 这些凸性性质如何保证某些优化问题的全局最优解存在?
为什么两个独立实验的联合熵等于各自熵之和? 如果实验不独立,联合熵会更大还是更小?
对数求和不等式与吉布斯不等式有什么关系? 它们都是基于对数函数的什么性质?
充分统计量为什么不损失信息? 如何用数据处理不等式刻画充分性的概念?
二、核心概念详解
2.1 基本不等式
2.1.1 非负性
定理:对于任意离散随机变量 $X$,有 $H(X) \geq 0$,等号成立当且仅当 $X$ 是确定性变量(即存在 $x_0$ 使得 $P(X=x_0)=1$)。
证明:由于 $0 \leq p(x) \leq 1$,所以 $\log_2 p(x) \leq 0$,因此 $-p(x)\log_2 p(x) \geq 0$。求和后仍非负。
等号成立的条件是所有项 $-p(x)\log_2 p(x)$ 都为0,这要求除了一个 $x_0$ 外所有 $p(x)=0$,且 $p(x_0)=1$。
直观理解:信息量不能为负——你接收到的消息要么包含信息,要么不包含,但不会"减少"你的信息。
2.1.2 最大值原理
定理:对于取值于有限集合 $\mathcal{X}$ 的随机变量 $X$,有:
$$H(X) \leq \log_2 |\mathcal{X}|$$
等号成立当且仅当 $X$ 服从均匀分布。
证明(使用吉布斯不等式):
设 $u(x) = 1/|\mathcal{X}|$ 为均匀分布。则:
$$\begin{align*}
0 \leq D_{KL}(p || u) &= \sum_x p(x) \log_2 \frac{p(x)}{u(x)} \\
&= \sum_x p(x) \log_2 p(x) - \sum_x p(x) \log_2 \frac{1}{|\mathcal{X}|} \\
&= -H(X) + \log_2 |\mathcal{X}|
\end{align*}$$
因此 $H(X) \leq \log_2 |\mathcal{X}|$。
应用:这个不等式给出了数据压缩的绝对极限。例如,一个有256个可能值的字节,其熵最多为8比特。如果实际熵只有4比特,说明存在冗余,可以压缩。
代码示例2-1:验证最大熵原理
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
def entropy(p, base=2):
"""计算熵"""
p = np.array(p, dtype=float)
p = p[p > 0]
return -np.sum(p * np.log(p) / np.log(base))
# 验证:对于3取值的随机变量,均匀分布熵最大
print("验证最大熵原理(3个取值)")
print("-" * 50)
n = 3
max_entropy = np.log2(n)
print(f"理论最大熵: {max_entropy:.4f} bits")
print(f"均匀分布 [1/3, 1/3, 1/3]: {entropy([1/3, 1/3, 1/3]):.4f} bits")
# 生成大量随机分布并验证
np.random.seed(42)
max_found = 0
max_dist = None
for _ in range(10000):
# 从Dirichlet分布采样
dist = np.random.dirichlet(np.ones(n))
h = entropy(dist)
if h > max_found:
max_found = h
max_dist = dist
print(f"\n随机搜索最大熵: {max_found:.4f} bits")
print(f"对应分布: {max_dist.round(4)}")
print(f"与均匀分布的差距: {np.abs(max_dist - 1/n).max():.6f}")
# 可视化:二元分布的熵随参数变化
plt.figure(figsize=(10, 6))
p_values = np.linspace(0.001, 0.999, 1000)
h_values = [entropy([p, 1-p]) for p in p_values]
plt.plot(p_values, h_values, 'b-', linewidth=2.5)
plt.axvline(x=0.5, color='r', linestyle='--', alpha=0.7, label='最大值点 p=0.5')
plt.axhline(y=1, color='g', linestyle='--', alpha=0.7, label='最大熵=1 bit')
plt.xlabel('P(X=0)', fontsize=12)
plt.ylabel('熵 H(X) (bits)', fontsize=12)
plt.title('二元随机变量的熵函数', fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=11)
plt.tight_layout()
plt.savefig('max_entropy_binary.png', dpi=150)
plt.show()
print("\n结论:均匀分布确实达到最大熵")2.1.3 条件作用减少熵
定理:对于任意两个随机变量 $X$ 和 $Y$,有:
$$H(Y|X) \leq H(Y)$$
等号成立当且仅当 $X$ 和 $Y$ 独立。
证明:
$$\begin{align*}
H(Y) - H(Y|X) &= [H(Y) + H(X)] - [H(X) + H(Y|X)] \\
&= H(X) + H(Y) - H(X,Y) \\
&= I(X;Y) \geq 0
\end{align*}$$
直观理解:知道额外的信息 $X$,平均而言不会使你对 $Y$ 更不确定。这可能看起来显而易见,但在复杂系统中,这种直觉有时会失效(如辛普森悖论),因此需要严格的数学保证。
重要推论:多次条件作用仍然减少熵:
$$H(Y|X_1, X_2, \ldots, X_n) \leq H(Y|X_1, \ldots, X_{n-1}) \leq \cdots \leq H(Y)$$
代码示例2-2:条件熵递减演示
import numpy as np
def conditional_entropy_chain_demo():
"""
演示条件熵随条件增多而递减
"""
# 构造一个简单模型
# X1, X2 是独立的公平硬币
# Y = X1 XOR X2 (异或)
# 联合分布
joint = np.zeros((2, 2, 2))
for x1 in range(2):
for x2 in range(2):
y = x1 ^ x2
joint[x1, x2, y] = 0.25
# 计算各种熵
# H(Y)
marginal_y = joint.sum(axis=(0, 1))
h_y = entropy(marginal_y)
# H(Y|X1)
# P(Y|X1=0): 当X1=0时,Y=X2,所以P(Y=0|X1=0)=0.5, P(Y=1|X1=0)=0.5
# P(Y|X1=1): 当X1=1时,Y=1-X2,所以P(Y=0|X1=1)=0.5, P(Y=1|X1=1)=0.5
h_y_given_x1 = 1.0 # 仍然是均匀分布
# H(Y|X1,X2): 已知X1和X2,Y完全确定
h_y_given_x1x2 = 0.0
print("条件熵递减演示")
print("-" * 50)
print(f"H(Y) = {h_y:.4f} bits")
print(f"H(Y|X1) = {h_y_given_x1:.4f} bits")
print(f"H(Y|X1,X2) = {h_y_given_x1x2:.4f} bits")
print(f"\n递减关系: H(Y) >= H(Y|X1) >= H(Y|X1,X2)? ", end="")
print(f"{h_y >= h_y_given_x1 >= h_y_given_x1x2}")
# 另一个例子:部分信息
print("\n\n部分信息示例")
print("-" * 50)
# X是骰子结果,Y是X的奇偶性
# P(X=i) = 1/6, Y = X mod 2
p_x = np.ones(6) / 6
# P(Y=0|X) = 1 if X in {2,4,6}, else 0
# P(Y=1|X) = 1 if X in {1,3,5}, else 0
# H(Y)
p_y = [0.5, 0.5] # 一半奇数一半偶数
h_y = entropy(p_y)
# H(Y|X): 已知X,Y完全确定
h_y_given_x = 0
# H(X|Y): 已知奇偶,还有3种可能
# P(X=i|Y=0) = 1/3 for i in {2,4,6}
h_x_given_y_even = entropy([1/3, 1/3, 1/3])
h_x_given_y = h_x_given_y_even # 对称
print(f"H(Y) = {h_y:.4f} bits")
print(f"H(Y|X) = {h_y_given_x:.4f} bits (已知点数,奇偶确定)")
print(f"H(X|Y) = {h_x_given_y:.4f} bits (已知奇偶,还剩3种可能)")
print(f"H(X) = {entropy(p_x):.4f} bits")
print(f"\n互信息 I(X;Y) = H(X) - H(X|Y) = {entropy(p_x) - h_x_given_y:.4f} bits")
conditional_entropy_chain_demo()2.2 链式法则及其推广
2.2.1 熵的链式法则
定理:对于两个随机变量 $X$ 和 $Y$:
$$H(X,Y) = H(X) + H(Y|X) = H(Y) + H(X|Y)$$
证明:
$$\begin{align*}
H(X,Y) &= -\sum_{x,y} p(x,y) \log_2 p(x,y) \\
&= -\sum_{x,y} p(x,y) \log_2 [p(x)p(y|x)] \\
&= -\sum_{x,y} p(x,y) \log_2 p(x) - \sum_{x,y} p(x,y) \log_2 p(y|x) \\
&= -\sum_x p(x) \log_2 p(x) - \sum_x p(x) \sum_y p(y|x) \log_2 p(y|x) \\
&= H(X) + H(Y|X)
\end{align*}$$
推广到多个变量:
$$H(X_1, X_2, \ldots, X_n) = \sum_{i=1}^n H(X_i | X_1, \ldots, X_{i-1})$$
这个公式表明,描述一组变量的信息可以分解为逐步描述每个变量的信息之和。
直观理解:想象你要描述一个句子。你可以先描述第一个词,然后在已知第一个词的条件下描述第二个词,依此类推。总的信息量就是每一步信息量的和。
2.2.2 互信息的链式法则
定理:对于随机变量 $X_1, X_2, \ldots, X_n$ 和 $Y$:
$$I(X_1, X_2, \ldots, X_n; Y) = \sum_{i=1}^n I(X_i; Y | X_1, \ldots, X_{i-1})$$
其中条件互信息定义为:
$$I(X;Y|Z) = H(X|Z) - H(X|Y,Z) = H(Y|Z) - H(Y|X,Z)$$
证明:利用熵的链式法则:
$$\begin{align*}
I(X_1, \ldots, X_n; Y) &= H(Y) - H(Y|X_1, \ldots, X_n) \\
&= H(Y) - \left[H(Y|X_1) + \sum_{i=2}^n [H(Y|X_1,\ldots,X_{i-1}) - H(Y|X_1,\ldots,X_i)]\right] \\
&= [H(Y) - H(Y|X_1)] + \sum_{i=2}^n [H(Y|X_1,\ldots,X_{i-1}) - H(Y|X_1,\ldots,X_i)] \\
&= I(X_1;Y) + \sum_{i=2}^n I(X_i;Y|X_1,\ldots,X_{i-1})
\end{align*}$$
应用:这个公式在特征选择中非常有用。它告诉我们,逐个添加特征时,每个新特征的贡献是它与标签的条件互信息。
代码示例2-3:链式法则验证
import numpy as np
from itertools import product
def verify_chain_rule():
"""验证熵和互信息的链式法则"""
# 构造一个三变量联合分布
# X, Y 是独立的公平硬币
# Z = X XOR Y
joint = np.zeros((2, 2, 2))
for x in range(2):
for y in range(2):
z = x ^ y
joint[x, y, z] = 0.25
# 计算边缘分布
marginal_xy = joint.sum(axis=2)
marginal_x = marginal_xy.sum(axis=1)
marginal_y = marginal_xy.sum(axis=0)
# 计算各种熵
def calc_entropy(dist):
flat = dist.flatten()
flat = flat[flat > 0]
return -np.sum(flat * np.log2(flat))
h_x = entropy(marginal_x)
h_y = entropy(marginal_y)
h_xy = calc_entropy(marginal_xy)
# H(Z)
marginal_z = joint.sum(axis=(0, 1))
h_z = entropy(marginal_z)
# H(X,Y,Z)
h_xyz = calc_entropy(joint)
print("熵的链式法则验证")
print("-" * 50)
print(f"H(X) = {h_x:.4f}")
print(f"H(Y) = {h_y:.4f}")
print(f"H(Z) = {h_z:.4f}")
print(f"H(X,Y) = {h_xy:.4f}")
print(f"H(X,Y,Z) = {h_xyz:.4f}")
# 验证: H(X,Y,Z) = H(X) + H(Y|X) + H(Z|X,Y)
# H(Y|X) = H(X,Y) - H(X)
h_y_given_x = h_xy - h_x
# H(Z|X,Y) = 0 (因为Z由X,Y确定)
h_z_given_xy = 0
lhs = h_xyz
rhs = h_x + h_y_given_x + h_z_given_xy
print(f"\n验证: H(X,Y,Z) = H(X) + H(Y|X) + H(Z|X,Y)")
print(f"左边 = {lhs:.4f}")
print(f"右边 = {h_x:.4f} + {h_y_given_x:.4f} + {h_z_given_xy:.4f} = {rhs:.4f}")
print(f"相等? {np.isclose(lhs, rhs)}")
# 互信息的链式法则
# I(X,Y;Z) = I(X;Z) + I(Y;Z|X)
def calc_mutual_info(joint_2d):
marginal_x = joint_2d.sum(axis=1)
marginal_y = joint_2d.sum(axis=0)
mi = 0
for i in range(joint_2d.shape[0]):
for j in range(joint_2d.shape[1]):
pxy = joint_2d[i, j]
px = marginal_x[i]
py = marginal_y[j]
if pxy > 0 and px > 0 and py > 0:
mi += pxy * np.log2(pxy / (px * py))
return mi
# I(X;Z)
joint_xz = joint.sum(axis=1)
i_xz = calc_mutual_info(joint_xz)
# I(Y;Z)
joint_yz = joint.sum(axis=0)
i_yz = calc_mutual_info(joint_yz)
# I(X,Y;Z)
# 需要将(X,Y)视为单个变量
joint_xyz_flat = joint.reshape(4, 2) # 4种(X,Y)组合,2种Z
i_xyz_z = calc_mutual_info(joint_xyz_flat)
print(f"\n互信息计算")
print("-" * 50)
print(f"I(X;Z) = {i_xz:.4f}")
print(f"I(Y;Z) = {i_yz:.4f}")
print(f"I(X,Y;Z) = {i_xyz_z:.4f}")
# I(Y;Z|X) = I(X,Y;Z) - I(X;Z)
i_yz_given_x = i_xyz_z - i_xz
print(f"I(Y;Z|X) = {i_yz_given_x:.4f}")
print(f"\n验证: I(X,Y;Z) = I(X;Z) + I(Y;Z|X)")
print(f"{i_xyz_z:.4f} = {i_xz:.4f} + {i_yz_given_x:.4f}? {np.isclose(i_xyz_z, i_xz + i_yz_given_x)}")
verify_chain_rule()2.3 数据处理不等式
2.3.1 马尔可夫链与信息处理
定义:三个随机变量 $X, Y, Z$ 形成马尔可夫链 $X \to Y \to Z$,如果给定 $Y$,$X$ 和 $Z$ 条件独立,即:
$$P(X,Z|Y) = P(X|Y)P(Z|Y)$$
等价地,$P(Z|X,Y) = P(Z|Y)$,即 $Z$ 只依赖于 $Y$,不直接依赖于 $X$。
直观理解:马尔可夫链描述了一个信息处理过程:$X$ 是原始数据,$Y$ 是对 $X$ 的处理结果,$Z$ 是对 $Y$ 的进一步处理。关键点是 $Z$ 不直接"看到" $X$,只能通过 $Y$ 间接获取关于 $X$ 的信息。
2.3.2 数据处理不等式
定理(数据处理不等式):如果 $X \to Y \to Z$ 形成马尔可夫链,则:
$$I(X;Y) \geq I(X;Z)$$
等号成立当且仅当 $X \to Z \to Y$ 也形成马尔可夫链(即 $Z$ 是关于 $X$ 的充分统计量)。
证明:
利用互信息的链式法则:
$$I(X;Y,Z) = I(X;Z) + I(X;Y|Z) = I(X;Y) + I(X;Z|Y)$$
由于 $X \to Y \to Z$,我们有 $I(X;Z|Y) = 0$(给定 $Y$,$X$ 和 $Z$ 独立)。因此:
$$I(X;Z) + I(X;Y|Z) = I(X;Y)$$
由于 $I(X;Y|Z) \geq 0$,所以 $I(X;Y) \geq I(X;Z)$。
直观理解:你对数据进行任何处理(函数变换、噪声添加、降维等),关于原始输入的信息只会丢失,不会增加。你不能从后处理中"创造"出新的关于输入的信息。
重要推论:
无噪声函数不增加信息:如果 $Y = f(X)$,则 $I(X;Y) \leq H(X)$,等号成立当且仅当 $f$ 是一对一的
噪声总是减少信息:如果 $Y = X + N$(加性噪声),则 $I(X;Y) < H(X)$(除非噪声为零)
级联处理的累积损失:如果 $X \to Y \to Z \to W$,则 $I(X;Y) \geq I(X;Z) \geq I(X;W)$
应用场景:
- 特征工程的界限:无论你怎么变换特征,新特征关于标签的互信息不能超过原始特征关于标签的互信息
- 通信系统:中继节点不能增加关于源的信息
- 隐私保护:数据脱敏处理后,攻击者能获得的关于原始数据的信息有上限
代码示例2-4:数据处理不等式演示
import numpy as np
def data_processing_inequality_demo():
"""
演示数据处理不等式
场景:X是原始信号,Y是通过噪声信道接收的信号,Z是对Y的量化
"""
# X: 4个可能的信号值
# Y: 接收到的信号(有噪声)
# Z: 对Y的粗量化
# P(X)
p_x = np.array([0.25, 0.25, 0.25, 0.25])
# P(Y|X): 噪声信道
# Y也有4个值,但有噪声
p_y_given_x = np.array([
[0.7, 0.1, 0.1, 0.1], # X=0时,Y大多是0
[0.1, 0.7, 0.1, 0.1], # X=1时,Y大多是1
[0.1, 0.1, 0.7, 0.1], # ...
[0.1, 0.1, 0.1, 0.7]
])
# P(Z|Y): 量化器(将4个值量化为2个)
# Z=0 if Y in {0,1}, Z=1 if Y in {2,3}
p_z_given_y = np.array([
[1, 0], # Y=0 -> Z=0
[1, 0], # Y=1 -> Z=0
[0, 1], # Y=2 -> Z=1
[0, 1] # Y=3 -> Z=1
])
# 计算联合分布 P(X,Y)
joint_xy = np.zeros((4, 4))
for i in range(4):
for j in range(4):
joint_xy[i, j] = p_x[i] * p_y_given_x[i, j]
# 计算联合分布 P(Y,Z)
marginal_y = joint_xy.sum(axis=0)
joint_yz = np.zeros((4, 2))
for i in range(4):
for j in range(2):
joint_yz[i, j] = marginal_y[i] * p_z_given_y[i, j]
# 计算联合分布 P(X,Z)
# P(X,Z) = sum_Y P(X,Y)P(Z|Y)
joint_xz = np.zeros((4, 2))
for i in range(4):
for k in range(2):
for j in range(4):
joint_xz[i, k] += joint_xy[i, j] * p_z_given_y[j, k]
# 计算互信息
def mutual_info(joint):
mx = joint.sum(axis=1)
my = joint.sum(axis=0)
mi = 0
for i in range(joint.shape[0]):
for j in range(joint.shape[1]):
pxy = joint[i, j]
px = mx[i]
py = my[j]
if pxy > 0 and px > 0 and py > 0:
mi += pxy * np.log2(pxy / (px * py))
return mi
i_xy = mutual_info(joint_xy)
i_xz = mutual_info(joint_xz)
print("数据处理不等式演示")
print("-" * 50)
print("场景: X(原始) -> Y(噪声) -> Z(量化)")
print(f"\nI(X;Y) = {i_xy:.4f} bits")
print(f"I(X;Z) = {i_xz:.4f} bits")
print(f"\nI(X;Y) >= I(X;Z)? {i_xy >= i_xz}")
print(f"信息损失: {i_xy - i_xz:.4f} bits")
# 改变噪声水平
print("\n\n不同噪声水平下的信息损失")
print("-" * 50)
noise_levels = [0.01, 0.1, 0.2, 0.3, 0.4]
for noise in noise_levels:
# 调整噪声信道
p_ygx = np.array([
[1-3*noise, noise, noise, noise],
[noise, 1-3*noise, noise, noise],
[noise, noise, 1-3*noise, noise],
[noise, noise, noise, 1-3*noise]
])
joint_xy = np.zeros((4, 4))
for i in range(4):
for j in range(4):
joint_xy[i, j] = p_x[i] * p_ygx[i, j]
marginal_y = joint_xy.sum(axis=0)
joint_xz = np.zeros((4, 2))
for i in range(4):
for k in range(2):
for j in range(4):
joint_xz[i, k] += joint_xy[i, j] * p_z_given_y[j, k]
i_xy = mutual_info(joint_xy)
i_xz = mutual_info(joint_xz)
print(f"噪声={noise:.2f}: I(X;Y)={i_xy:.4f}, I(X;Z)={i_xz:.4f}, 损失={i_xy-i_xz:.4f}")
data_processing_inequality_demo()2.3.3 充分统计量
定义:统计量 $T(X)$ 称为关于参数 $\theta$ 的充分统计量,如果给定 $T(X)$,样本 $X$ 的条件分布不依赖于 $\theta$。
与信息论的联系:在马尔可夫链 $\theta \to X \to T(X)$ 中,$T(X)$ 是充分统计量当且仅当 $I(\theta;X) = I(\theta;T(X))$,即 $T(X)$ 保留了关于 $\theta$ 的全部信息。
Fisher-Neyman分解定理:$T(X)$ 是充分统计量当且仅当似然函数可以分解为:
$$P(X|\theta) = g(T(X), \theta) h(X)$$
2.4 Fano不等式
Fano不等式建立了错误概率与条件熵之间的定量关系,是信息论中最重要的不等式之一。
2.4.1 Fano不等式的陈述
定理(Fano不等式):设 $\hat{X}$ 是基于观测 $Y$ 对随机变量 $X$ 的估计,错误概率为 $P_e = P(X \neq \hat{X})$。则:
$$H(P_e) + P_e \log_2(|\mathcal{X}| - 1) \geq H(X|\hat{X}) \geq H(X|Y)$$
其中 $H(P_e) = -P_e \log_2 P_e - (1-P_e) \log_2 (1-P_e)$ 是二元熵函数。
简化形式(较宽松但更常用):
$$H(X|Y) \leq H(P_e) + P_e \log_2 |\mathcal{X}|$$
直观理解:如果你猜测 $X$ 的错误概率是 $P_e$,那么剩余的不确定性(条件熵)至少有多大?答案是:即使你知道猜错了,你还不知道正确答案是什么(有 $|\mathcal{X}|-1$ 种可能),所以不确定性至少是 $P_e \log_2(|\mathcal{X}|-1)$,再加上你是否猜对的不确定性 $H(P_e)$。
2.4.2 Fano不等式的证明
证明:
定义错误指示变量 $E = \mathbb{1}\{X \neq \hat{X}\}$。
考虑 $H(X,E|\hat{X})$ 的两种分解方式:
方式1:
$$H(X,E|\hat{X}) = H(E|\hat{X}) + H(X|E,\hat{X})$$
- $H(E|\hat{X}) \leq H(E) = H(P_e)$(因为 $E$ 是伯努利$(P_e)$)
- $H(X|E,\hat{X}) = P(E=0)H(X|E=0,\hat{X}) + P(E=1)H(X|E=1,\hat{X})$
- 当 $E=0$(猜对),$X=\hat{X}$,所以 $H(X|E=0,\hat{X}) = 0$
- 当 $E=1$(猜错),$X$ 可以是除 $\hat{X}$ 外的任意值,最多有 $|\mathcal{X}|-1$ 种可能,所以 $H(X|E=1,\hat{X}) \leq \log_2(|\mathcal{X}|-1)$
因此:$H(X,E|\hat{X}) \leq H(P_e) + P_e \log_2(|\mathcal{X}|-1)$
方式2:
$$H(X,E|\hat{X}) = H(X|\hat{X}) + H(E|X,\hat{X}) = H(X|\hat{X})$$
(因为给定 $X$ 和 $\hat{X}$,$E$ 是确定的,所以 $H(E|X,\hat{X})=0$)
结合两种方式:
$$H(X|\hat{X}) \leq H(P_e) + P_e \log_2(|\mathcal{X}|-1)$$
最后,由于 $X \to Y \to \hat{X}$ 形成马尔可夫链,由数据处理不等式:
$$H(X|\hat{X}) \geq H(X|Y)$$
证毕。
2.4.3 Fano不等式的应用
应用1:假设检验的下界
如果有 $M$ 个假设,均匀先验,则任何决策规则的错误概率满足:
$$P_e \geq \frac{H(X|Y) - 1}{\log_2 M}$$
应用2:信道编码的反面证明
在信道编码定理的反面证明中,Fano不等式用于证明如果传输速率超过信道容量,错误概率不可能趋于零。
应用3:学习理论
在多分类问题中,Fano不等式给出了基于有限样本的分类器的最小错误率下界。
代码示例2-5:Fano不等式验证
import numpy as np
def fano_inequality_demo():
"""
验证Fano不等式
"""
# 场景:X是发送的符号,Y是接收的信号
# 基于Y估计X,计算错误概率和条件熵
# 4个符号的通信系统
n_symbols = 4
# 转移概率矩阵 P(Y|X)
# 对角线是正确接收的概率
correct_prob = 0.8
error_prob = (1 - correct_prob) / (n_symbols - 1)
p_y_given_x = np.full((n_symbols, n_symbols), error_prob)
for i in range(n_symbols):
p_y_given_x[i, i] = correct_prob
# 均匀先验
p_x = np.ones(n_symbols) / n_symbols
# 联合分布
joint = np.zeros((n_symbols, n_symbols))
for i in range(n_symbols):
for j in range(n_symbols):
joint[i, j] = p_x[i] * p_y_given_x[i, j]
# MAP估计(最大后验)
# 由于对称性,MAP就是选择最可能的Y对应的X
estimates = np.argmax(joint, axis=0) # 对每个Y,选择最可能的X
# 计算错误概率
p_error = 0
for j in range(n_symbols):
p_y = joint[:, j].sum()
for i in range(n_symbols):
if i != estimates[j]:
p_error += joint[i, j]
# 计算条件熵 H(X|Y)
def conditional_entropy_from_joint(joint):
n_x, n_y = joint.shape
marginal_y = joint.sum(axis=0)
h = 0
for j in range(n_y):
if marginal_y[j] > 0:
cond_dist = joint[:, j] / marginal_y[j]
cond_dist = cond_dist[cond_dist > 0]
h_y_given_j = -np.sum(cond_dist * np.log2(cond_dist))
h += marginal_y[j] * h_y_given_j
return h
h_x_given_y = conditional_entropy_from_joint(joint)
# Fano不等式的右边
h_pe = -p_error * np.log2(p_error + 1e-10) - (1-p_error) * np.log2(1-p_error + 1e-10)
fanos_rhs = h_pe + p_error * np.log2(n_symbols - 1)
print("Fano不等式验证")
print("=" * 60)
print(f"符号数: {n_symbols}")
print(f"正确接收概率: {correct_prob}")
print(f"\n错误概率 P_e = {p_error:.4f}")
print(f"条件熵 H(X|Y) = {h_x_given_y:.4f} bits")
print(f"\nFano不等式右边:")
print(f" H(P_e) = {h_pe:.4f}")
print(f" P_e * log2(|X|-1) = {p_error:.4f} * {np.log2(n_symbols-1):.4f} = {p_error * np.log2(n_symbols-1):.4f}")
print(f" 总和 = {fanos_rhs:.4f}")
print(f"\nH(X|Y) <= Fano上界? {h_x_given_y <= fanos_rhs + 1e-6}")
print(f"差距: {fanos_rhs - h_x_given_y:.4f} bits")
# 测试不同正确概率
print("\n\n不同信道质量下的Fano不等式")
print("=" * 60)
for cp in [0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99]:
ep = (1 - cp) / (n_symbols - 1)
p_ygx = np.full((n_symbols, n_symbols), ep)
for i in range(n_symbols):
p_ygx[i, i] = cp
joint = np.zeros((n_symbols, n_symbols))
for i in range(n_symbols):
for j in range(n_symbols):
joint[i, j] = p_x[i] * p_ygx[i, j]
pe = 0
for j in range(n_symbols):
for i in range(n_symbols):
if i != np.argmax(joint[:, j]):
pe += joint[i, j]
hxgy = conditional_entropy_from_joint(joint)
hpe = -pe * np.log2(pe + 1e-10) - (1-pe) * np.log2(1-pe + 1e-10)
fanos = hpe + pe * np.log2(n_symbols - 1)
print(f"P(correct)={cp:.2f}: P_e={pe:.4f}, H(X|Y)={hxgy:.4f}, Fano={fanos:.4f}, 满足={hxgy <= fanos + 1e-6}")
fano_inequality_demo()2.5 熵的凸性与凹性
2.5.1 熵的凹性
定理:熵函数 $H(p)$ 是概率向量 $p$ 的凹函数。即,对于两个分布 $p_1, p_2$ 和 $\lambda \in [0,1]$:
$$H(\lambda p_1 + (1-\lambda) p_2) \geq \lambda H(p_1) + (1-\lambda) H(p_2)$$
直观理解:混合分布的熵不小于各分布熵的加权平均。这是因为混合引入了额外的不确定性——你不仅不知道具体的结果,甚至不知道来自哪个分布。
证明思路:利用相对熵的凸性(见下文)和恒等式 $H(p) = \log |\mathcal{X}| - D_{KL}(p || u)$,其中 $u$ 是均匀分布。
2.5.2 相对熵的凸性
定理:$D_{KL}(p || q)$ 是 $(p,q)$ 的联合凸函数。即:
$$D_{KL}(\lambda p_1 + (1-\lambda)p_2 || \lambda q_1 + (1-\lambda)q_2) \leq \lambda D_{KL}(p_1 || q_1) + (1-\lambda) D_{KL}(p_2 || q_2)$$
证明(使用对数求和不等式):
对数求和不等式:对于非负数 $a_1, \ldots, a_n$ 和 $b_1, \ldots, b_n$:
$$\sum_i a_i \log \frac{a_i}{b_i} \geq \left(\sum_i a_i\right) \log \frac{\sum_i a_i}{\sum_i b_i}$$
应用此不等式可以证明相对熵的凸性。
应用:相对熵的凸性保证了某些优化问题(如变分推断中的ELBO最大化)的凸性,从而确保全局最优解的存在。
2.5.3 Jensen不等式的应用
Jensen不等式:如果 $f$ 是凸函数,则:
$$f(\mathbb{E}[X]) \leq \mathbb{E}[f(X)]$$
对于凹函数,不等号反向。
由于 $\log$ 是凹函数,Jensen不等式给出:
$$\mathbb{E}[\log X] \leq \log \mathbb{E}[X]$$
这正是证明吉布斯不等式的关键步骤。
代码示例2-6:验证熵的凹性
import numpy as np
import matplotlib.pyplot as plt
def verify_entropy_concavity():
"""验证熵函数的凹性"""
# 两个极端分布
p1 = np.array([0.9, 0.05, 0.05])
p2 = np.array([0.05, 0.05, 0.9])
h1 = entropy(p1)
h2 = entropy(p2)
print("熵的凹性验证")
print("=" * 60)
print(f"分布1: {p1}, H = {h1:.4f}")
print(f"分布2: {p2}, H = {h2:.4f}")
# 测试不同的混合比例
lambdas = np.linspace(0, 1, 11)
h_mixed = []
h_weighted = []
for lam in lambdas:
p_mix = lam * p1 + (1 - lam) * p2
h_m = entropy(p_mix)
h_w = lam * h1 + (1 - lam) * h2
h_mixed.append(h_m)
h_weighted.append(h_w)
print(f"λ={lam:.1f}: H(混合)={h_m:.4f}, λH₁+(1-λ)H₂={h_w:.4f}, 差={h_m-h_w:.4f}")
# 可视化
plt.figure(figsize=(10, 6))
plt.plot(lambdas, h_mixed, 'bo-', linewidth=2, markersize=8, label='H(λp₁ + (1-λ)p₂)')
plt.plot(lambdas, h_weighted, 'r--', linewidth=2, label='λH(p₁) + (1-λ)H(p₂)')
plt.xlabel('λ', fontsize=12)
plt.ylabel('熵 (bits)', fontsize=12)
plt.title('熵函数的凹性', fontsize=14)
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.fill_between(lambdas, h_weighted, h_mixed, alpha=0.2, color='green',
label='凹性间隙')
plt.tight_layout()
plt.savefig('entropy_concavity.png', dpi=150)
plt.show()
print(f"\n所有点都满足 H(混合) ≥ 加权平均? {all(m >= w - 1e-10 for m, w in zip(h_mixed, h_weighted))}")
verify_entropy_concavity()三、程序员的视角
3.1 在机器学习优化中的应用
交叉熵损失的凸性:
在逻辑回归和神经网络分类中,交叉熵损失函数关于模型参数是凸的(对于线性模型),这保证了梯度下降能够找到全局最优解。交叉熵 $H(p,q) = H(p) + D_{KL}(p||q)$ 的第二项是KL散度,其凸性来自相对熵的凸性。
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
# 生成数据
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,
random_state=42)
# 训练逻辑回归(使用交叉熵损失)
model = LogisticRegression()
model.fit(X, y)
# 计算训练集交叉熵
y_prob = model.predict_proba(X)
cross_entropy = -np.mean(y * np.log(y_prob[:, 1] + 1e-10) +
(1-y) * np.log(y_prob[:, 0] + 1e-10))
print(f"交叉熵损失: {cross_entropy:.4f}")
print(f"准确率: {model.score(X, y):.4f}")3.2 在特征选择中的应用
互信息和条件互信息是特征选择的强大工具:
from sklearn.feature_selection import mutual_info_classif
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
# 计算每个特征与标签的互信息
mi_scores = mutual_info_classif(X, y, random_state=42)
print("Iris数据集特征互信息:")
for name, score in zip(iris.feature_names, mi_scores):
print(f" {name:20s}: {score:.4f}")
# 基于互信息的特征选择
selected_features = np.argsort(mi_scores)[-2:] # 选择前2个
print(f"\n选择的特征索引: {selected_features}")3.3 常见陷阱
从样本估计熵的偏差:直接使用频率估计概率再计算熵会产生负偏差。需要使用Miller-Madow校正或更复杂的估计方法。
高维互信息估计困难:在高维空间中,需要大量样本才能准确估计互信息。KSG估计器是一种常用方法。
混淆相关性与因果性:高互信息只表示统计依赖,不表示因果关系。
四、代码实战
4.1 信息论不等式验证器
import numpy as np
class InformationInequalityVerifier:
"""信息论不等式验证器"""
@staticmethod
def verify_non_negativity(p):
"""验证熵的非负性"""
h = entropy(p)
return h >= 0, h
@staticmethod
def verify_max_entropy(p):
"""验证最大熵原理"""
h = entropy(p)
h_max = np.log2(len(p))
return h <= h_max + 1e-10, h, h_max
@staticmethod
def verify_gibbs(p, q):
"""验证吉布斯不等式 D_KL(p||q) >= 0"""
kl = kl_divergence(p, q)
return kl >= -1e-10, kl
@staticmethod
def verify_chain_rule(joint):
"""验证熵的链式法则"""
joint = np.array(joint)
# H(X,Y)
h_xy = calc_joint_entropy(joint)
# H(X)
marginal_x = joint.sum(axis=1)
h_x = entropy(marginal_x)
# H(Y|X)
h_y_given_x = calc_conditional_entropy(joint, axis=0)
lhs = h_xy
rhs = h_x + h_y_given_x
return np.isclose(lhs, rhs), lhs, rhs
@staticmethod
def verify_data_processing(joint_xyz):
"""验证数据处理不等式"""
# 实现略
pass
def calc_joint_entropy(joint):
flat = np.array(joint).flatten()
flat = flat[flat > 0]
return -np.sum(flat * np.log2(flat))
def calc_conditional_entropy(joint, axis=0):
joint = np.array(joint)
if axis == 0:
marginal = joint.sum(axis=1)
else:
marginal = joint.sum(axis=0)
h = 0
for i in range(joint.shape[axis]):
if axis == 0:
cond = joint[i, :]
else:
cond = joint[:, i]
px = marginal[i]
if px > 0:
cond_prob = cond / px
cond_prob = cond_prob[cond_prob > 0]
h += px * (-np.sum(cond_prob * np.log2(cond_prob)))
return h
def kl_divergence(p, q):
p = np.array(p)
q = np.array(q)
mask = p > 0
return np.sum(p[mask] * np.log2(p[mask] / q[mask]))
# 测试
verifier = InformationInequalityVerifier()
print("非负性验证:", verifier.verify_non_negativity([0.5, 0.3, 0.2]))
print("最大熵验证:", verifier.verify_max_entropy([0.5, 0.3, 0.2]))
print("吉布斯不等式:", verifier.verify_gibbs([0.5, 0.5], [0.3, 0.7]))4.2 马尔可夫链模拟器
import numpy as np
import matplotlib.pyplot as plt
class MarkovChainSimulator:
"""马尔可夫链模拟器,用于演示数据处理不等式"""
def __init__(self, transition_matrix):
self.P = np.array(transition_matrix)
self.n_states = self.P.shape[0]
def simulate(self, initial_state, n_steps):
"""模拟马尔可夫链"""
states = [initial_state]
current = initial_state
for _ in range(n_steps - 1):
current = np.random.choice(self.n_states, p=self.P[current])
states.append(current)
return states
def compute_stationary_distribution(self):
"""计算平稳分布"""
eigenvalues, eigenvectors = np.linalg.eig(self.P.T)
# 找到对应于特征值1的特征向量
idx = np.argmin(np.abs(eigenvalues - 1))
pi = np.real(eigenvectors[:, idx])
pi = pi / pi.sum()
return pi
def compute_mutual_information_over_time(self, initial_dist):
"""计算I(X_0; X_t)随时间的衰减"""
pi = np.array(initial_dist)
mi_values = []
# P^t
P_power = np.eye(self.n_states)
for t in range(20):
# P(X_t | X_0) = P^t
conditional = P_power
# 联合分布 P(X_0, X_t)
joint = np.zeros((self.n_states, self.n_states))
for i in range(self.n_states):
for j in range(self.n_states):
joint[i, j] = pi[i] * conditional[i, j]
# 计算互信息
mi = self._mutual_info(joint)
mi_values.append(mi)
P_power = P_power @ self.P
return mi_values
def _mutual_info(self, joint):
mx = joint.sum(axis=1)
my = joint.sum(axis=0)
mi = 0
for i in range(joint.shape[0]):
for j in range(joint.shape[1]):
pxy = joint[i, j]
px = mx[i]
py = my[j]
if pxy > 0 and px > 0 and py > 0:
mi += pxy * np.log2(pxy / (px * py))
return mi
# 示例:三状态马尔可夫链
P = np.array([
[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1],
[0.1, 0.1, 0.8]
])
simulator = MarkovChainSimulator(P)
initial = [0.5, 0.3, 0.2]
mi_over_time = simulator.compute_mutual_information_over_time(initial)
plt.figure(figsize=(10, 6))
plt.plot(mi_over_time, 'bo-', linewidth=2, markersize=8)
plt.xlabel('时间步 t', fontsize=12)
plt.ylabel('I(X₀; Xₜ) (bits)', fontsize=12)
plt.title('互信息随时间的衰减(数据处理不等式)', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='r', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.savefig('mi_decay.png', dpi=150)
plt.show()
print("平稳分布:", simulator.compute_stationary_distribution())
print("互信息最终趋于0,体现了数据处理不等式")4.3 Fano不等式可视化工具
import numpy as np
import matplotlib.pyplot as plt
def visualize_fano_bound(n_symbols=4):
"""可视化Fano不等式"""
p_errors = np.linspace(0.01, 0.99, 100)
# Fano上界
fanos_bounds = []
for pe in p_errors:
h_pe = -pe * np.log2(pe) - (1-pe) * np.log2(1-pe)
bound = h_pe + pe * np.log2(n_symbols - 1)
fanos_bounds.append(bound)
plt.figure(figsize=(10, 6))
plt.plot(p_errors, fanos_bounds, 'b-', linewidth=2.5, label='Fano上界')
plt.xlabel('错误概率 P_e', fontsize=12)
plt.ylabel('H(X|Ŷ) 上界 (bits)', fontsize=12)
plt.title(f'Fano不等式 ({n_symbols}个符号)', fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=11)
plt.tight_layout()
plt.savefig('fano_bound.png', dpi=150)
plt.show()
visualize_fano_bound(4)五、深入思考
5.1 历史背景
熵的不等式研究始于香农1948年的开创性工作,但许多重要结果是后来逐步发现的。Fano不等式由Robert Fano在1950年代提出,他是香农在MIT的同事,也是信息论领域的先驱之一。
数据处理不等式的思想可以追溯到统计学中的充分性概念,但其在信息论中的形式化是由多位研究者独立完成的。这个不等式看似简单,却是信息论中最深刻的结果之一,它揭示了信息处理的根本限制。
5.2 前沿方向
信息论不等式的自动化证明:近年来,研究者开发了基于计算机代数的工具(如ITIP、Xitip)来自动验证信息论不等式。这些工具利用熵区域的凸优化性质,可以处理涉及多个变量的复杂不等式。
量子信息不等式:在量子信息论中,经典的熵不等式有新的推广。例如,强次可加性不等式 $S(ABC) + S(B) \leq S(AB) + S(BC)$ 是量子信息论的核心结果,其证明比经典情况复杂得多。
有限块长信息论:经典信息论通常考虑渐近极限($n \to \infty$),但实际系统工作在有限块长下。有限块长分析需要更精细的不等式,这是当前研究的热点。
5.3 延伸阅读
Cover & Thomas《信息论基础》第2章、第11章
Yeung《Information Theory and Network Coding》
Csiszár & Körner《Information Theory: Coding Theorems for Discrete Memoryless Systems》
六、实验笔记
实验1:验证各种熵不等式
目标:通过数值实验验证本章介绍的主要不等式。
步骤:
生成1000个随机概率分布(使用Dirichlet分布)
对每对分布,验证吉布斯不等式
对每个分布,验证最大熵原理
构造多个联合分布,验证链式法则和条件作用减少熵
统计违反不等式的比例(应为0,允许数值误差)
预期结果:所有不等式都应成立,数值误差在 $10^{-10}$ 以内。
实验2:马尔可夫链的信息衰减
目标:观察马尔可夫链中互信息随时间的衰减,验证数据处理不等式。
步骤:
设计一个5×5的转移矩阵(确保是遍历的)
选择一个初始分布
计算 $I(X_0; X_t)$ 对于 $t=1,2,\ldots,20$
绘制互信息随时间衰减的曲线
改变转移矩阵的"混合速度",观察衰减速率的变化
思考题:
- 什么因素决定了信息衰减的速度?
- 如果转移矩阵是单位矩阵(无噪声),会发生什么?
- 平稳分布与初始分布的关系如何影响信息保留?
七、本章小结
本章系统地研究了熵的各种性质和不等式,这些结果是信息论推理的基础工具。
基本不等式:我们证明了熵的非负性、最大值原理,以及条件作用减少熵的性质。这些看似直观的结果实际上是许多深刻理论的基础。
链式法则:熵和互信息的链式法则提供了分解多变量信息的系统方法。这在特征选择、序列建模等领域有直接应用。
数据处理不等式:这是信息论中最核心的结果之一,表明信息在处理过程中只会丢失。这个不等式解释了为什么特征工程不能创造新的信息,也限制了通信系统的性能上限。
Fano不等式:建立了错误概率与条件熵的定量关系,是证明信道编码定理反面的关键工具。
凸性与凹性:熵的凹性和相对熵的凸性保证了许多优化问题的良好性质,是机器学习算法理论基础的重要组成部分。
掌握这些不等式不仅需要理解它们的数学证明,更需要培养对信息流动的直觉。这种直觉将在后续学习信道编码、率失真理论和网络信息论时发挥重要作用。
八、习题
习题2.1(基本计算):设 $X$ 和 $Y$ 是两个独立的公平硬币投掷。计算:
- (a) $H(X)$、$H(Y)$
- (b) $H(X,Y)$
- (c) $H(X|Y)$、$H(Y|X)$
- (d) $I(X;Y)$
验证链式法则 $H(X,Y) = H(X) + H(Y|X)$。
习题2.2(不等式证明):证明对于任意三个随机变量 $X, Y, Z$:
$$H(X,Y,Z) \leq H(X) + H(Y) + H(Z)$$
等号成立的条件是什么?
习题2.3(数据处理不等式应用):设 $X \to Y \to Z$ 形成马尔可夫链。证明:
$$H(X|Z) \geq H(X|Y)$$
直观上这意味着什么?
习题2.4(Fano不等式):假设有8个等概率的假设,观测 $Y$ 使得最佳猜测的错误概率为0.2。使用Fano不等式给出 $H(X|Y)$ 的上界。
习题2.5(凸性):证明函数 $f(p) = -p \log p - (1-p) \log (1-p)$ 在 $[0,1]$ 上是凹函数。提示:计算二阶导数。
习题2.6(马尔可夫链):考虑一个两状态马尔可夫链,转移矩阵为:
$$P = \begin{pmatrix} 0.9 & 0.1 \\ 0.2 & 0.8 \end{pmatrix}$$
- (a) 计算平稳分布
- (b) 如果初始分布是 $[0.5, 0.5]$,计算 $I(X_0; X_1)$ 和 $I(X_0; X_2)$
- (c) 验证 $I(X_0; X_1) \geq I(X_0; X_2)$
习题2.7(编程题):实现一个函数,输入是一个联合分布表,输出是所有基本的信息论量(各种熵、互信息、条件熵),并验证所有相关的不等式。
习题2.8(挑战题):证明以下不等式(称为Han's不等式):
$$H(X_1, X_2, \ldots, X_n) \leq \frac{1}{n-1} \sum_{i=1}^n H(X_1, \ldots, X_{i-1}, X_{i+1}, \ldots, X_n)$$
提示:使用归纳法和链式法则。
习题2.9(应用题):在一个通信系统中,发送端发送4个等概率符号之一,接收端收到的信号有20%的概率是错误的(均匀分布在其他3个符号上)。
- (a) 计算 $H(X)$、$H(Y)$、$H(X,Y)$
- (b) 计算 $I(X;Y)$
- (c) 如果接收端进行硬判决(选择最可能的发送符号),错误概率是多少?
- (d) 使用Fano不等式给出 $H(X|Y)$ 的上界,并与实际值比较
习题2.10(开放性问题):研究信息论不等式在以下任一领域的应用,撰写一篇500字左右的短文:
- (a) 隐私保护(差分隐私与信息泄漏)
- (b) 深度学习(信息瓶颈理论)
- (c) 基因组学(互信息用于基因调控网络推断)
- (d) 经济学(信息不对称与市场效率)
重点讨论数据处理不等式或Fano不等式在该领域的具体应用。