查看全课大纲(第 9 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

联合概率:当一条轴不够用的时候

约 6 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

前面几节一直在和”一个随机变量”打交道:立概率的公理、认识随机变量与独立性、再给分布画好”数字画像”(期望、方差、协方差)。但真实数据里变量极少单独出场——一条特征向量的每个维度都是一个变量,它们同涨同跌、互相牵连。讲师开门见山:“我们一直在考虑 X 呢是一个单独的变量,但是我们同时考虑两个变量的时候,会是什么样子?“X 有 X 的概率分布,旁边再立一条 Y 轴,Y 又满足另外一些关系,两条轴一起张成的就不再是一条线,而是一个面——面上每一小块,都有自己的概率。这一节三件事:联合概率分布怎么摆、怎么从中”投影”出边缘分布、怎么”切片”得到条件分布。

💡 核心导读

  • 联合概率分布(joint probability):两个变量同时取值的概率,装进一张二维表格,每格一块”概率质量”。
  • 想象 z 轴上的一排钉子:每个格子上钉出一根与平面垂直的柱子,高低就是概率——1/20 只冒矮矮一截,3/20 正好比它高三倍。
  • 边缘分布(marginal probability):把不关心的变量方向”加没了”,就是往数轴上投影;两个方向各自的和都必须等于 1。
  • 条件分布:把已知条件的那一列切出来,形状保留、总和却不是 1,所以要做归一化(normalization)——逐项除以切片的总和。
  • 加法推到底:升到三维,把不关心的方向一路叠掉;把函数值按概率全部叠完,得到的正是上一节的期望。

联合概率:两条轴张成一个面

只有一个变量 X 时,它的分布摆在一条数轴上:取 1、2、3,各占一份概率,加起来为 1。现在把 Y 轴也请进来——X、Y 都取 1、2、3,“它们之间就构成了一个面”。面上的每个小格子,代表”X 取某个值且 Y 取某个值”这对组合的概率,这就是联合概率分布 P(X,Y)P(X, Y)。讲师课堂用的是这样一张 3×3 表:

X\YX \backslash Y123边缘 P(X)
11/201/201/201/201/201/203/203/20
22/202/202/202/202/202/206/206/20
33/203/204/204/204/204/2011/2011/20
边缘 P(Y)6/206/207/207/207/207/201

最右一列和最下一行的”边缘”先混个脸熟,下一节现场把它们算出来。格子里装的就是联合概率,例如 P(X=2,Y=1)=2/20P(X=2, Y=1) = 2/20;整张表 20 份概率质量,总和为 1。

这张平面表还欠一点立体感,讲师的现场演示是:假设有一个 z 轴——每个格子上”钉”出一根与平面垂直的钉子,1/20 的格子只冒出矮矮一截,“3/20 就比它高三倍”。整片钉子高低错落,钉子的高低就代表概率的大小;而把所有高低合在一起,又是等于一的。以后见到任何联合分布,都可以在脑子里把这张”钉子平面”调出来。

边缘分布:把一个方向”加没了”

很多时候我们只关心其中一个变量——只看 X,Y 取什么无所谓。这时就把 Y 的方向加没了:每一行内部的三个格子加在一起,剩下的就是 X 自己的分布,称为边缘分布(marginal probability)。讲师特意宽慰大家”不用关心那个公式”——公式只是把”把一个方向加掉”写成记号而已:

P(X=x)=∑yP(X=x,Y=y)P(Y=y)=∑xP(X=x,Y=y)P(X = x) = \sum_{y} P(X = x, Y = y) \qquad P(Y = y) = \sum_{x} P(X = x, Y = y)

对着上表现场演两笔,讲师的口算全程可复算:

  • 对 Y 方向加和(按行加):第一行 1/20+1/20+1/20=3/201/20 + 1/20 + 1/20 = 3/20;第二行三颗一样高的钉子,合在一起是 6/206/20;第三行 3/20+4/20+4/20=11/203/20 + 4/20 + 4/20 = 11/20。X 的边缘分布 (3/20,6/20,11/20)(3/20, 6/20, 11/20) 到手。
  • 对 X 方向加和(按列加):第一列 1/20+2/20+3/20=6/201/20 + 2/20 + 3/20 = 6/20;再扫过去一列,1/20+2/20+4/201/20 + 2/20 + 4/20 合在一起是 7/207/20——“那这就是 Y 的一个分布了”。三列都加完,Y 的边缘分布 (6/20,7/20,7/20)(6/20, 7/20, 7/20) 也到手。

一眼看穿它的几何意义:边缘分布就是投影——把整片钉子平面沿某个方向压扁、摞到轴上,摞出来的那条高度轮廓就是这个变量的分布,总和自然还是 1。讲师点题:“刚才我说的投影,就是所谓的边缘分布。”

用代码把两张边缘分布都算出来,顺手验证”两个方向各自加起来都等于 1”:

# 联合概率表:键为 (x, y),值是 P(X=x, Y=y)
joint = {
    (1, 1): 1/20, (1, 2): 1/20, (1, 3): 1/20,
    (2, 1): 2/20, (2, 2): 2/20, (2, 3): 2/20,
    (3, 1): 3/20, (3, 2): 4/20, (3, 3): 4/20,
}

def marginal(joint, axis):
    """边缘分布:把另一个变量的方向一路加没了。"""
    dist = {}
    for (x, y), p in joint.items():
        key = x if axis == "X" else y
        dist[key] = dist.get(key, 0) + p
    return dist

px = marginal(joint, "X")
py = marginal(joint, "Y")
print("边缘分布 P(X):")
for x, p in sorted(px.items()):
    print(f"  P(X={x}) = {p:.3f}")
print(f"  验证:P(X) 之和 = {sum(px.values()):.2f}")
print("边缘分布 P(Y):")
for y, p in sorted(py.items()):
    print(f"  P(Y={y}) = {p:.3f}")
print(f"  验证:P(Y) 之和 = {sum(py.values()):.2f}")
边缘分布 P(X):
  P(X=1) = 0.150
  P(X=2) = 0.300
  P(X=3) = 0.550
  验证:P(X) 之和 = 1.00
边缘分布 P(Y):
  P(Y=1) = 0.300
  P(Y=2) = 0.350
  P(Y=3) = 0.350
  验证:P(Y) 之和 = 1.00

行加得 (3/20,6/20,11/20)(3/20, 6/20, 11/20)、列加得 (6/20,7/20,7/20)(6/20, 7/20, 7/20),与讲师口算严丝合缝;两个 1.00 也兑现了”无论映射到 x 轴还是 y 轴上,边缘概率都是等于一”。

从二维到三维:一路加下去

二维看懂了,讲师顺势推到三维:再添一条 Z 轴,三个变量同时取值,就是 P(X,Y,Z)P(X, Y, Z) 的联合分布。边缘化的动作完全一样,只是能”加没了”的方向更多:

  • 把 Y、Z 两个方向不断累加,剩下的就是 X 一个变量的分布;
  • 只把 Z 加掉,剩下的 P(X,Y)P(X, Y) 仍是一个二维联合分布——联合与边缘本是相对概念:少一个变量,“联合”就降格成”边缘”;
  • 讲师的收尾最妙:如果对的是一个函数 f(X,Y,Z)f(X, Y, Z),把三个方向按联合概率全部叠加,得到的正是上一节学的期望——加权求和与边缘化,原来是同一套加法。

所以讲师总结:“联合概率和每一个它自己分量之间的这种关系,实际上就是叠加的 marginal probability。“一个”加”字,从联合走到边缘,再走到期望。

条件分布:切一片,再归一化

边缘回答”只看一个变量”,条件回答”已知一部分信息,另一个变量什么样”。条件分布 P(X∣Y=y)P(X \mid Y = y) 读作”Y 等于 y 的条件下 X 的分布”。讲师的做法非常物理:给定联合分布,求”Y 等于 3 的时候 X 的分布”,就”相当于把这一块挑出来”——把 Y=3 那一列从表里切出来。切完看一眼,“一定是这个部分相当于这一块,这个部分相当于这一块,这小部分相当于这一块”——切片完整保留了联合的模样,各段相对高低一点没变。(至于 Y=2 的条件分布:这一列切出来和 Y=3 一模一样,讲师摆摆手:“同样,我就不画了。”)

马上有个坑:任何概率分布,和必须是 1,可切出来的这一片加起来是 P(Y=3)=7/20P(Y=3) = 7/20,并不等于 1。讲师课堂打了个口算的比方:“也许最开始这是 1/10、这是 2/10、这是 3/10”——三段加起来 6/10,不是 1;“把它每一个再除以它们的和”:各除以 6/10,变成 1/6,2/6,3/61/6, 2/6, 3/6,和恰好归一。这一步就叫归一化(normalization)。

落到本表的 Y=3 列:切片是 (1/20,2/20,4/20)(1/20, 2/20, 4/20),总和 7/207/20,逐项归一化:

P(X=1∣Y=3)=1/207/20=17,P(X=2∣Y=3)=27,P(X=3∣Y=3)=47P(X=1 \mid Y=3) = \frac{1/20}{7/20} = \frac{1}{7}, \qquad P(X=2 \mid Y=3) = \frac{2}{7}, \qquad P(X=3 \mid Y=3) = \frac{4}{7}

归一化的分母不是别的,正是 Y 的边缘概率——写成一般式:

P(X∣Y=y)=P(X,Y=y)P(Y=y)P(X \mid Y = y) = \frac{P(X, Y = y)}{P(Y = y)}

把这条式子倒过来写,就是 P(X,Y)=P(Y)⋅P(X∣Y)P(X, Y) = P(Y) \cdot P(X \mid Y)——前面学贝叶斯定理时用过的乘法公式,正是从这张联合表里长出来的。

# 联合概率表(与上一块相同,各代码块自包含)
joint = {
    (1, 1): 1/20, (1, 2): 1/20, (1, 3): 1/20,
    (2, 1): 2/20, (2, 2): 2/20, (2, 3): 2/20,
    (3, 1): 3/20, (3, 2): 4/20, (3, 3): 4/20,
}

def conditional(joint, fixed_var, fixed_val):
    """条件分布 = 切片 + 归一化。返回(原始切片, 归一化后的分布)。"""
    raw = {}
    for (x, y), p in joint.items():
        hit = (fixed_var == "Y" and y == fixed_val) or (fixed_var == "X" and x == fixed_val)
        if hit:
            raw[x if fixed_var == "Y" else y] = p
    total = sum(raw.values())          # 切片之和 = P(fixed_var=fixed_val),不是 1
    return raw, {k: p / total for k, p in raw.items()}

raw, cond = conditional(joint, "Y", 3)
print("Y=3 切片(未归一化):")
for x, p in sorted(raw.items()):
    print(f"  P(X={x}, Y=3) = {p:.3f}")
print(f"  切片之和 = {sum(raw.values()):.3f}(= P(Y=3),不等于 1)")
print("归一化后,条件分布 P(X | Y=3):")
for x, p in sorted(cond.items()):
    print(f"  P(X={x} | Y=3) = {p:.3f}")
print(f"  验证:条件分布之和 = {sum(cond.values()):.3f}")
Y=3 切片(未归一化):
  P(X=1, Y=3) = 0.050
  P(X=2, Y=3) = 0.100
  P(X=3, Y=3) = 0.200
  切片之和 = 0.350(= P(Y=3),不等于 1)
归一化后,条件分布 P(X | Y=3):
  P(X=1 | Y=3) = 0.143
  P(X=2 | Y=3) = 0.286
  P(X=3 | Y=3) = 0.571
  验证:条件分布之和 = 1.000

1/7≈0.1431/7 \approx 0.143、2/7≈0.2862/7 \approx 0.286、4/7≈0.5714/7 \approx 0.571——归一化只改总量,不改相对高低:切片里 X=3 的钉子是 X=1 的四倍高,条件分布里依然是四倍。

📝 动手练一练

  1. 概念辨析:随机变量 X 与 Y 相互独立,边缘分布为 P(X=0)=0.6P(X=0)=0.6、P(X=1)=0.4P(X=1)=0.4;P(Y=0)=0.7P(Y=0)=0.7、P(Y=1)=0.3P(Y=1)=0.3。请写出联合分布全部四个格子的值。(提示:回想独立性一节——独立,意味着联合概率恰好等于边缘概率的乘积。)
👉 点击查看参考答案

独立时 P(X,Y)=P(X)⋅P(Y)P(X, Y) = P(X) \cdot P(Y),四个格子逐个相乘:

Y=0Y=1
X=00.6×0.7=0.420.6 \times 0.7 = 0.420.6×0.3=0.180.6 \times 0.3 = 0.18
X=10.4×0.7=0.280.4 \times 0.7 = 0.280.4×0.3=0.120.4 \times 0.3 = 0.12

验证:0.42+0.18+0.28+0.12=1.000.42 + 0.18 + 0.28 + 0.12 = 1.00;行和恰好还原 P(X)P(X),列和恰好还原 P(Y)P(Y)。这也送你一件侦察工具:一张联合表如果明显偏离”行边缘 × 列边缘”,两个变量八成不独立——正文那张表就是活例子(P(X=1,Y=1)=1/20=0.05P(X=1, Y=1) = 1/20 = 0.05,而边缘乘积 3/20×6/20=0.0453/20 \times 6/20 = 0.045,对不上)。

  1. 动手计算:手动切出正文表格中 X=3 的那一行,先算出 P(Y=2∣X=3)P(Y=2 \mid X=3),再把完整的条件分布 P(Y∣X=3)P(Y \mid X=3) 写出来,最后用代码验证。
👉 点击查看参考答案

按定义 P(Y=2∣X=3)=P(X=3,Y=2)/P(X=3)P(Y=2 \mid X=3) = P(X=3, Y=2) / P(X=3)。X=3 这一行是 (3/20,4/20,4/20)(3/20, 4/20, 4/20),行和 P(X=3)=11/20=0.55P(X=3) = 11/20 = 0.55;于是 P(Y=2∣X=3)=(4/20)/(11/20)=4/11≈0.3636P(Y=2 \mid X=3) = (4/20) / (11/20) = 4/11 \approx 0.3636。完整条件分布用代码验:

joint = {
    (1, 1): 1/20, (1, 2): 1/20, (1, 3): 1/20,
    (2, 1): 2/20, (2, 2): 2/20, (2, 3): 2/20,
    (3, 1): 3/20, (3, 2): 4/20, (3, 3): 4/20,
}
row3 = {y: p for (x, y), p in joint.items() if x == 3}
total = sum(row3.values())
print(f"P(X=3) = {total:.3f}")
for y, p in sorted(row3.items()):
    print(f"  P(Y={y} | X=3) = {p / total:.4f}")
P(X=3) = 0.550
  P(Y=1 | X=3) = 0.2727
  P(Y=2 | X=3) = 0.3636
  P(Y=3 | X=3) = 0.3636

P(Y∣X=3)=(3/11,4/11,4/11)≈(0.273,0.364,0.364)P(Y \mid X=3) = (3/11, 4/11, 4/11) \approx (0.273, 0.364, 0.364)。切片的味道又来了:行里两颗最高的钉子(各 4/20)切出来归一化后依旧并列最高——归一化只改总量,不改相对高低;顺手还能读出一条信息:已知 X=3 时,Y 取 2 和取 3 的可能性打平,都比取 1 更大。

本章小结

联合概率分布把两个变量放进同一张表:每格一块概率质量,想象 z 轴上一片高低错落的钉子,全表总和为 1。边缘分布是把不关心的方向”加没了”——按行加、按列加,两个方向各自归一;它也是投影,把钉子平面沿一个方向压扁摞到轴上。条件分布是把已知的那一列”切”出来——形状原样保留,再逐项除以切片总和(正好是那个变量的边缘概率)完成归一化。切、加、归一这三把刀,后面章节会反复操起;下一节起,镜头转向一个个具体的分布家族——从最简单的伯努利开始。

📋 行动清单

  • 对照正文联合表,把 X、Y 两个方向的边缘分布各手算一遍,验证两个方向加起来都恰好是 1
  • 分别切出 Y=1、Y=2 两列并归一化,算出 P(X∣Y=1)P(X \mid Y=1) 与 P(X∣Y=2)P(X \mid Y=2),体会”切哪列,哪列的和就是分母”
  • 用”投影 = 边缘、切片 + 归一化 = 条件”两句话,向身边人复述本节

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第2章课件:机器学习的数学基础 II(概率)
    下载