想象你和朋友合租一套两居室。每天回家,你只关心自己的房间乱不乱,那是“单间悬念”;但朋友来做客,看到的却是整个家——厨房油渍、客厅瓜子壳、两间卧室……真正的“家乱不乱”,必须把所有空间合在一起看。信息论里,衡量单看一个随机变量的不确定性,叫熵(Entropy);把两个随机变量 X、Y 放在一起看总不确定性,就叫联合熵(Joint Entropy)。它回答一个朴素问题:两个信封一起打开之前,你心里的“总悬念”到底有多大?这篇文章用“合租两间房”的生活故事,把联合熵的定义、性质、与条件熵和互信息的链式关系讲透,最后用 Python 动手算一遍。
联合熵是信息论的基石:搞懂它,你就能量化“多个变量组成的系统总信息量”,为条件熵、互信息乃至整个信息论大厦打下地基,也是做特征工程、传感器融合等 AI 实战的基本功。
可视化演示
动态演示联合熵的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
联合熵:联合熵的 联合熵的定义与公式 联合熵与单个熵的关系 核心机制可视化 联合熵整体架构与关键组件
联合熵定义
假设 X 表示室友小明的房间状态(0=整洁、1=一般、2=凌乱),Y 表示小红房间的状态。单看 X,有三种可能、每种可能各有概率,这是 H(X);单看 Y 同理。但“整个家”的状态是 (X,Y) 的九种组合:小明整洁且小红凌乱、小明凌乱且小红整洁……每一种组合都有一个联合概率 p(x,y)。这些概率堆在一起,就构成一张 3×3 的联合分布表。联合熵的定义式,就是把这张表里每一项的概率取对数、加负号、再按概率加权求和:
回到合租屋:H(X,Y) 就是你对“整个家”状态的悬念总量。如果九种组合每一种都可能,你不知道该往哪间房看,悬念就大;如果某种组合(比如小明乱且小红也乱)几乎必然出现,悬念就小。联合熵把两间房的分布揉成一张表,算成一个数字——这正是“整个家”的混乱指数。
- 联合概率 p(x,y)表示 X 取 x 且 Y 取 y 同时发生的概率,它是整个计算的基础数据。
- 双重累加外层对 X 的所有取值、内层对 Y 的所有取值逐一扫描,把每种组合都覆盖到。
- 对数项对每个联合概率取以 2 为底的对数,概率越小,“惊讶度”越大,信息量越大;反之概率接近 1 时信息量趋近 0。
- 负号与整体结构因为概率小于 1 时对数是负数,加负号后每项变成非负,最终得到平均信息量。
基本性质
任何一把尺子都有刻度规则。联合熵这把“悬念尺”也有三条基本刻度。第一条,联合熵永远不小于零:你不会对屋里状态产生“负的悬念”,最坏也就是完全确定,比如提前知道室友今天都没回来,屋里必是一尘不染,悬念为零。第二条,对称性:先想小明房间还是先想小红房间,整个家的总悬念一模一样,H(X,Y) 和 H(Y,X) 只是累加顺序不同。第三条,有上界:悬念再大也有天花板,当所有组合等可能时你不知道该偏向哪个状态,悬念最大;组合数越多天花板越高。写成公式:
所以这把尺子的刻度范围清楚了:下界 0 表示“全屋状态完全确定”,上界表示“每个角落都可能乱”的极限。合租屋里,不管两人怎么折腾,整个家的悬念都在这条区间里波动,不会越界。
- 下界为零每一项 -p·log₂p 在 p 属于 (0,1] 时都非负,只有某个概率为 1、其余全为 0 时每项取到 0。
- 上界来源熵是定义在概率分布上的凹函数,均匀分布时达到最大,此时每个组合等概率。
- 代入上界把等概率值代入定义式,双重求和退化为常数乘以组合数,恰好得到组合数的对数。
与单熵关系
整间屋子的混乱程度,可能比自己房间的混乱程度还小吗?你把自己的房间整理得干干净净,但客厅还有室友的臭袜子,整个家依然可能很乱。联合熵不小于任何一个单变量熵,这是联合熵最重要的“体检指标”。直觉上,往系统里多塞一个变量,总不确定性只增不减。严格证明可以借助条件熵:H(X,Y) = H(X) + H(Y|X),而 H(Y|X) ≥ 0,于是立刻得到:
那什么时候联合熵刚好等于两个熵之和?答案是两间房互不影响、各自独立的时候——小明房间爱乱不乱,小红房间自己去折腾,两人状态互不相关。此时联合密度可以拆成两个边际密度的乘积,对数也拆成两项,整个家的悬念恰好等于两间房各自悬念的简单相加:
合租的真相于是浮出水面:只要室友影响你(不独立),整个家的混乱度就小于两间房单独混乱之和,因为一部分混乱是“共享”的;如果你们井水不犯河水,总混乱就是两间房的简单加总。
- 拆解差值把联合熵写成单熵加条件熵,则 H(X,Y) − H(X) = H(Y|X)。
- 条件熵非负条件熵本质上是熵,继承了熵的非负性,所以差值不小于零。
- 得到结论非负差值意味着联合熵永远不矮于单熵这一“身高线”。
- 独立性条件联合概率等于两个边际概率相乘,说明两变量互不影响。
- 对数拆开对乘积取对数变成两项相加,双重求和随之被拆开。
- 化简为边际和各自对另一个变量求和后归一化,恰好还原成两个单熵。
条件熵
你推开小明房间,发现他整洁得像个样板间。这个信息立刻改变了你对小红房间的猜测:一个如此爱干净的人,大概率不会允许客厅乱。于是“已知小明状态后,小红房间还剩多少悬念”——这个剩余悬念就是条件熵。条件概率 p(y|x) 表示已知 X=x 的条件下 Y=y 的可能性,条件熵 H(Y|X) 把这些条件概率的“惊讶度”按联合概率加权平均:
条件熵给了“先看哪间房”一个顺序指导:先搞定一间房的悬念,剩下的悬念就是条件熵。它天然刻画了“边际收益”——已经知道一部分信息后,还剩多少信息需要获取。如果小明房间一乱小红必然乱,那么看完小明房间后,小红房间几乎没悬念,条件熵趋近于零。
- 条件概率p(y|x) 表示在 X=x 已经发生的条件下 Y=y 的概率,它是已知小明房间状态后对小红房间的预测依据。
- 联合概率加权每个条件对总体的贡献要乘上它实际发生的权重 p(x,y),这样才不是“凭空猜测”,而是按真实频率平均。
- 负号与累加条件概率小于 1 时对数为负,加负号翻转成非负信息量,再对全部组合累加。
互信息
合租三个月后你发现规律:小明房间一乱,小红房间十有八九也乱。两人共享的不只是客厅,还有“卫生习惯”这套信息。互信息衡量的正是两个变量之间“共享的信息量”。它的定义简洁而优雅:X 的悬念加 Y 的悬念,减去两人一起时的总悬念。多减掉的这部分,就是两个变量重复计算的信息:
互信息是合租的“默契指数”:它告诉你,知道了小明的房间状态,能省下多少猜测小红房间的力气。若两人毫无关联,默契指数为 0;若小明一乱小红必乱,默契指数达到最大。特征选择、数据降维里,这个指数就是挑选“有用变量”的核心工具——与标签互信息越高,特征越值得留下。
- 代入链式法则把 H(X,Y) 用条件熵展开,联合熵被替换为 H(X)+H(Y|X)。
- 化简消元H(X) 被抵消,留下 H(Y) − H(Y|X),即“Y 的原悬念减去已知 X 后剩下的悬念”。
- 对称非负同样可写成 H(X) − H(X|Y),且由信息论基本不等式保证 I ≥ 0。
链式法则
两间房的故事搞清楚后,想象一个四室一厅的合租屋:小明、小红、小刚、小美,整个家的悬念怎么算?答案是:一间一间地推门进去看,每推开一扇门解除一部分悬念,剩下的悬念继续累积。这就是链式法则。二维形式 H(X,Y) = H(X) + H(Y|X) 可以不断“套娃”:三变量时 H(X,Y,Z) = H(X) + H(Y|X) + H(Z|X,Y)。推广到 n 个变量:
合租屋越来越大,联合熵却不怕——链式法则告诉你,从第一间房开始,每间房只要算“在已知前面所有房间状态后剩下的悬念”,逐项相加即可。这不仅在理论上把多维联合熵化归为一个个条件熵,在实践中也让复杂系统的信息量估算变得可操作。
- 索引约定X₁ 到 X_{i-1} 表示“排在 X_i 前面的所有变量”,当 i=1 时条件集为空即 H(X₁)。
- 逐项展开从第一个变量开始,每项都是“已知前面所有变量后,当前变量还剩多少悬念”。
- 求和压缩累加符号把一长串条件熵收拢成一个紧凑公式,n 项相加就是总联合熵。
计算应用
理论讲完,拿真实数据算一遍。假设你观察了 100 天小明和小红的房间状态,得到联合频率如下(近似当概率):行表示小明 X 的状态,列表示小红 Y 的状态,数值是 100 天中该组合出现的天数除以 100。
| p(x,y) | Y=0 | Y=1 | Y=2 |
|---|---|---|---|
| X=0 | 0.18 | 0.12 | 0.02 |
| X=1 | 0.12 | 0.22 | 0.08 |
| X=2 | 0.02 | 0.08 | 0.16 |
把九项代入联合熵公式,逐项计算 −p·log₂p 再累加,得到 H(X,Y) ≈ 2.89 bit。同时可以算出 H(X) ≈ 1.56 bit,H(Y) ≈ 1.56 bit(边际分布恰好对称)。用链式法则验证:H(Y|X) = H(X,Y) − H(X) ≈ 2.89 − 1.56 = 1.33 bit,于是 H(X)+H(Y|X) ≈ 2.89 bit,与联合熵完全吻合。互信息 I(X;Y) = 1.56 + 1.56 − 2.89 ≈ 0.22 bit,说明两人的卫生习惯确实存在一定“默契”,但共享信息不算多:
合租屋的故事至此闭环:用联合熵衡量整个家,用条件熵指导逐间解锁,用互信息衡量默契。现实中这套工具正是 AI 系统衡量多传感器数据总量、评估特征冗余的基本功——理解了这张表,你就理解了信息论从“单个变量”走向“变量系统”的关键一步。
- 读表取概率p₁₁ = 0.18 表示第 1 行第 1 列对应“小明整洁且小红整洁”的概率。
- 逐项算信息量对每个 p_{ij} 计算 −p_{ij}·log₂p_{ij},概率 0.18 贡献约 0.45 bit。
- 九项求和把 9 个贡献值累加,得到 2.89 bit,这是整个家状态的总悬念。
AI 应用场景
多传感器数据融合评估
阶段:数据预处理 / 感知融合
解决的问题:智能家居同时部署了温度、湿度、人体移动、光照等多个传感器。每个传感器单独计算 H(Xᵢ),只能描述“单间房的乱”;要评估整个感知系统的总不确定性,必须把所有传感器读数的联合熵算出来,判断系统还有多少未知状态未被覆盖。传统做法只看单个传感器的方差或熵,会严重低估系统整体的信息量。
具体案例:某智能安防系统融合 8 路传感器读数,单路熵都不高,但联合熵居高不下,说明传感器之间独立性较强、数据互补性大。算法团队据此决定引入多路关联分析模型,把漏报率降低了 18%。
特征工程中的互信息筛选
阶段:特征工程 / 特征选择
解决的问题:几百个候选特征里挑出“和标签最相关”的那几个,如果只看单个特征的分布,完全不知道它与标签的关系;用互信息(联合熵的衍生指标)计算特征与标签之间的共享信息量,就能直接量化“这个特征对预测贡献了多少信息”。相比皮尔逊相关系数,互信息还能捕捉非线性关系,是更通用的筛选工具。
具体案例:某电商点击率预测任务中,工程师用互信息对 120 个候选特征排序,淘汰互信息低于 0.01 的 40 个特征后,模型 AUC 提升 2%,训练时间缩短 25%。
图像编码的压缩极限估计
阶段:数据压缩 / 编码
解决的问题:图像里相邻像素并不是独立的,直接按单像素熵设计编码器会浪费大量码率;只有算出相邻像素的联合熵,才知道压缩的理论下限。传统编码器主要靠经验调参,缺乏对“相邻像素共享多少信息”的量化认知。
具体案例:某视频编码团队在一张 512×512 灰度图上测得相邻像素联合熵约 6.2 bit/像素,而单像素熵约 7.1 bit,两者之差(约 0.9 bit)正是可利用的相关性冗余,据此调整预测编码器的搜索范围,在同等画质下码率降低约 10%。
Python 演示
"""联合熵、条件熵、互信息的完整计算演示"""import mathfrom itertools import product def joint_entropy(P): """联合熵 H(X,Y)。P[i][j] = P(X=i, Y=j)""" h = 0.0 for i, j in product(range(len(P)), range(len(P[0]))): p = P[i][j] if p > 1e-12: h -= p * math.log2(p) return h def marginal_entropy(P, axis=0): """边际熵。axis=0 得 H(X),axis=1 得 H(Y)""" n_row, n_col = len(P), len(P[0]) h = 0.0 for a in range(n_row if axis == 0 else n_col): if axis == 0: px = sum(P[a][b] for b in range(n_col)) else: px = sum(P[b][a] for b in range(n_row)) if px > 1e-12: h -= px * math.log2(px) return h def conditional_entropy(P, given=0): """条件熵。given=0 得 H(Y|X),given=1 得 H(X|Y)""" n_row, n_col = len(P), len(P[0]) h = 0.0 for i, j in product(range(n_row), range(n_col)): p = P[i][j] if p <= 1e-12: continue if given == 0: px = sum(P[i][b] for b in range(n_col)) cond = p / px if px > 1e-12 else 0.0 else: py = sum(P[a][j] for a in range(n_row)) cond = p / py if py > 1e-12 else 0.0 if cond > 1e-12: h -= p * math.log2(cond) return h def mutual_information(P): """互信息 I(X;Y) = H(X) + H(Y) - H(X,Y)""" hx = marginal_entropy(P, 0) hy = marginal_entropy(P, 1) hxy = joint_entropy(P) return hx + hy - hxy def main(): # 合租屋例子的联合分布表:行=小明X,列=小红Y,0=整洁 1=一般 2=凌乱 P = [ [0.18, 0.12, 0.02], [0.12, 0.22, 0.08], [0.02, 0.08, 0.16], ] hx = marginal_entropy(P, 0) hy = marginal_entropy(P, 1) hxy = joint_entropy(P) hy_given_x = conditional_entropy(P, 0) ixy = mutual_information(P) print(f"H(X) = {hx:.4f} bit") print(f"H(Y) = {hy:.4f} bit") print(f"H(X,Y) = {hxy:.4f} bit") print(f"H(Y|X) = {hy_given_x:.4f} bit") print(f"I(X;Y) = {ixy:.4f} bit") # 验证链式法则:H(X)+H(Y|X) 应等于 H(X,Y) lhs = hx + hy_given_x print(f"H(X)+H(Y|X) = {lhs:.4f} bit (应与 H(X,Y) 一致)") print(f"一致? {abs(lhs - hxy) < 1e-9}") if __name__ == "__main__": main()
if p > 1e-12:跳过概率几乎为 0 的项,避免对 0 取对数导致报错。h -= p * math.log2(p)熵的核心累加:每一项概率乘以其对数信息量,加负号后累加。px = sum(P[a][b] for b in range(n_col))对列求和得到边际概率 P(X=a),这是从联合分布“挤出”单变量分布的关键。cond = p / px if px > 1e-12 else 0.0用联合概率除以边际概率得到条件概率 p(y|x)。return hx + hy - hxy互信息的“和减联合”表达式,一行代码体现 I = H(X)+H(Y)−H(X,Y)。print(f"H(X,Y) = {hxy:.4f} bit")以 4 位小数输出结果,方便核对正文中的 2.89 bit。lhs = hx + hy_given_x用链式法则手工拼出联合熵,与直接计算对比验证正确性。
常见误区
误区我看见 H(X,Y) 就以为是 H(X)+H(Y),毕竟都叫“联合”了,加起来总没错吧?
正解只有 X 与 Y 独立时才成立。合租屋里,两人互不影响时总混乱才等于各自相加;只要生活习惯互相影响,联合熵一定小于两者之和,因为部分信息被共享了。正确的通用关系是链式法则 H(X,Y)=H(X)+H(Y|X),而 H(Y|X) 通常不为零。
为何常见:单变量熵“取值越多熵越大”的直觉被简单搬到了双变量上,忽略了联合分布中变量之间的相关性会“压缩”总量。
误区我同时知道 X 和 Y 的信息,掌握的信息多了,不确定性应该变小,所以 H(X,Y) 应该小于 H(X) 吧?
正解掌握的信息确实变多了,但联合熵衡量的是“打开两个信封之前”的总悬念,而不是打开之后。变量多了一个,状态组合从 |X| 膨胀到 |X|·|Y|,总悬念只增不减:H(X,Y) ≥ H(X) 恒成立。会变小的是条件熵 H(X|Y)——那是已知 Y 之后剩下的悬念。
为何常见:混淆了“拿到信息后的剩余不确定性”(条件熵)和“一起看两个变量的总不确定性”(联合熵),一个关注过程,一个关注总量。
误区联合熵是零,说明 X 和 Y 都没悬念了,两个变量都确定。
正解联合熵为零说明 (X,Y) 联合状态只有一个可能值,比如 (X=1, Y=2) 必然发生,此时 X 和 Y 各自当然也确定。反过来,如果 H(X)=0 而 Y 还有变化,联合熵就等于 H(Y),并不会变成零。真正要注意的是:联合熵为零是“联合层面无悬念”,比“各自无悬念”更强。
为何常见:只记住了“熵为零≈确定”的口诀,没有把“联合”的含义落实到联合分布上,忽略了联合确定和边际确定之间的区别。
误区既然都叫条件熵,把 X 和 Y 换一下应该不影响结果吧?
正解条件熵不对称。知道小明的房间后,小红房间还剩多少悬念,和知道小红的房间后小明房间还剩多少悬念,通常并不相同。两者仅当 X、Y 的分布对称时才相等。它们通过互信息联系:H(Y|X) = H(Y) − I(X;Y),H(X|Y) = H(X) − I(X;Y)。
为何常见:联合熵的对称性让初学者误以为整个熵家族都对称,忽略了条件熵依赖“以谁为条件”这个方向性。
面试题
Q1. 联合熵 H(X,Y) 与单个熵 H(X) 的大小关系是?
- A.H(X,Y) < H(X) 恒成立
- B.H(X,Y) = H(X) 恒成立
- C.H(X,Y) ≥ H(X) 恒成立← 正确答案
- D.两者之间没有任何确定关系
答案:C。联合熵等于单熵加条件熵,即 H(X,Y)=H(X)+H(Y|X),而 H(Y|X) ≥ 0,所以联合熵永远不会小于单个熵。选项 A 方向反了;B 只有在 Y 完全由 X 决定时才成立;D 错误,因为有明确的不等式关系。
Q2. 当随机变量 X 和 Y 相互独立时,联合熵满足?
- A.H(X,Y) = H(X) + H(Y)← 正确答案
- B.H(X,Y) = H(X) × H(Y)
- C.H(X,Y) = H(X|Y)
- D.H(X,Y) = I(X;Y)
答案:A。独立时联合概率等于边际概率乘积,对数拆成两项,双重求和分解后恰好得到两个熵相加。B 把加法换成乘法毫无依据;C 是条件熵不是联合熵;D 中互信息在独立时为零,不是联合熵。
Q3. 下列属于联合熵性质的有?
- A.非负性:H(X,Y) ≥ 0← 正确答案
- B.对称性:H(X,Y) = H(Y,X)← 正确答案
- C.上界:H(X,Y) ≤ log₂(|X|·|Y|)← 正确答案
- D.联合熵总等于两个边际熵之和
答案:ABC。A 正确,熵本质是平均信息量,不可能为负;B 正确,双重求和的顺序可以交换;C 正确,均匀分布时达到最大值 log₂(|X|·|Y|);D 错误,只有当 X、Y 独立时才等于两熵之和,一般情况用链式法则。
Q4. 链式法则的正确表达式是?
- A.H(X,Y) = H(X) + H(Y)
- B.H(X,Y) = H(X) + H(Y|X)
- C.H(X,Y) = H(Y) + H(X|Y)
- D.B 和 C 都正确← 正确答案
答案:D。链式法则有两种等价写法:先看 X 再看 Y 得 H(X)+H(Y|X),先看 Y 再看 X 得 H(Y)+H(X|Y)。A 只在独立时成立;D 才是正确答案,因为 B 和 C 都是链式法则的合法形式。
Q5. 若 H(X,Y) = H(X),则下列推断正确的是?
- A.X 与 Y 相互独立
- B.给定 X 后 Y 完全确定,即 H(Y|X) = 0← 正确答案
- C.X 完全由 Y 决定
- D.H(Y) = 0
答案:B。由链式法则,H(X,Y)=H(X)+H(Y|X),所以 H(X,Y)=H(X) 等价于 H(Y|X)=0,即知道 X 后 Y 没有额外悬念。A 独立时 H(X,Y)=H(X)+H(Y)≠H(X);C 方向反了,这是“Y 由 X 决定”而非“X 由 Y 决定”;D 并不必需,Y 的边际熵可以不为零。
Q6. 已知 H(X,Y,Z) = 3 bit,H(X) = 1 bit,H(Y|X) = 1.2 bit,则 H(Z|X,Y) 为?
- A.0.8 bit← 正确答案
- B.1.8 bit
- C.1.2 bit
- D.无法确定
答案:A。按三维链式法则,H(X,Y,Z)=H(X)+H(Y|X)+H(Z|X,Y)。代入 3 = 1 + 1.2 + H(Z|X,Y),解得 H(Z|X,Y)=0.8 bit。这题考察多维链式法则的逐项分解能力,B、C 是误把其他熵值当作答案,D 错误因为条件给足了。
Q7. 条件熵 H(Y|X) = 0 的信息论含义是?
- A.X 和 Y 完全独立
- B.知道 X 的值后,Y 的值被完全确定← 正确答案
- C.X 和 Y 的联合熵为零
- D.H(X) 一定为零
答案:B。条件熵为零意味着已知 X 之后 Y 不再有任何悬念,即 Y 是 X 的确定性函数。A 独立时条件熵等于 H(Y) 而非零;C 错误,联合熵等于 H(X),通常不为零;D 错误,X 本身可以很有悬念。
Q8. 关于“联合熵不小于单个熵”这一结论,正确的理解有?
- A.引入新变量不会减少系统的总不确定性← 正确答案
- B.联合分布刻画了更多可能的状态组合← 正确答案
- C.该结论源于条件熵的非负性← 正确答案
- D.只有当 X 和 Y 独立时才成立
答案:ABC。A 正确,变量增多状态组合变多,总悬念不降;B 正确,联合状态空间是两变量状态的笛卡尔积,组合数更多;C 正确,H(X,Y)=H(X)+H(Y|X) 且 H(Y|X)≥0;D 错误,该结论对所有情况成立,与是否独立无关。
Q9. 一个 8×8 联合分布(X 和 Y 各有 8 种取值),联合熵的最大可能值是多少?
- A.3 bit
- B.6 bit← 正确答案
- C.8 bit
- D.64 bit
答案:B。联合状态共有 8×8=64 种组合,均匀分布时熵最大,最大值为 log₂64 = 6 bit。A 是 8 的单变量熵 log₂8=3;C 是状态数本身;D 是状态总数,忘了取对数。
Q10. 已知 H(X) = 2 bit,H(Y) = 1 bit,H(X,Y) = 2.5 bit,则互信息 I(X;Y) 为?
- A.0.5 bit← 正确答案
- B.1.5 bit
- C.2 bit
- D.3.5 bit
答案:A。互信息定义 I(X;Y)=H(X)+H(Y)−H(X,Y)=2+1−2.5=0.5 bit。它表示 X 和 Y 共享的信息量。B 把条件熵当成了互信息;C 把 H(Y) 当成了答案;D 把三个值直接相加,完全偏离定义。