我发现熵这个概念极其迷人。然而,将公式 与其关于前缀编码和信息量的"直观"解释对应起来并非易事。在此,我想探讨几种独立推导出该概念的思路。
信息的性质
假设我们要定义一个函数 ,用于表示事件的信息量。抛开事件的具体细节,我们可以用事件发生的概率作为比较不同事件的度量。因此, 可以是从概率 到 的映射。基于这一框架,以下要求是合理的:
-
。如果一个事件必然发生,它并不有趣,提供的信息量也很少。
-
应在 上连续且单调递减。越常见的事件信息量越少。
-
两个独立事件,其概率分别为 和 ,它们的信息量应为 。
最后一条要求最能说明问题。根据定义,两个独立事件同时发生的概率是 ,因此
由于函数必须是连续的,这一关系仅当
时成立。如果我们希望 单调递减,
必须为负。由于 为正, 必须为负。令 ,则
由于 ,其中分母为常数,我们可以认为 编码了对数的底数。为方便起见,我们令 为 1,并用 表示以 2 为底的对数。
熵 就是 在分布 上的期望值:
我们还假设 ,这是出于连续性的考虑。
例如,考虑伯努利随机变量 ,它以概率 取值 ,以概率 取值 。如果我们绘制其熵的曲线:
绘图代码
import numpy as np
import plotly.graph_objects as go
# Function to calculate the entropy of a Bernoulli variable
def bernoulli_entropy(p):
return -p * np.log2(p) - (1 - p) * np.log2(1 - p)
# Generate values for p from 0 to 1
p_values = np.linspace(0.01, 0.99, 100)
entropy_values = bernoulli_entropy(p_values)
# Create the plot
fig = go.Figure()
# Add the entropy trace
fig.add_trace(go.Scatter(x=p_values, y=entropy_values, mode='lines', name='Entropy', line=dict(color='red')))
# Update layout for dark mode
fig.update_layout(
title='Entropy of a Bernoulli Random Variable',
xaxis_title='p',
yaxis_title='Entropy',
template='plotly_dark'
)
# Save the plot to an HTML file
fig.write_html("bernoulli_entropy_plot.html")
可以看到,当分布均匀时熵最大,而当分布几乎确定时熵最小。
前缀码
假设我们有一组符号 ,需要通过二进制信道传输。我们构建的信道每次只能发送 或 。我们希望为 找到一个最优的编码方案,并满足一个要求:它是前缀无关的。
定义编码函数 ,它将符号映射到长度 的二进制字符串。如果没有任何一个码字是另一个码字的前缀,我们就称这种编码是前缀无关的。例如, 不是前缀无关的,因为 是 的前缀;而 则是。
前缀无关码意味着该编码是唯一可解码的,无需在符号之间添加额外的分隔符,这是一个非常理想的特性。
我们还注意到,二进制前缀码可以通过一棵二叉树唯一确定:
其中,从根节点到符号的路径决定了码字,且符号始终位于叶子节点。可以验证,任何这样的构造都会生成一个前缀码。
现在我们将证明,对于 上的任何前缀码,其期望码字长度 满足以下界限:
这里, 是一个随机变量,其取值来自集合 ,对应的概率为 。最重要的是,我们看到 的熵是该分布可以被压缩的下限,或者说,它包含了多少信息。
克拉夫特不等式(Kraft’s Inequality)
设 为第 个码字的长度。若该编码是前缀无关的:
证明:
令 表示最长码字的长度。我们注意到:
- 在第 层最多有 个节点
- 对于任意长度为 的码字,其在第 层有 个后代节点
- 各码字的后代节点集合互不相交(因为一个码字永远不会是另一个码字的祖先)
由此可得
为什么是 而非等号?因为可能存在第 层的节点不属于任何码字的后代(考虑编码 对应的树)!
L 的下界
现在,我们考虑期望码字长度
我们将证明熵是 的下界,即
证明:
其中最终不等式成立的原因有两点:1) KL 散度非负;2) 根据 Kraft 不等式,
。
需要注意的是,若
,则
,即理论最小值。我们无法始终达到这一理想值的原因是
不一定是整数,而码长显然必须为整数。
L 的上界
注意到我们可以构造一个码长为以下值的前缀码:
因为这些长度满足 Kraft 不等式:
根据向上取整函数的定义:
对 取期望,我们得到:
这表明 是 L 的一个良好上界!
总结来说,熵是前缀码编码一个分布所需平均比特数的下界,也是一个合理的估计值。
参考文献
- Alon Orlitsky 在 UCSD 的 ECE 255A 课程讲义
- Cover, T. M., & Thomas, J. A. (2006). 信息论基础. Wiley-Interscience.