L1 第 11 篇 🐣 难度 🕒 9 分钟
概率分布速览:高斯 / 伯努利 / 泊松 / 指数 / 多项分布
统计的"字母表"——所有 ML 模型都建立在这些分布之上。这一篇用直觉 + 代码讲清楚 5 个最常用的。
阿
阿莱
2026/9/15
L1-04 我们讲了概率的基础。 这一篇讲:概率”长什么样”——5 种 ML 里最常用的分布。
为什么要懂分布
每个 ML 任务底层都假设数据来自某种分布:
- 回归 → 高斯分布
- 二分类 → 伯努利分布
- 多分类 → 多项分布(categorical)
- 计数 → 泊松分布
- 等待时间 → 指数分布
不懂分布,就只是”调包”;懂分布,就开始”理解模型在做什么”。
1. 伯努利分布(Bernoulli)
最简单的——一次只有两种结果(成功/失败、正/负、点击/不点击):
只有一个参数 ∈ [0, 1]。
在 ML 里:
- 二分类标签:
- 逻辑回归输出 = 伯努利分布的参数
- 损失函数(交叉熵)= 这个分布的负对数似然
import numpy as np
samples = np.random.binomial(n=1, p=0.7, size=1000)
print(samples.mean()) # ~0.7
2. 多项分布 / Categorical
伯努利的多类推广——一次有 K 种可能:
在 ML 里:
- 多分类标签(softmax 输出就是 categorical 参数)
- 语言模型预测下一个 token = 一次 categorical 抽样
- 分类问题的交叉熵损失底层就是这个
# 给定概率 [0.1, 0.7, 0.2],从 3 个类里采样
samples = np.random.choice(3, size=1000, p=[0.1, 0.7, 0.2])
3. 高斯分布(正态分布 Normal)
ML 里最重要的分布。钟形曲线:
两个参数:均值 ,方差 。
为什么这么常用:
- 中心极限定理:大量独立随机变量的和近似高斯
- 数学上方便(可解析微分、共轭先验等)
- 真实世界很多噪声近似高斯(测量误差、人类身高…)
在 ML 里:
- 线性回归假设残差是高斯
- 权重初始化(Xavier / He)都是高斯
- VAE / Diffusion 模型的潜变量是高斯
- 损失函数 MSE 等价于”假设噪声是高斯的负对数似然”
samples = np.random.normal(loc=0, scale=1, size=1000)
print(samples.mean(), samples.std()) # ~0, ~1
多元高斯
二维及以上的高斯:
协方差矩阵 描述各维度之间的相关性。这是高斯混合模型、卡尔曼滤波等的基础。
4. 泊松分布(Poisson)
计数事件——固定时间内某事件发生几次:
参数 是平均发生率。
典型场景:
- 每天访问网站的用户数
- 每分钟到达呼叫中心的电话数
- 论文里实验的”罕见事件计数”
在 ML 里:
- 推荐系统的隐式反馈建模
- 计数预测(点击数、转化数)
- A/B 测试假设检验(特别是低频事件)
samples = np.random.poisson(lam=3, size=1000)
print(samples.mean()) # ~3
5. 指数分布(Exponential)
等待时间——下一个事件什么时候发生:
典型场景:
- 客户两次到达之间的间隔
- 设备故障之间的时间
- 模型上线后的”无 bug 持续时间”
与泊松的关系:如果事件计数是泊松(参数 ),相邻事件间隔就是指数(同 )。
samples = np.random.exponential(scale=2, size=1000)
print(samples.mean()) # ~2 (scale = 1/lambda)
一图速查
| 分布 | 类型 | 参数 | 一句话用途 |
|---|---|---|---|
| 伯努利 | 离散 | 一次二分类结果 | |
| Categorical | 离散 | 一次多分类结果 | |
| 高斯 | 连续 | 连续值 + 默认噪声假设 | |
| 泊松 | 离散 | 固定时间内事件计数 | |
| 指数 | 连续 | 下一个事件等待时间 |
在 PyTorch 里采样
import torch
# 高斯
torch.distributions.Normal(loc=0, scale=1).sample((1000,))
# 伯努利
torch.distributions.Bernoulli(probs=0.7).sample((1000,))
# Categorical
torch.distributions.Categorical(probs=torch.tensor([0.1, 0.7, 0.2])).sample((1000,))
# 泊松
torch.distributions.Poisson(rate=3.0).sample((1000,))
3 个常见坑
- 把高斯当万能 —— 数据有重尾(如收入、网络延迟)时,高斯严重低估极端值。考虑对数正态、t 分布、Pareto。
- 样本数太小看不出分布 —— 想判断”这数据像不像高斯”,至少需要 30+ 样本 + QQ-plot。
- 多元高斯协方差矩阵奇异 —— 当维度 > 样本数时常见。需要正则化或 PCA 降维。
选哪个分布做模型假设
| 我的数据是 | 用哪个分布 |
|---|---|
| 二元(0/1) | 伯努利 |
| 多类(1…K) | Categorical |
| 连续,单峰,对称 | 高斯 |
| 连续,重尾(极端值多) | Student’s t / Pareto |
| 计数(0,1,2,…) | 泊松 |
| 等待时间 | 指数 / Gamma |
| 比例(0-1 之间) | Beta |
| 严格正数 | 对数正态 / Gamma |
💡 一个观察
所有 ML 损失函数都是某分布的负对数似然:
- MSE = 高斯分布
- 交叉熵 = Categorical / 伯努利
- 泊松 loss = 泊松分布
不是”我选 MSE 作损失”——是”我假设数据是高斯”。 这两种说法在数学上等价,但视角完全不同。
下一篇推荐:L1-12 假设检验 + A/B 测试 或 L1-05 信息论。
📬
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
💬
讨论区
· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 ——
在
src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。