条件期望与条件方差:全期望、全方差与Rao-Blackwell
发布时间:2026/9/30 1:06:07来源:尧图网络
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|Yy]一个是随机变量一个是数这是初学者最容易翻车的地方我必须先把它掰开。E[X|Yy] 是一个数——你先把 Y 固定成某个具体取值 y然后在这个条件下算 X 的期望结果当然是确定的数字。而E[X|Y] 是一个随机变量——你还没观测 YY 本身是随机的所以 E[X|Y] 会跟着 Y 变来变去。它的取值规则是当 Y 取到 y 时E[X|Y] 就取到 E[X|Yy]。打个比方E[X|Y] 像一张事先写好的查表手册Y 是索引E[X|Yy] 是翻开第 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|Y0] 混着用结果量纲和逻辑全乱。我自己的习惯是只要条件后面跟的是等号就默认是数跟的是变量名就默认是随机变量写代码注释时也照这个规则标。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(Xx, Yy)先求边缘分布 p_Y(y) Σ_x p(x, y)再求条件分布p(x|y) p(x, y) / p_Y(y)前提是 p_Y(y) 0然后条件期望就是按条件分布加权求和E[X|Yy] Σ_x x · p(x|y)我把这个过程总结成三步先固定 y 的一列再归一化最后加权。具体说从联合分布表里把 Y y 对应的那一列挑出来把这些概率加起来得到 p_Y(y)然后每个概率除以这个和得到条件分布最后乘上对应的 x 再相加。这里有个小技巧我很推荐如果只是为了求条件期望其实不需要真的算出每个 p(x|y)可以直接用E[X|Yy] Σ_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|Yy] ∫ x·f(x|y) dx我拿一个具体的例子走一遍。设联合密度 f(x, y) x y其中 0 x 10 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|Yy] (1/3 y/2) / (1/2 y) (2 3y) / (3 6y)代几个数检验一下y 0 时是 2/3y 接近 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|XYs] 往往等于 s/2。理由很简单条件在 XY 固定的情况下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|Yy]·P(Yy)这个公式的直觉可以用一句话说清先把数据按 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|Yy]最后一步那个内层求和正是 E[X|Yy]。整个推导只用了两件事联合分布可以按 y 分组求和以及条件分布的定义。没有任何花招。3.2 分层抽样的手算案例两条产线的次品率我用一个最接地气的例子走一遍。某工厂有两条产线A 线承担 60% 的产量次品率 2%B 线承担 40% 的产量次品率 5%。问整批货的次品率是多少。设 Y 表示产线X 是次品指示变量。直接套公式E[X] P(YA)·E[X|YA] P(YB)·E[X|YB] 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(Yy) 变得极难求。这种情况下换个条件变量或者干脆不条件化。我见过不少同事在报告里堆了一堆条件公式最后卡在算边缘分布上白白绕了一圈。第四看是否有物理意义或业务意义。这一点容易被忽略但很重要。条件变量最好有可解释的含义这样算出来的中间结果本身就是有价值的结论能直接进报告。纯粹为了数学方便而选的抽象条件变量经常会算出一些看不懂的中间量。提醒条件化不是万能钥匙。如果条件变量和 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|Yy) ≥ 0。如果你算出来某个 y 下是负数一定是 E[X²|Yy] 和 (E[X|Yy])² 之间算错了常见原因是把 E[X²|Yy] 误算成了 (E[X|Yy])²。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(X0|Y1) 0.6P(X10|Y1) 0.4。 条件均值 0.6×0 0.4×10 4 条件二阶矩 0.6×0 0.4×100 40 条件方差 40 - 16 24Y 2 的条件分布P(X0|Y2) 0.2P(X20|Y2) 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(X0) 0.5×0.6 0.5×0.2 0.4P(X10) 0.5×0.4 0.2P(X20) 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_NN 0 时 S 0。求 E[S] 和 Var(S)。先算期望。用全期望公式条件在 N 上E[S|N] N·μ其中 μ E[X₁]因为给定 N nS 就是 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|Yy]这就是一维非参数回归问题。最朴素的做法是分箱。把 Y 的取值范围切成 b 个等宽的箱子箱宽 h R/bR 是取值范围长度箱内 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 10000n^(-1/5) ≈ 0.158n 1000000n^(-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.7650.581 和 0.948 分别是两个正态在 3 处的尾概率。指示变量的方差是 0.765×0.235 ≈ 0.180。用 Rao-Blackwell如果抽样流程本来就会先生成组标签 Y 再生成 X那么条件在 Y 上P(X 3|Y) 是可以解析算出来的两个数Y 1 时 0.581Y 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|Yy] 和 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|Yy) 去代表整体方差结果做出严重低估的置信区间。坑二全方差公式只算一项。特别是在混合模型的场景下容易只算组内方差的加权平均忘掉组间项。在两组均值差距大的时候漏掉的那一项可能占总方差的一半以上。我自己的做法是算完两项之后一定用直接法验算一遍总方差或者写个脚本跑蒙卡对照。坑三连续情形下的积分限。前面提过这里再强调条件密度 f(x|y) 的支撑集是切片不是原来的整个区域。定义域是三角域、楔形域、圆形域时很多人直接沿用矩形积分限答案就错了。我养成的习惯是先画图再写下对于固定的 yx 从几到几这一行字然后才动笔算积分。6.3 数值与代码层面的坑理论都对写成代码仍然可能出错。我用 Python 写了一段最小的校验脚本把 4.3 节的例子完整跑一遍同时验证全期望公式和全方差公式import numpy as np rng np.random.default_rng(20240501) n 2_000_000 # 用混合正态复现 4.4 节的连续情形p0.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|Yy]条件分布加权求和或积分先求边缘分布注意积分限已知一组条件期望求 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 把样本量省下来。这三件事做扎实比多背几个公式有用得多。另外强烈建议你养成一个习惯每次手推完公式都写十行脚本用模拟数据验一遍。我这么干了几年帮自己抓出过不少看着很对、其实符号写反的错误比反复检查公式本身有效得多。
网站建设高端定制企业官网