人工智能之数学基础 信息论:第一章 基础概念

6 阅读2分钟

人工智能之数学基础 信息论

第一章 基础概念


前言

信息论由克劳德·香农(Claude Shannon) 于1948年创立,是通信、数据压缩、密码学、机器学习(尤其是特征选择、决策树、变分推断)的理论基石。本文系统讲解:

  • 自信息与香农熵(信息不确定性的度量)
  • 联合熵、条件熵
  • 互信息(Mutual Information)
  • KL 散度(相对熵)
  • 在 AI/ML 中的应用(如 ID3 决策树、特征选择)
  • 配套 Python 代码实现(从零实现 + scipy 对比 + 可视化)

一、基本概念

1. 自信息(Self-Information)

事件 xx 发生的信息量

I(x)=logbP(x)I(x) = -\log_b P(x)
  • 单位:
    • b=2b = 2比特(bit)
    • b=eb = e纳特(nat)
  • 直觉
    • 越不可能的事件,发生时携带的信息越多
    • P(x)=1P(x) = 1 I(x)=0I(x) = 0(无新信息)

✅ 示例:

  • “太阳从东边升起” → P1P \approx 1 → 信息量 ≈ 0
  • “明天下暴雨”(若概率 0.01)→ I=log2(0.01)6.64I = -\log_2(0.01) \approx 6.64 比特

2. 香农熵(Shannon Entropy)

随机变量 ( X ) 的平均信息量(不确定性度量):

H(X)=E[I(X)]=xXP(x)logP(x)H(X) = \mathbb{E}[I(X)] = -\sum_{x \in \mathcal{X}} P(x) \log P(x)
  • 性质
    • H(X)0H(X) \geq 0
    • XX 为确定性(某 P(x)=1P(x)=1)时,H(X)=0H(X) = 0
    • XX 均匀分布时,H(X)H(X) 最大(最不确定)

📌 最大熵原理:在约束下,均匀分布最“无知”


3. 联合熵(Joint Entropy)

两个随机变量 X,YX, Y 的联合不确定性:

H(X,Y)=x,yP(x,y)logP(x,y)H(X, Y) = -\sum_{x, y} P(x, y) \log P(x, y)

4. 条件熵(Conditional Entropy)

已知 YY 时,XX 的剩余不确定性:

H(XY)=yP(y)H(XY=y)=x,yP(x,y)logP(xy)H(X \mid Y) = \sum_{y} P(y) H(X \mid Y = y) = -\sum_{x, y} P(x, y) \log P(x \mid y)
  • 链式法则
    H(X,Y)=H(Y)+H(XY)=H(X)+H(YX)H(X, Y) = H(Y) + H(X \mid Y) = H(X) + H(Y \mid X)

5. 互信息(Mutual Information, MI)

XXYY 共享的信息量:

I(X;Y)=x,yP(x,y)logP(x,y)P(x)P(y)I(X; Y) = \sum_{x, y} P(x, y) \log \frac{P(x, y)}{P(x) P(y)}
  • 等价形式
    I(X;Y)=H(X)H(XY)=H(Y)H(YX)I(X; Y) = H(X) - H(X \mid Y) = H(Y) - H(Y \mid X)
  • 性质
    • I(X;Y)0I(X; Y) \geq 0
    • I(X;Y)=0    XYI(X; Y) = 0 \iff X \perp Y(独立)

AI 应用:特征选择——选与标签 YY 互信息最大的特征 XX


6. KL 散度(Kullback-Leibler Divergence)

衡量两个分布 PPQQ 的差异:

DKL(PQ)=xP(x)logP(x)Q(x)D_{\text{KL}}(P \parallel Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)}
  • 非对称DKL(PQ)DKL(QP)D_{\text{KL}}(P \parallel Q) \ne D_{\text{KL}}(Q \parallel P)
  • 非负DKL0D_{\text{KL}} \geq 0,当且仅当 P=QP = Q 时为 0
  • 不是距离(不满足三角不等式)

💡 在 ML 中:交叉熵损失 = 真实分布与预测分布的 KL 散度 + 常数


二、信息论在 AI/ML 中的应用

概念应用场景
决策树分裂标准(ID3 使用信息增益 = 互信息)
互信息特征选择、聚类评估、图像配准
KL 散度变分推断(VAE)、GAN 的 f-divergence
交叉熵分类任务的损失函数

🌟 决策树示例(ID3): 选择特征 AA 使得 I(Y;A)=H(Y)H(YA)I(Y; A) = H(Y) - H(Y \mid A) 最大 → 信息增益最大


三、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("✅ 一致性验证通过")

五、总结

概念公式直观意义单位
自信息logP(x)-\log P(x)事件 xx 的信息量比特
熵 $ H(X) )( -\sum P(x)\log P(x) $XX 的不确定性比特
联合熵 H(X,Y)H(X,Y)P(x,y)logP(x,y)-\sum P(x,y)\log P(x,y)(X,Y)(X,Y) 的总不确定性比特
条件熵 H(XY)H(X\|Y)H(X,Y)H(Y)H(X,Y) - H(Y)已知 YYXX 的剩余不确定性比特
互信息 I(X;Y)I(X;Y)H(X)H(XY)H(X) - H(X\|Y)XXYY 共享的信息比特
KL 散度Plog(P/Q)\sum P \log(P/Q)PPQQ 的差异比特

💡 关键洞见

  • 熵是信息的货币:越不确定,信息潜力越大;
  • 互信息是相关性的通用度量(不要求线性);
  • 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》