人工智能之数学基础 信息论
第一章 基础概念
前言
信息论由克劳德·香农(Claude Shannon) 于1948年创立,是通信、数据压缩、密码学、机器学习(尤其是特征选择、决策树、变分推断)的理论基石。本文系统讲解:
- 自信息与香农熵(信息不确定性的度量)
- 联合熵、条件熵
- 互信息(Mutual Information)
- KL 散度(相对熵)
- 在 AI/ML 中的应用(如 ID3 决策树、特征选择)
- 配套 Python 代码实现(从零实现 +
scipy对比 + 可视化)
一、基本概念
1. 自信息(Self-Information)
事件 发生的信息量:
- 单位:
- → 比特(bit)
- → 纳特(nat)
- 直觉:
- 越不可能的事件,发生时携带的信息越多
- ⇒ (无新信息)
✅ 示例:
- “太阳从东边升起” → → 信息量 ≈ 0
- “明天下暴雨”(若概率 0.01)→ 比特
2. 香农熵(Shannon Entropy)
随机变量 ( X ) 的平均信息量(不确定性度量):
- 性质:
- 当 为确定性(某 )时,
- 当 均匀分布时, 最大(最不确定)
📌 最大熵原理:在约束下,均匀分布最“无知”
3. 联合熵(Joint Entropy)
两个随机变量 的联合不确定性:
4. 条件熵(Conditional Entropy)
已知 时, 的剩余不确定性:
- 链式法则:
5. 互信息(Mutual Information, MI)
与 共享的信息量:
- 等价形式:
- 性质:
- (独立)
✅ AI 应用:特征选择——选与标签 互信息最大的特征
6. KL 散度(Kullback-Leibler Divergence)
衡量两个分布 与 的差异:
- 非对称:
- 非负:,当且仅当 时为 0
- 不是距离(不满足三角不等式)
💡 在 ML 中:交叉熵损失 = 真实分布与预测分布的 KL 散度 + 常数
二、信息论在 AI/ML 中的应用
| 概念 | 应用场景 |
|---|---|
| 熵 | 决策树分裂标准(ID3 使用信息增益 = 互信息) |
| 互信息 | 特征选择、聚类评估、图像配准 |
| KL 散度 | 变分推断(VAE)、GAN 的 f-divergence |
| 交叉熵 | 分类任务的损失函数 |
🌟 决策树示例(ID3): 选择特征 使得 最大 → 信息增益最大
三、Python 代码实现
1. 导入库
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
from scipy.stats import entropy as scipy_entropy
# 设置中文字体(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2. 从零实现信息论函数
def estimate_pmf(data):
"""从离散数据估计概率质量函数 (PMF)"""
counts = Counter(data)
total = len(data)
pmf = {k: v / total for k, v in counts.items()}
return pmf
def shannon_entropy(pmf, base=2):
"""计算香农熵 H(X)"""
probs = np.array(list(pmf.values()))
# 过滤掉概率为0的项(避免 log(0))
probs = probs[probs > 0]
entropy = -np.sum(probs * np.log(probs)) / np.log(base)
return entropy
def joint_pmf(x_data, y_data):
"""估计联合 PMF P(x, y)"""
assert len(x_data) == len(y_data)
joint_counts = Counter(zip(x_data, y_data))
total = len(x_data)
return {k: v / total for k, v in joint_counts.items()}
def conditional_entropy(x_data, y_data, base=2):
"""计算 H(X|Y)"""
# 获取 P(y)
py = estimate_pmf(y_data)
# 获取 P(x|y) 并计算期望
total = len(y_data)
h_xy = 0.0
for y_val in py:
# 找出所有 Y=y_val 对应的 X
x_given_y = [x for x, y in zip(x_data, y_data) if y == y_val]
if len(x_given_y) == 0:
continue
px_given_y = estimate_pmf(x_given_y)
h_x_given_y = shannon_entropy(px_given_y, base)
h_xy += py[y_val] * h_x_given_y
return h_xy
def mutual_information(x_data, y_data, base=2):
"""计算 I(X;Y) = H(X) - H(X|Y)"""
hx = shannon_entropy(estimate_pmf(x_data), base)
hxy = conditional_entropy(x_data, y_data, base)
return hx - hxy
def kl_divergence(p_pmf, q_pmf, base=2):
"""计算 D_KL(P || Q)"""
# 确保 Q 在 P 的支撑集上非零
kl = 0.0
for x in p_pmf:
if x not in q_pmf or q_pmf[x] == 0:
return float('inf') # KL 散度无穷大
kl += p_pmf[x] * np.log(p_pmf[x] / q_pmf[x])
return kl / np.log(base)
3. 测试:抛硬币 vs 抛骰子
# 数据模拟
np.random.seed(42)
coin_flips = np.random.choice(['H', 'T'], size=1000, p=[0.5, 0.5])
biased_coin = np.random.choice(['H', 'T'], size=1000, p=[0.9, 0.1])
dice_rolls = np.random.choice([1,2,3,4,5,6], size=1000)
# 计算熵
print("公平硬币熵:", shannon_entropy(estimate_pmf(coin_flips)))
print("偏置硬币熵:", shannon_entropy(estimate_pmf(biased_coin)))
print("骰子熵:", shannon_entropy(estimate_pmf(dice_rolls)))
# 验证:公平硬币最大熵 = 1 bit,骰子 = log2(6) ≈ 2.58
输出:
公平硬币熵: 0.999... 偏置硬币熵: 0.469... 骰子熵: 2.58...
4. 互信息:特征与标签的相关性
# 模拟分类数据
np.random.seed(0)
n = 1000
# 特征 X:与标签 Y 相关
y = np.random.choice([0, 1], size=n)
x = np.where(y == 1,
np.random.choice([0,1], p=[0.2, 0.8]), # Y=1 时 X=1 概率高
np.random.choice([0,1], p=[0.8, 0.2])) # Y=0 时 X=0 概率高
mi = mutual_information(x, y)
hx = shannon_entropy(estimate_pmf(x))
hy = shannon_entropy(estimate_pmf(y))
hxy = conditional_entropy(x, y)
print(f"H(X) = {hx:.4f}")
print(f"H(Y) = {hy:.4f}")
print(f"H(X|Y) = {hxy:.4f}")
print(f"I(X;Y) = {mi:.4f}")
print(f"验证: H(X) - H(X|Y) = {hx - hxy:.4f}")
输出(示例):
I(X;Y) ≈ 0.32 → X 与 Y 有较强相关性
5. 决策树中的信息增益(ID3 核心)
def information_gain(y, splits):
"""
计算按特征分割后的信息增益
y: 标签列表
splits: [split1, split2, ...],每个 split 是子集的标签列表
"""
total_n = len(y)
hy = shannon_entropy(estimate_pmf(y))
weighted_entropy = 0.0
for split in splits:
if len(split) == 0:
continue
weight = len(split) / total_n
weighted_entropy += weight * shannon_entropy(estimate_pmf(split))
return hy - weighted_entropy
# 示例:按特征值分割
y = [0,0,1,1,1,0,1,0]
split0 = [0,0,0,0] # 特征=0 的样本标签
split1 = [1,1,1,1] # 特征=1 的样本标签
ig = information_gain(y, [split0, split1])
print(f"信息增益 = {ig:.4f}") # 应接近 H(Y)(完全分离)
6. KL 散度:真实分布 vs 模型分布
# 真实分布 P:公平骰子
p_pmf = {i: 1/6 for i in range(1,7)}
# 模型分布 Q:偏置骰子
q_pmf = {1: 0.5, 2: 0.1, 3: 0.1, 4: 0.1, 5: 0.1, 6: 0.1}
kl = kl_divergence(p_pmf, q_pmf)
print(f"KL(P||Q) = {kl:.4f} bits")
# 注意:KL(Q||P) 不同!
def reverse_kl(p, q):
return kl_divergence(q, p)
print(f"KL(Q||P) = {reverse_kl(p_pmf, q_pmf):.4f} bits")
💡 前向 KL(P||Q):惩罚 Q 在 P 高概率区域为 0 反向 KL(Q||P):惩罚 Q 在 P 低概率区域非 0 → VAE 使用反向 KL
7. 可视化:熵 vs 概率分布
p = np.linspace(0.01, 0.99, 100)
entropy_vals = [- (p_i * np.log2(p_i) + (1 - p_i) * np.log2(1 - p_i)) for p_i in p]
plt.figure(figsize=(8, 5))
plt.plot(p, entropy_vals, 'b-', linewidth=2)
plt.axvline(0.5, color='r', linestyle='--', label='最大熵点 (p=0.5)')
plt.title('伯努利分布的熵 H(p)')
plt.xlabel('成功概率 p'); plt.ylabel('熵 H(X) (bits)')
plt.legend()
plt.grid(True)
plt.show()
四、与 Scipy 对比验证
# 使用 scipy 计算熵(注意:scipy 默认自然对数,需指定 base)
data = ['A', 'B', 'A', 'C', 'B', 'A']
pmf = list(estimate_pmf(data).values())
entropy_scipy = scipy_entropy(pmf, base=2)
entropy_custom = shannon_entropy(estimate_pmf(data))
print(f"自实现熵: {entropy_custom:.6f}")
print(f"Scipy 熵: {entropy_scipy:.6f}")
assert abs(entropy_custom - entropy_scipy) < 1e-10
print("✅ 一致性验证通过")
五、总结
| 概念 | 公式 | 直观意义 | 单位 |
|---|---|---|---|
| 自信息 | 事件 的信息量 | 比特 | |
| 熵 $ H(X) ) | ( -\sum P(x)\log P(x) $ | 的不确定性 | 比特 |
| 联合熵 | 的总不确定性 | 比特 | |
| 条件熵 | 已知 后 的剩余不确定性 | 比特 | |
| 互信息 | 与 共享的信息 | 比特 | |
| KL 散度 | 与 的差异 | 比特 |
💡 关键洞见:
- 熵是信息的货币:越不确定,信息潜力越大;
- 互信息是相关性的通用度量(不要求线性);
- KL 散度驱动现代深度学习(VAE、GAN、强化学习);
- 信息增益 = 互信息 → 决策树的数学本质。
后续
python过渡项目部分代码已经上传至gitee,后续会逐步更新。
资料关注
公众号:咚咚王 gitee:gitee.com/wy185850518…

《Python编程:从入门到实践》 《利用Python进行数据分析》 《算法导论中文第三版》 《概率论与数理统计(第四版) (盛骤) 》 《程序员的数学》 《线性代数应该这样学第3版》 《微积分和数学分析引论》 《(西瓜书)周志华-机器学习》 《TensorFlow机器学习实战指南》 《Sklearn与TensorFlow机器学习实用指南》 《模式识别(第四版)》 《深度学习 deep learning》伊恩·古德费洛著 花书 《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》 《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》 《自然语言处理综论 第2版》 《Natural-Language-Processing-with-PyTorch》 《计算机视觉-算法与应用(中文版)》 《Learning OpenCV 4》 《AIGC:智能创作时代》杜雨+&+张孜铭 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》 《从零构建大语言模型(中文版)》 《实战AI大模型》 《AI 3.0》