在信息论与机器学习中,信息熵(Information Entropy)是衡量系统不确定性或信息量的核心指标。无论是决策树的构建、特征选择,还是模型训练中的损失函数设计,熵都扮演着至关重要的角色。

本文将基于 Python 代码,深入解析信息熵的几个关键数学性质(非负性、确定性、对称性和最大熵定理),并通过可视化手段直观展示其变化规律。希望这篇通俗易懂的教程能帮助你彻底掌握这些核心概念。

核心代码解析:熵与KL散度的实现
在验证性质之前,我们首先需要实现计算离散信源熵和相对熵(KL散度)的基础函数。

  1. 计算离散信源熵
def calculate_entropy(p):
    """
    计算离散信源熵 H(X) = -sum(p * log2(p))
    处理 p=0 的情况 (lim x->0 xlogx = 0)
    """
    # 过滤掉概率为0的项,避免 log(0) 警告
    p_nonzero = p[p > 0]
    return -np.sum(p_nonzero * np.log2(p_nonzero))

逻辑解读:

公式基础:严格遵循香农熵公式 H(X)=−∑p(x)log⁡2p(x)H(X) = -\sum p(x) \log_2 p(x)H(X)=p(x)log2p(x)
边界处理:在数学上,当概率 p→0p \to 0p0 时,plog⁡2p→0p \log_2 p \to 0plog2p0。但在代码中直接计算 log2(0) 会触发警告或报错。因此,这里通过 p[p > 0] 巧妙地过滤掉了零概率事件,既保证了数学严谨性,又提高了代码的鲁棒性。
2. 计算KL散度(相对熵)

def calculate_kl_divergence(p, q):
    """
    计算相对熵 (KL散度) D(P||Q) = sum(p * log2(p/q))
    """
    # 确保没有除以0或log(0)的情况,这里假设 p, q 对应位置同为零或不为零
    mask = (p > 0) & (q > 0)
    return np.sum(p[mask] * np.log2(p[mask] / q[mask]))

逻辑解读:

KL散度用于衡量两个概率分布 PPPQQQ 之间的差异。
同样使用了掩码(Mask)机制 (p > 0) & (q > 0),确保只对两者都有概率的维度进行计算,避免了除零错误。在实际的深度学习应用中,通常还会结合更严谨的平滑处理。

熵的核心性质验证
接下来,我们通过具体的概率分布来验证信息熵的四大基本性质。

  1. 非负性与确定性
    信息熵本质上是对不确定性的度量。当系统完全确定时,不确定性为零;只要存在不确定性,熵值必定大于零。
# A. 非负性与确定性
p_deterministic = np.array([1.0, 0.0, 0.0])
h_det = calculate_entropy(p_deterministic)
print(f"[确定性] 分布 {p_deterministic} 的熵: {h_det} (应为 0)")

p_random = np.array([0.5, 0.25, 0.25])
h_rand = calculate_entropy(p_random)
print(f"[非负性] 分布 {p_random} 的熵: {h_rand:.4f} (应 > 0)")

运行结果与说明:

  • 对于 [1.0, 0.0, 0.0] 这种必然发生某一事件的确定性分布,计算出的熵值为 0.0。
  • 对于 [0.5, 0.25, 0.25] 这种存在随机性的分布,计算出的熵值为 1.5000,严格大于 0。这完美验证了熵的非负性。
  1. 对称性
    信息熵只与概率分布的集合有关,而与概率值排列的顺序无关。
# B. 对称性
p1 = np.array([1/3, 1/2, 1/6])
p2 = np.array([1/2, 1/3, 1/6]) # 交换了前两个元素
print(f"\n[对称性] H(1/3, 1/2, 1/6) = {calculate_entropy(p1):.4f}")
print(f"[对称性] H(1/2, 1/3, 1/6) = {calculate_entropy(p2):.4f}")
print(f"两者相等? {np.isclose(calculate_entropy(p1), calculate_entropy(p2))}")

运行结果与说明:

交换概率分布中的元素位置后,两者的熵值完全相同(均为 1.4591)。
np.isclose() 返回 True,证明了熵函数是一个对称函数。

  1. 最大熵定理与可视化分析
    最大熵定理指出:在所有可能的概率分布中,当且仅当系统处于**均匀分布(等概分布)**时,信息熵达到最大值。这意味着当所有事件发生的可能性相等时,系统的不确定性最高。

我们通过绘制**二元熵函数(Binary Entropy Function)**来直观验证这一性质:

# C. 最大熵定理 (可视化验证)
probs = np.linspace(0.01, 0.99, 100)
entropies = []
for p_val in probs:
    dist = np.array([p_val, 1 - p_val])
    entropies.append(calculate_entropy(dist))

plt.figure(figsize=(10, 6))
plt.plot(probs, entropies, 'b-', linewidth=2)
plt.title('Binary Entropy Function (验证最大熵定理)', fontsize=14)
plt.xlabel('Probability p', fontsize=12)
plt.ylabel('Entropy H(X) (bits)', fontsize=12)
plt.axvline(x=0.5, color='r', linestyle='--', label='Max Entropy at p=0.5')
plt.legend()
plt.grid(True)
plt.show()
print("\n[最大熵] 如图所示,当 p=0.5 (等概分布) 时,熵达到最大值 1 bit。")

图表含义解读:验证最大熵定理

曲线形态:生成的二元熵函数曲线呈现完美的对称抛物线状(倒U型)。
极值点:红色虚线标注了 p=0.5p=0.5p=0.5 的位置。此时,两个事件的概率均为 0.5,系统最难以预测,熵值达到峰值 1 bit。
边界趋势:当 p→0p \to 0p0p→1p \to 1p1 时,曲线迅速下降并趋近于 0。这表示当其中一个事件几乎必然发生时,系统的不确定性消失。
总结
通过上述 Python 代码的实现与验证,我们清晰地看到了信息熵的数学之美:

确定性带来零熵,随机性产生正熵;
熵值不受事件排列顺序的影响,具有天然的对称性;
均匀分布代表着最大的不确定性,即最大熵定理。

掌握这些基础性质,不仅有助于理解信息论的底层逻辑,更是深入学习决策树、交叉熵损失函数以及强化学习等高级算法的必经之路。希望本文的代码与解析能为你带来启发!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐