1. 别把条件期望当成"高级期望"来背
1.1 一个真实的数据困惑:为什么分组均值比总体均值有用
我刚入行做数据分析那会儿,遇到过一件事。当时在算某个业务指标的平均值,整体均值算出来是 10.3,我把它写进报告,业务方看了一脸茫然:"这个 10.3 对我有什么用?"后来我把数据按用户来源切成三组,分别算出 4.1、9.8、16.2,业务方立刻就看懂了——新客拉低了整体均值,老客的实际水平远高于整体表现。同一批数据,同一个"平均",分成条件均值之后,信息量完全不一样。
这就是条件期望要解决的核心问题:在只知道整体分布的时候,我们对一个随机变量 X 的全部认知,就是它的期望和方差这两个干巴巴的数字;但一旦我们观察到另一个变量 Y 的取值,我们对 X 的认知就会被"刷新"。条件期望 E[X|Y] 描述的正是这个刷新过程——知道了 Y 之后,X 的平均水平变成了多少。而条件方差 Var(X|Y) 描述的是刷新之后,我们对 X 还剩下多少不确定性。
这两个量在统计学、机器学习、金融风控、保险精算里出现的频率高得吓人。卡尔曼滤波的核心递推公式就是在算条件期望和条件方差;EM 算法的 E 步字面意思就是"求期望",求的正是条件期望;贝叶斯后验均值就是条件期望;甚至最普通的线性回归,本质上也是在用一条直线去逼近条件期望这个函数。你如果只把 E[X] 和 Var(X) 背熟,却对条件版本含糊,往后学任何进阶内容都会卡在同一个地方。
1.2 E[X|Y] 和 E[X|Y=y]:一个是随机变量,一个是数
这是初学者最容易翻车的地方,我必须先把它掰开。E[X|Y=y] 是一个数——你先把 Y 固定成某个具体取值 y,然后在这个条件下算 X 的期望,结果当然是确定的数字。而E[X|Y] 是一个随机变量——你还没观测 Y,Y 本身是随机的,所以 E[X|Y] 会跟着 Y 变来变去。它的取值规则是:当 Y 取到 y 时,E[X|Y] 就取到 E[X|Y=y]。
打个比方,E[X|Y] 像一张事先写好的查表手册,Y 是索引;E[X|Y=y] 是翻开第 y 页看到的那一行数字。手册本身是"随机变量",翻到的那一页是"数"。
这个区分在实际推导里极其重要。比如下面这个等式是成立的:E[E[X|Y]] = E[X]。这里的 E[X|Y] 必须被当成随机变量看待,外面的那个 E 是对它取期望,而不是对某个固定的 y 取期望。如果一开始就把它当成数字,这个"塔性质"你会觉得莫名其妙。
顺带说一个更隐蔽的写法:E[X|A],其中 A 是事件而不是随机变量,比如 A = {Y > 0}。这时 E[X|A] 也是一个数,等于 E[X·1_A]/P(A)。很多人写公式时把 E[X|Y] 和 E[X|Y>0] 混着用,结果量纲和逻辑全乱。我自己的习惯是,只要条件后面跟的是等号,就默认是数;跟的是变量名,就默认是随机变量,写代码注释时也照这个规则标。
1.3 条件期望的另一个身份:最小均方误差意义下的最优预测
抛开定义,条件期望还有一个让工程师特别舒服的身份:它是所有"只依赖 Y 的函数"里,对 X 预测得最准的那个。准确地说,在所有形如 g(Y) 的预测器里,E[X|Y] 让均方误差 E[(X - g(Y))²] 达到最小。
这个性质的直觉是这样的:你手上只有 Y 的信息,Y 告诉你什么你就只能用什么。你能构造的最强预测器,就是把 Y 的每个取值 y 都映射到"在这个 y 下 X 的平均值"。任何偏离这个映射的预测,都会在平均意义下引入额外的误差。
这个结论把条件期望和回归直接接上了。你平时跑的最小二乘线性回归,其实是在"只允许用直线"这个约束下,去逼近条件期望。真正的条件期望可能是弯的、跳的、很难画的,线性回归只是它投在直线空间里的影子。理解了这一点,你就能解释为什么数据明明是曲线关系时,线性回归的残差图会呈现明显的系统形状——因为那个影子没跟上原形。
从泛函角度看,E[X|Y] 是 X 在"所有 Y 的函数构成的子空间"上的正交投影。这里的"正交"不是几何直觉上的垂直,而是内积 E[(X - E[X|Y])·g(Y)] = 0 对任意合理的 g 都成立。这个正交性方程,其实就是最小二乘正规方程的抽象版本。
2. 条件期望的三条计算路径与手算细节
2.1 离散型:条件分布表 + 加权求和
离散情形最直白。已知联合分布 p(x, y) = P(X=x, Y=y),先求边缘分布 p_Y(y) = Σ_x p(x, y),再求条件分布:
p(x|y) = p(x, y) / p_Y(y),前提是 p_Y(y) > 0
然后条件期望就是按条件分布加权求和:
E[X|Y=y] = Σ_x x · p(x|y)
我把这个过程总结成三步:先固定 y 的一列,再归一化,最后加权。具体说,从联合分布表里把 Y = y 对应的那一列挑出来,把这些概率加起来得到 p_Y(y),然后每个概率除以这个和,得到条件分布,最后乘上对应的 x 再相加。
这里有个小技巧我很推荐:如果只是为了求条件期望,其实不需要真的算出每个 p(x|y),可以直接用
E[X|Y=y] = Σ_x x·p(x, y) / Σ_x p(x, y)
也就是分子算"没归一化的加权和",分母算"没归一化的总概率",最后相除。这样做能省掉一次除法带来的舍入误差,在手算和写代码时都更清爽。
需要注意的坑是分母为 0 的情况。如果某个 y 的边缘概率是 0,那"Y = y"这个事件根本不会发生,条件期望无从定义。写代码时遇到这种情况我一般直接跳过或者抛异常,而不是硬算出一个 NaN 接着往下跑。
2.2 连续型:密度比 + 积分,附一个完整推导
连续情形把求和换成积分,逻辑完全一样。条件密度是
f(x|y) = f(x, y) / f_Y(y),f_Y(y) = ∫ f(x, y) dx
条件期望是
E[X|Y=y] = ∫ x·f(x|y) dx
我拿一个具体的例子走一遍。设联合密度 f(x, y) = x + y,其中 0 < x < 1,0 < y < 1。
先求边缘密度:
f_Y(y) = ∫₀¹ (x + y) dx = [x²/2 + xy]₀¹ = 1/2 + y
再算条件期望的分子:
∫₀¹ x(x + y) dx = ∫₀¹ (x² + xy) dx = 1/3 + y/2
相除得到
E[X|Y=y] = (1/3 + y/2) / (1/2 + y) = (2 + 3y) / (3 + 6y)
代几个数检验一下:y = 0 时是 2/3,y 接近 1 时是 5/9 ≈ 0.556。看起来 y 越大,X 的条件均值反而略降。这个反常吗?不反常。这个密度在 x 和 y 都大的区域更厚,当 y 被固定得很大时,x 可选的取值范围没变,但相对权重被压平了,所以均值往中间收。这类反直觉的结果,只有真算一遍才会发现。
这里我踩过的坑是积分上下限写错。f(x, y) 的定义域往往不是矩形,比如 0 < x < y < 1 这种三角域,那么固定 y 之后 x 的积分范围是 0 到 y,固定 x 之后 y 的范围是 x 到 1。每次算边缘密度前,我一定先在纸上把那片区域画出来,标清楚两个方向的边界。省这一步,后面全错。
2.3 不套定义也能算:对称性、指示变量与提因子法则
真正做建模的人,很少每次都老老实实套定义。有三个工具能把大部分题秒掉。
第一个是指示变量法。你要算某个事件的条件概率,就把它写成指示变量 1_A 的条件期望。指示变量只取 0 和 1,期望就是概率,往往比直接套公式好算。比如"抛硬币正面出现之前已经抛了 k 次"这类问题,用指示变量拆开后逻辑非常清楚。
第二个是对称性。如果 X 和 Y 在联合分布里地位完全对称,那么 E[X|X+Y=s] 往往等于 s/2。理由很简单:条件在 X+Y 固定的情况下,X 和 Y 是对称的,条件均值必须相等,而两者之和固定为 s,所以各自只能是 s/2。这类论证在处理多项分布、均匀分布、随机游走时极其高效。
第三个是提因子法则。如果 g(Y) 只依赖 Y,那么 E[g(Y)·X | Y] = g(Y)·E[X|Y]。直觉是:在给定 Y 的条件下,g(Y) 已经是常数了,常数当然可以提到条件期望外面。这个性质在推导全方差公式、处理回归模型时天天用。
再补一个常用的:如果 X 和 Y 独立,那么 E[X|Y] = E[X]。反过来不一定成立——条件期望等于无条件期望,只说明 X 和 Y 在均值意义上不相关,不代表它们独立。这是很多人会犯的逻辑跳跃,后面第 6 节我还会专门提。
2.4 四条必须刻进肌肉记忆的性质
总结一下,我平时用得最多的四条性质:
| 性质 | 表达式 | 使用场景 |
|---|---|---|
| 线性性 | E[aX₁ + bX₂ | Y] = aE[X₁|Y] + bE[X₂|Y] | 拆解线性组合,几乎每道题都用 |
| 提因子 | E[g(Y)·X | Y] = g(Y)·E[X|Y] | 把已知量提出来,简化表达式 |
| 塔性质 | E[E[X|Y]] = E[X] | 把难算的期望拆成两步 |
| 独立性 | X ⊥ Y 时 E[X|Y] = E[X] | 判断能否直接化简 |
这四条里,塔性质是重量级角色,下一节整节都在讲它。线性性看着简单,但要提醒一句:它对条件期望无条件成立,即使 X₁ 和 X₂ 不独立也没关系,因为期望本身就不要求独立。这一点和"方差的可加性"完全不同,后者需要不相关甚至独立,很多人会把这两个性质搞混,导致方差公式用错。
3. 全期望公式:把一道难题拆成两道容易题
3.1 重期望公式的直觉与证明思路
全期望公式也叫重期望公式、塔性质,一般形式是
E[X] = E[E[X|Y]]
如果 Y 是离散的,就展开成
E[X] = Σ_y E[X|Y=y]·P(Y=y)
这个公式的直觉可以用一句话说清:先把数据按 Y 分组,算出每组内的平均值,再按各组的人数比例把这些平均值加权平均回来。加权平均的结果,必然等于不分组的整体平均值——这是算术上的恒等式,不是巧合。
验证一下这个直觉。假设整体均值是 10,按 Y 分成两组,组内均值分别是 4 和 16,人数各占一半,那么加权回算是 0.5×4 + 0.5×16 = 10,刚好对上。这正是我开头讲的那个业务例子在数学上的样子。
证明思路也很干脆。先看离散情形:
E[X] = Σ_x Σ_y x·p(x, y) = Σ_y [Σ_x x·p(x, y)]
把内层写成条件形式:p(x, y) = p(x|y)·p_Y(y),于是
E[X] = Σ_y p_Y(y) · [Σ_x x·p(x|y)] = Σ_y p_Y(y)·E[X|Y=y]
最后一步那个内层求和正是 E[X|Y=y]。整个推导只用了两件事:联合分布可以按 y 分组求和,以及条件分布的定义。没有任何花招。
3.2 分层抽样的手算案例:两条产线的次品率
我用一个最接地气的例子走一遍。某工厂有两条产线,A 线承担 60% 的产量,次品率 2%;B 线承担 40% 的产量,次品率 5%。问整批货的次品率是多少。
设 Y 表示产线,X 是次品指示变量。直接套公式:
E[X] = P(Y=A)·E[X|Y=A] + P(Y=B)·E[X|Y=B] = 0.6 × 0.02 + 0.4 × 0.05 = 0.012 + 0.020 = 0.032
整体次品率 3.2%。
这个例子简单到可以口算,但它揭示了一个非常重要的结构性事实:整体比率落在两个分组比率之间,而且偏向产量大的那一组。这解释了一个常见的管理错觉——B 线的次品率是 A 线的 2.5 倍,但整体次品率只比 A 线高 1.2 个百分点,因为 B 线产量少。如果仅仅看整体数字做决策,很容易低估 B 线的问题严重程度,也容易在下个月绩效对齐时吵起来。
我自己做过一个用户留存分析,也踩过同款坑。整体留存率 40%,拆开看新客 25%、老客 62%。整体值之所以看起来还行,完全是因为老客占比高。如果只汇报整体数字,运营团队会以为产品体验不错,实际上新客第一天就走了四分之三。学会条件化,本质上就是学会在汇报里把结构讲清楚,这是分析师的核心价值之一。
3.3 什么时候该"条件化":我的判断清单
全期望公式本身很简单,难的是判断"该不该条件化、按什么变量条件化"。我整理了一套自己的判断标准,用了好几年,分享出来。
第一,看这个变量能不能把问题切开。如果一个变量 Y 的每个取值下,X 的行为都变得特别简单(比如变成确定值、变成对称分布、变成可解的子问题),那条件化就是大赚。经典的"随机个随机变量之和"就是这种结构,第 4.5 节会讲。
第二,看条件后是否出现递推关系。有一大类问题——首次成功的位置、随机游走的返回时间、递归算法的时间复杂度——条件化之后会出现"原来的量出现在等号两边"的自引用结构,解方程就出来了。这类问题硬算几乎不可能,条件化是唯一通途。
第三,看条件化之后分母好不好算。有些问题条件化确实让分子变简单了,但边缘概率 P(Y=y) 变得极难求。这种情况下换个条件变量,或者干脆不条件化。我见过不少同事在报告里堆了一堆条件公式,最后卡在算边缘分布上,白白绕了一圈。
第四,看是否有物理意义或业务意义。这一点容易被忽略,但很重要。条件变量最好有可解释的含义,这样算出来的中间结果本身就是有价值的结论,能直接进报告。纯粹为了数学方便而选的抽象条件变量,经常会算出一些看不懂的中间量。
提醒:条件化不是万能钥匙。如果条件变量和 X 几乎无关,条件化只会把一道题变成好几道题,工作量翻倍而收益为零。
4. 条件方差与全方差公式:方差的两个来源
4.1 条件方差的定义与计算捷径
条件方差定义为
Var(X|Y) = E[(X - E[X|Y])² | Y]
它和普通方差的定义长得一样,只是所有期望都换成了条件期望。注意它是随机变量,随 Y 变化。
手算时不要用这个定义,用等价的展开式快得多:
Var(X|Y) = E[X²|Y] - (E[X|Y])²
这个式子怎么来的?把平方展开:
E[(X - μ(Y))²|Y] = E[X² - 2Xμ(Y) + μ(Y)²|Y]
其中 μ(Y) = E[X|Y]。中间项用提因子法则:E[2Xμ(Y)|Y] = 2μ(Y)E[X|Y] = 2μ(Y)²。第三项 μ(Y)² 在条件下是常数,直接拿出来。合并得到 E[X²|Y] - 2μ(Y)² + μ(Y)² = E[X²|Y] - μ(Y)²。推导干净,没有任何坑。
注意:Var(X|Y) 永远是"随机变量意义下非负"的,也就是对每个 y 都有 Var(X|Y=y) ≥ 0。如果你算出来某个 y 下是负数,一定是 E[X²|Y=y] 和 (E[X|Y=y])² 之间算错了,常见原因是把 E[X²|Y=y] 误算成了 (E[X|Y=y])²。
4.2 全方差公式的推导,一步不跳
全方差公式是全期望公式在方差上的对应版本:
Var(X) = E[Var(X|Y)] + Var(E[X|Y])
这句话读起来是:总方差 = 组内方差的平均 + 组间均值的方差。也就是说,不确定性有两个来源:每个组内部本身的波动,以及各组之间平均水平本身的差异。
推导我完整写一遍。从定义出发:
Var(X) = E[X²] - (E[X])²
第一项用全期望公式展开:
E[X²] = E[E[X²|Y]] = E[Var(X|Y) + (E[X|Y])²]
这一步的关键是回到 4.1 的展开式,把 E[X²|Y] 替换掉。
第二项:
(E[X])² = (E[E[X|Y]])²
代回去:
Var(X) = E[Var(X|Y)] + E[(E[X|Y])²] - (E[E[X|Y]])²
后面两项拼起来,正好是 E[X|Y] 这个随机变量的方差:
E[(E[X|Y])²] - (E[E[X|Y]])² = Var(E[X|Y])
于是
Var(X) = E[Var(X|Y)] + Var(E[X|Y])
证完。整个推导只用了全期望公式、条件方差的展开式、以及普通方差的定义,三步走完。
我强烈建议每个做数据分析的人都把这个推导亲手写一遍。写完之后你会明白一个反直觉的事实:两个来源都是非负的,所以条件化只会"解释掉"方差,绝不会凭空多出方差。这和你熟悉的总方差守恒是一致的,只不过这里守恒的形式是"组内 + 组间 = 总"。
4.3 完整手算案例:一张离散联合分布表
光讲公式太空,我拿一组具体的数把两个公式都跑一遍。设 Y 只取 1 和 2,概率各 0.5。
Y = 1 的条件分布:P(X=0|Y=1) = 0.6,P(X=10|Y=1) = 0.4。 条件均值 = 0.6×0 + 0.4×10 = 4 条件二阶矩 = 0.6×0 + 0.4×100 = 40 条件方差 = 40 - 16 = 24
Y = 2 的条件分布:P(X=0|Y=2) = 0.2,P(X=20|Y=2) = 0.8。 条件均值 = 0.2×0 + 0.8×20 = 16 条件二阶矩 = 0.8×400 = 320 条件方差 = 320 - 256 = 64
现在算三个量。
组内方差的平均: E[Var(X|Y)] = 0.5×24 + 0.5×64 = 44
组间均值的方差: E[X|Y] 以 0.5、0.5 的概率取 4 和 16,均值是 10, Var(E[X|Y]) = 0.5×(4-10)² + 0.5×(16-10)² = 18 + 18 = 36
总方差预测值:44 + 36 = 80。
直接验证。先求边缘分布:P(X=0) = 0.5×0.6 + 0.5×0.2 = 0.4,P(X=10) = 0.5×0.4 = 0.2,P(X=20) = 0.5×0.8 = 0.4。 E[X] = 0.2×10 + 0.4×20 = 2 + 8 = 10 ✓(和全期望公式给的 10 一致) E[X²] = 0.2×100 + 0.4×400 = 20 + 160 = 180 Var(X) = 180 - 100 = 80 ✓
两边完全对上。
这组数还告诉我一个业务上的解读:总方差 80 里,44 来自组内的个体差异,36 来自两组的平均水位差。也就是说,如果我能把 Y 这个分组变量拿到手并据此做差异化处理,就能消掉 36 的不确定性,占总量 45%。这个"能解释掉多少方差"的比例,就是实际工作中常说的"分组变量的解释力",和方差分析的思路是同一个东西。
4.4 混合正态:连续情形下公式长什么样
连续情形我举个最常用的:高斯混合。设 Y 以概率 p 取 1、以概率 1-p 取 0,在 Y = 1 时 X 服从 N(μ₁, σ₁²),在 Y = 0 时 X 服从 N(μ₀, σ₀²)。这是很多数据分布的粗糙但有效的近似模型,比如用户消费金额、传感器读数、基因表达值,经常呈现双峰形态。
无条件均值由全期望公式给出:
E[X] = pμ₁ + (1-p)μ₀
无条件方差由全方差公式给出:
Var(X) = [pσ₁² + (1-p)σ₀²] + [p(μ₁ - μ)² + (1-p)(μ₀ - μ)²]
第一项是组内方差,第二项是组间方差。注意第二项里的 μ 是无条件均值,不是组内均值。
这个公式有一个很实用的推论:两个组如果均值差得远,即使组内方差很小,整体也会呈现很大的方差。反过来,如果两个组分得很近,整体方差就主要由组内波动决定。在风控里,这意味着如果高风险人群和低风险人群的平均违约率差距大,整体违约率的波动会显著高于任一子人群——把人群混在一起做模型,等于人为放大了不确定性。
顺手说一下,这个例子正好体现了 4.2 那条"两个来源都非负"的结论。两组均值差越大,第二项越大,整体方差就越大;但不管怎么调,整体方差永远不会小于组内方差的加权平均。组内方差是方差的"地板"。
4.5 随机个随机变量之和:精算里的经典结果
这是我最喜欢的一个应用,因为它的推导过程几乎把前四节的工具全用了一遍。
设 N 是随机变量,X₁, X₂, ... 独立同分布,且与 N 独立。定义 S = X₁ + X₂ + ... + X_N(N = 0 时 S = 0)。求 E[S] 和 Var(S)。
先算期望。用全期望公式,条件在 N 上:
E[S|N] = N·μ,其中 μ = E[X₁]
因为给定 N = n,S 就是 n 个 iid 变量之和,期望是 nμ。于是
E[S] = E[N·μ] = μ·E[N]
再算方差。给定 N = n 时,S 是 n 个独立同分布变量之和,方差是 nσ²:
Var(S|N) = N·σ²
套全方差公式:
Var(S) = E[Var(S|N)] + Var(E[S|N]) = σ²E[N] + μ²Var(N)
如果 N 服从参数 λ 的泊松分布,那么 E[N] = Var(N) = λ,于是
Var(S) = λσ² + λμ² = λ(σ² + μ²) = λ·E[X₁²]
这个结果的漂亮程度值得多看两眼:泊松随机和的方差,等于泊松参数乘以单个变量二阶矩。它不依赖 X 的具体分布形状,只要一阶矩和二阶矩存在就行。保险精算里叫集体风险模型,用来估计一年内的总理赔额波动;流量工程里用来估算聚合请求的方差;我在做 A/B 实验样本量估算时也用过它——当每个用户的行为次数本身是随机的,总指标的方差就必须用这个公式,直接用"用户数 × 单次方差"会系统性低估。
提醒:这个推导的关键前提是 X 与 N 独立。如果 N 的大小会影响 X 的分布(比如访问越多次的用户,单次消费越高),公式就不成立了,需要改成条件版本 E[S|N] 写成 N 的更复杂的函数。这个前提很多人会顺手忽略。
5. 这些公式在真实项目里到底怎么落地
5.1 从数据估条件期望:分箱、核回归与它们的偏差-方差权衡
前面讲的都是"已知联合分布"的情形。现实工作中,你的联合分布是未知的,手上只有一堆样本点 (Y₁, X₁), ..., (Yₙ, Xₙ)。这时你估的其实是那个函数 m(y) = E[X|Y=y],这就是一维非参数回归问题。
最朴素的做法是分箱。把 Y 的取值范围切成 b 个等宽的箱子,箱宽 h = R/b(R 是取值范围长度),箱内 X 的均值就作为这个箱中心处的条件期望估计。这个估计量好理解、好实现,但它的误差结构值得算清楚。
偏差来自用箱内均值近似箱中心值,泰勒展开后大约是 (h²/24)·m''(y),量级是 h²。方差来自每个箱里样本数量有限,大约等于 σ²(y)/(n·f_Y(y)·h),量级是 1/(nh)。合起来均方误差大约是
MSE(h) ≈ C₁h⁴ + C₂/(nh)
对 h 求导置零,得到最优箱宽 h* ∝ n^(-1/5)。代入典型规模,如果 n = 10000,n^(-1/5) ≈ 0.158;n = 1000000,n^(-1/5) ≈ 0.063。也就是说样本量涨了 100 倍,最优箱宽只缩小到原来的 40%。这个"极其缓慢"的收缩速度,就是非参数方法在维度上的代价的最直白体现,也是为什么我不建议在样本量不够的情况下硬上非参数方法。
核回归把硬箱子换成了软权重,用核函数按距离加权,本质上是在每个 y 附近做一个局部加权平均。它的偏差方差结构和分箱几乎一样,最优带宽同样是 n^(-1/5) 量级。它的优势是估计出来的曲线更光滑、没有箱与箱之间的台阶;劣势是计算量大、边界处有偏(边界核权重不对称)。我自己的经验是,探索性分析用分箱,箱数控制在 10 到 20 之间,看一眼形状就够了;要出正式图表或做自动化的趋势监控,才上核回归或局部线性回归。
还有一个很容易被忽略的实践问题:边界效应。Y 的取值靠近两端时,箱子只有一半的数据,方差会明显放大。很多分析报告里曲线两端剧烈抖动,不是数据有问题,是方差在作祟。我一般会在图上把两端样本不足的区间直接裁掉或者用虚线标注,不给读者造成误读。
5.2 Rao-Blackwell 化:用条件期望给蒙特卡洛降方差
这是条件期望在工程上最"实打实省钱"的一个用法。
假设你要估计 θ = E[h(X)],用蒙特卡洛就是抽 n 个 X,算 h 的平均值,方差是 Var(h(X))/n。现在假设你在抽样的同时还能顺便拿到一个辅助变量 Y,使得 E[h(X)|Y] 有解析表达式。那么你可以用
θ̂ = (1/n) Σ E[h(Xᵢ)|Yᵢ]
来替代原来的估计量。由于全方差公式:
Var(h(X)) = E[Var(h(X)|Y)] + Var(E[h(X)|Y])
第二项严格小于第一项(只要条件方差不是恒为 0),所以新估计量的方差更小,而且无偏性自动保持(因为 E[E[h|Y]] = E[h])。这就是 Rao-Blackwell 定理。降方差的幅度正好等于 E[Var(h(X)|Y)] / Var(h(X)),也就是"条件化解释掉的那部分方差占比"。
我举个例子说明效果有多明显。设 X 来自 4.3 节那个混合分布:以 0.5 概率取 N(4, 24),以 0.5 概率取 N(16, 64)。要估计 P(X > 3)。
直接用指示变量模拟:真实概率是 0.5×0.581 + 0.5×0.948 = 0.765(0.581 和 0.948 分别是两个正态在 3 处的尾概率)。指示变量的方差是 0.765×0.235 ≈ 0.180。
用 Rao-Blackwell:如果抽样流程本来就会先生成组标签 Y 再生成 X,那么条件在 Y 上,P(X > 3|Y) 是可以解析算出来的两个数:Y = 1 时 0.581,Y = 0 时 0.948。新估计量的方差是 Var(0.581 或 0.948) = 0.5×(0.581-0.765)² + 0.5×(0.948-0.765)² ≈ 0.0337。
方差从 0.180 降到 0.0337,降幅约 81%。换句话说,达到同样的精度,样本量只要原来的 19%。这个收益是白捡的,代价只是多写两行解析公式。
提示:Rao-Blackwell 化的前提是条件期望能解析算出来。如果算不出来,用数值近似反而可能引入偏差,得不偿失。另外要注意,它降低的是估计量的方差,不是单次模拟的运行时间——如果你为了拿到 Y 需要额外的计算,得算总账。
5.3 卡尔曼滤波其实就是反复算条件期望
很多人学卡尔曼滤波时被那一堆矩阵公式吓住,其实它的每一步都在做同一件事:在当前观测下算状态的条件期望和条件方差。
我拿一维静态版本说明。设真实状态 X ~ N(μ₀, σ₀²),观测模型 Z = X + ε,ε ~ N(0, σₑ²),且 ε 与 X 独立。已知 X 和 Z 的联合分布是二元正态,可以直接写出条件分布:
E[X|Z] = μ₀ + K(Z - μ₀),其中 K = σ₀²/(σ₀² + σₑ²) Var(X|Z) = (1 - K)σ₀² = σ₀²σₑ²/(σ₀² + σₑ²)
代一组数:σ₀² = 4,σₑ² = 1。那么 K = 4/5 = 0.8,后验方差是 0.8。
这里 K 就是那个著名的"卡尔曼增益"。它的物理含义非常直白:观测噪声越小(σₑ² 越小),K 越接近 1,后验均值越靠近观测值;先验不确定性越大(σ₀² 越大),K 也越接近 1,因为你更该相信数据。反过来,如果观测噪声大得离谱,K → 0,后验均值退回先验均值,观测被自动忽略。
后验方差的公式也在说话:它一定小于先验方差 σ₀² 和观测方差 σₑ² 中的任何一个。这就是"两个信息源合并后不确定性只会下降"的数学表达。这个不等式在动态版本里体现为协方差矩阵的递推收敛,也是卡尔曼滤波能稳定工作的根基。
理解了这一层,再看那些矩阵递推公式就不会觉得是黑箱了:预测步是"用状态方程把条件期望和条件方差往前推一步",更新步是"用新的观测再做一次条件化"。整个算法就是条件期望和条件方差的迭代自举。
5.4 混合模型、EM 与贝叶斯更新里的位置
EM 算法的 E 步,官方定义是求 Q(θ|θ⁽ᵗ⁾) = E[log P(X, Z|θ) | X, θ⁽ᵗ⁾]。这个 E 就是关于隐变量 Z 的条件期望,条件的是观测数据 X 和当前参数估计。整个算法的道理是:隐变量观测不到,那就用它的条件期望代替,然后当作已知去最大化似然。我实现过的几个高斯混合模型里,E 步算的是每个样本属于每个簇的后验概率,这本质上就是条件概率,条件期望的形式。
贝叶斯更新更直接。设先验 p ~ Beta(α, β),数据 X|p ~ Bin(n, p)。后验是 Beta(α + X, β + n - X),后验均值是
E[p|X] = (α + X)/(α + β + n)
这个式子同时也是 p 在观测后的最优均方估计(条件期望的最优性)。用全方差公式可以把先验和后验的方差关系理清楚,也能验证一个重要事实:后验方差总是小于先验方差,数据只会减少不确定性,不会增加。
EM 和贝叶斯之间还有一个漂亮的联系:如果 EM 里隐变量的后验是精确可算的,那么 E 步就是在做一次贝叶斯更新;如果后验算不出来,那就需要变分推断或者蒙特卡洛来近似。很多工程上的取舍,说到底就是在"条件期望算不算得动"这个点上分岔的。
6. 我踩过的坑与一份排查清单
6.1 符号层面的三个陷阱
第一个陷阱:把 E[X|Y] 当成数。我在写代码文档时见过同事把 E[X|Y] 直接赋给一个 float 变量,因为它在那段逻辑里恰好只有一个取值。这在测试里不报错,一旦 Y 的取值范围扩展就全线崩溃。判断标准很简单:这个量会不会随某个变量的取值变化而变化?会,它就是随机变量。
第二个陷阱:条件写在等号左边还是右边搞混。E[X|Y=y] 和 E[X|Y] 的区别前面讲过,但在多层条件里还会出现 E[E[X|Y, Z]|Y] 这种形式,需要用到塔性质化简成 E[X|Y]。塔性质的一般形式是:如果 Z 的信息包含在 Y 里,那么 E[E[X|Y]|Z] = E[X|Z]。方向搞反了,结论完全不同。我的记忆口诀是"条件得越细,信息越多;再粗的条件期望取期望,回到细的那个层次"。
第三个陷阱:把条件期望等于无条件期望当成独立。X 和 Y 独立能推出 E[X|Y] = E[X],但反过来不成立。举个反例:X ~ N(0,1),Y = X²。那么 E[X|Y] 恒等于 0,等于 E[X],但 X 和 Y 显然高度相关。这个反例我每次带新人都要讲一遍,因为它直接关系到后面变量筛选和特征工程的判断逻辑。
6.2 计算层面的三个坑
坑一:条件方差和方差的差混用。Var(X|Y) 是随机变量,Var(X) 是数,两者之间只差一个全方差公式,不能直接相等。我见过有人用 Var(X|Y=y) 去代表整体方差,结果做出严重低估的置信区间。
坑二:全方差公式只算一项。特别是在混合模型的场景下,容易只算组内方差的加权平均,忘掉组间项。在两组均值差距大的时候,漏掉的那一项可能占总方差的一半以上。我自己的做法是,算完两项之后一定用直接法验算一遍总方差,或者写个脚本跑蒙卡对照。
坑三:连续情形下的积分限。前面提过,这里再强调:条件密度 f(x|y) 的支撑集是切片,不是原来的整个区域。定义域是三角域、楔形域、圆形域时,很多人直接沿用矩形积分限,答案就错了。我养成的习惯是先画图,再写下"对于固定的 y,x 从几到几"这一行字,然后才动笔算积分。
6.3 数值与代码层面的坑
理论都对,写成代码仍然可能出错。我用 Python 写了一段最小的校验脚本,把 4.3 节的例子完整跑一遍,同时验证全期望公式和全方差公式:
import numpy as np rng = np.random.default_rng(20240501) n = 2_000_000 # 用混合正态复现 4.4 节的连续情形:p=0.5, N(4,24) 与 N(16,64) p = 0.5 Y = rng.random(n) < p mean1, var1 = 4.0, 24.0 mean0, var0 = 16.0, 64.0 X = np.where(Y, rng.normal(mean1, np.sqrt(var1), n), rng.normal(mean0, np.sqrt(var0), n)) # 理论值 m = p * mean1 + (1 - p) * mean0 # 10.0 v = p * var1 + (1 - p) * var0 # 44.0 组内 v += p * (mean1 - m) ** 2 + (1 - p) * (mean0 - m) ** 2 # 36.0 组间 print("样本均值", X.mean(), "理论均值", m) print("样本方差", X.var(), "理论方差", v) # 预期:样本均值约 10.0,样本方差约 80.0跑出来样本均值在 10.0 附近,样本方差在 80.0 附近,和理论值吻合。这段脚本的好处是它可以当模板:只要把 X 和 Y 的构造换掉,就能验证任何一个混合模型的全方差公式。
另外两个具体的数值坑:一是浮点数下溢。在算条件概率 p(x, y)/p_Y(y) 时,如果 p_Y(y) 极小,除法会放大误差。稳妥做法是先取对数再做 log-sum-exp 归约。二是分母为零。边缘概率为 0 的条件下,条件期望没有定义,代码里应该显式跳过或者报错,不要让它静默地产生 NaN 继续传播。我在做分箱估计时会在箱内样本数低于某个阈值(比如 30)时直接输出缺失值,而不是输出一个抖动的估计值。
6.4 一张速查表收尾
最后把这一整套工具整理成一张表,我考试前、写代码前、给别人讲之前都会扫一眼。
| 场景 | 该用的公式 | 关键提醒 |
|---|---|---|
| 已知联合分布求 E[X|Y=y] | 条件分布加权求和或积分 | 先求边缘分布,注意积分限 |
| 已知一组条件期望求 E[X] | E[X] = E[E[X|Y]] | 分组均值按组概率加权 |
| 已知一组条件方差求 Var(X) | Var(X) = E[Var(X|Y)] + Var(E[X|Y]) | 两项都非负,别漏组间项 |
| 求条件方差 | Var(X|Y) = E[X²|Y] − (E[X|Y])² | 别把 E[X²|Y] 算成 (E[X|Y])² |
| 有辅助变量想降方差 | Rao-Blackwell:用 E[h(X)|Y] 替代 h(X) | 前提是条件期望能解析算 |
| 从数据估条件期望 | 分箱或核回归 | 最优带宽量级 n^(−1/5),注意边界 |
| 递推估计状态 | 卡尔曼滤波 = 条件期望 + 条件方差的迭代 | 增益 K 反映先验与观测的可信度之比 |
说到底,条件期望和条件方差不是什么高深的抽象概念,它就是把"整体统计量"换成"分组统计量"之后,必须配套的一整套运算规则。我在实际工作中最常用到的其实就那么三件事:汇报时用全期望公式把结构讲清楚,建模时用全方差公式判断哪个变量值得进模型,写模拟代码时用 Rao-Blackwell 把样本量省下来。这三件事做扎实,比多背几个公式有用得多。另外强烈建议你养成一个习惯:每次手推完公式,都写十行脚本用模拟数据验一遍。我这么干了几年,帮自己抓出过不少"看着很对、其实符号写反"的错误,比反复检查公式本身有效得多。