信息论入门:用掷硬币和猜数字游戏理解熵与互信息

信息论入门:用掷硬币和猜数字游戏理解熵与互信息

想象你手里握着一枚硬币,正准备抛掷——这个简单的动作背后隐藏着信息论最基础也最深刻的原理。当硬币在空中旋转时,你其实正在创造一种最原始的信息源:它有50%的概率呈现正面,50%的概率呈现反面。这种不确定性,正是信息论中"熵"概念的物理体现。本文将带你通过硬币实验和经典的数字猜测游戏,直观理解信息量、熵和互信息这些抽象概念的计算逻辑与应用价值。

1. 从硬币实验认识信息量

1.1 基本概念:信息量的直观定义

当我们说"硬币正面朝上传递了1比特信息"时,这个数字并非随意得出。信息量的计算公式为:

I = -log₂(p)

其中p代表事件发生的概率。对于公平硬币的正面(p=0.5):

import math p = 0.5 information = -math.log2(p) print(information) # 输出:1.0

这个结果意味着,每次抛掷公平硬币都产生1比特的信息量。但如果我们调整硬币的偏心程度,情况会如何变化?

1.2 非公平硬币的信息量计算

假设硬币正面概率为0.7,反面为0.3,此时信息量计算如下:

结果概率单次信息量(bit)
正面0.7-log₂(0.7)≈0.514
反面0.3-log₂(0.3)≈1.737

注意:低概率事件携带更多信息量,这与直觉一致——罕见事件发生时传达的信息更具"新闻价值"

1.3 平均信息量:熵的计算

熵H(X)是信息量的期望值,计算公式为:

H(X) = -Σ p(x)log₂p(x)

对于上述偏心硬币:

def entropy(p): return -p*math.log2(p) - (1-p)*math.log2(1-p) print(entropy(0.7)) # 输出约0.881

这个值(0.881比特)表示每次抛掷这种偏心硬币获得的平均信息量,比公平硬币的1比特要少,说明结果的可预测性更高。

2. 20问游戏中的条件熵与互信息

2.1 游戏规则与信息获取

经典的20问游戏中,玩家通过最多20个是/否问题猜出一个预设的数字。这个游戏完美展示了如何通过策略性提问最大化信息获取。理想情况下,每个问题应该将剩余可能性均分,使每个回答都提供1比特信息量。

优化提问策略的步骤:

  1. 始终选择能将剩余数字范围对半分开的问题
  2. 根据前序回答动态调整问题
  3. 优先消除最大不确定性的方向

2.2 条件熵的计算实例

假设数字范围1-8,第一个问题"数字≥5?"将可能性分为两组:

  • 回答"是"(概率4/8):剩余数字5-8
  • 回答"否"(概率4/8):剩余数字1-4

条件熵H(X|Y)计算如下:

H(X|Y) = Σ p(y)H(X|Y=y) = 0.5*(-4*(1/4)*log2(1/4)) + 0.5*(-4*(1/4)*log2(1/4)) = 2

2.3 互信息的实际应用

互信息I(X;Y)衡量一个问题揭示的信息量。在上述例子中:

I(X;Y) = H(X) - H(X|Y) = 3 - 2 = 1 bit

这验证了优化问题确实能提供最大信息量。在实际应用中,这种原理被用于:

  • 决策树构建
  • 特征选择
  • 数据压缩算法

3. 信息论概念的Python可视化

3.1 熵函数的可视化实现

通过Python可以直观展示不同概率分布下的熵值变化:

import numpy as np import matplotlib.pyplot as plt probs = np.linspace(0.01, 0.99, 100) entropies = [-p*np.log2(p)-(1-p)*np.log2(1-p) for p in probs] plt.plot(probs, entropies) plt.xlabel('Probability of Heads') plt.ylabel('Entropy (bits)') plt.title('Binary Entropy Function') plt.grid(True) plt.show()

这段代码会生成著名的二元熵函数曲线,清晰展示公平硬币(p=0.5)时熵最大的特性。

3.2 交互式硬币实验模拟

使用IPython widgets创建可调节参数的实验界面:

from ipywidgets import interact @interact(p=(0.1, 0.9, 0.05)) def plot_coin_entropy(p=0.5): outcomes = ['Heads', 'Tails'] prob = [p, 1-p] info = [-math.log2(pi) for pi in prob] entropy = sum([pi*ii for pi,ii in zip(prob,info)]) plt.bar(outcomes, info) plt.axhline(entropy, color='r', linestyle='--') plt.ylabel('Information (bits)') plt.title(f'Entropy = {entropy:.3f} bits') plt.show()

4. 从理论到实践:信息论的应用案例

4.1 数据压缩的基本原理

信息熵决定了无损压缩的极限。以文本压缩为例:

文本类型字符熵(bit/char)理论压缩比
英文≈4.0≤50%
中文≈9.0≤30%

实际压缩算法如ZIP、LZMA等都是基于概率模型逼近这个理论极限。

4.2 通信系统中的信道容量

香农公式将熵概念扩展到通信领域:

C = B * log₂(1 + S/N)

其中:

  • C:信道容量(bps)
  • B:带宽(Hz)
  • S/N:信噪比

这个公式指导着从Wi-Fi到5G的所有现代通信系统设计。

4.3 机器学习中的特征选择

在特征工程中,互信息是评估特征相关性的重要指标:

from sklearn.feature_selection import mutual_info_classif # X是特征矩阵,y是目标变量 mi_scores = mutual_info_classif(X, y)

高互信息值的特征通常对预测更有价值,这种方法比简单相关系数更能捕捉非线性关系。