HelloAI
L1 第 11 篇 🐣 难度 🕒 9 分钟

概率分布速览:高斯 / 伯努利 / 泊松 / 指数 / 多项分布

统计的"字母表"——所有 ML 模型都建立在这些分布之上。这一篇用直觉 + 代码讲清楚 5 个最常用的。

阿莱
2026/9/15

L1-04 我们讲了概率的基础。 这一篇讲:概率”长什么样”——5 种 ML 里最常用的分布

为什么要懂分布

每个 ML 任务底层都假设数据来自某种分布:

  • 回归 → 高斯分布
  • 二分类 → 伯努利分布
  • 多分类 → 多项分布(categorical)
  • 计数 → 泊松分布
  • 等待时间 → 指数分布

不懂分布,就只是”调包”;懂分布,就开始”理解模型在做什么”。

1. 伯努利分布(Bernoulli)

最简单的——一次只有两种结果(成功/失败、正/负、点击/不点击):

P(X=1)=p,P(X=0)=1pP(X=1) = p, \quad P(X=0) = 1-p

只有一个参数 pp ∈ [0, 1]。

在 ML 里

  • 二分类标签:y{0,1}y \in \{0, 1\}
  • 逻辑回归输出 = 伯努利分布的参数 pp
  • 损失函数(交叉熵)= 这个分布的负对数似然
import numpy as np
samples = np.random.binomial(n=1, p=0.7, size=1000)
print(samples.mean())  # ~0.7

2. 多项分布 / Categorical

伯努利的多类推广——一次有 K 种可能:

P(X=k)=pk,kpk=1P(X=k) = p_k, \quad \sum_k p_k = 1

在 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 里最重要的分布。钟形曲线:

p(x)=12πσ2exp((xμ)22σ2)p(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

两个参数:均值 μ\mu,方差 σ2\sigma^2

为什么这么常用

  • 中心极限定理:大量独立随机变量的和近似高斯
  • 数学上方便(可解析微分、共轭先验等)
  • 真实世界很多噪声近似高斯(测量误差、人类身高…)

在 ML 里

  • 线性回归假设残差是高斯
  • 权重初始化(Xavier / He)都是高斯
  • VAE / Diffusion 模型的潜变量是高斯
  • 损失函数 MSE 等价于”假设噪声是高斯的负对数似然”
samples = np.random.normal(loc=0, scale=1, size=1000)
print(samples.mean(), samples.std())  # ~0, ~1

多元高斯

二维及以上的高斯:

p(x)=1(2π)dΣexp(12(xμ)TΣ1(xμ))p(\mathbf{x}) = \frac{1}{\sqrt{(2\pi)^d |\Sigma|}} \exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^T \Sigma^{-1}(\mathbf{x}-\boldsymbol{\mu})\right)

协方差矩阵 Σ\Sigma 描述各维度之间的相关性。这是高斯混合模型、卡尔曼滤波等的基础。

4. 泊松分布(Poisson)

计数事件——固定时间内某事件发生几次:

P(X=k)=λkeλk!P(X=k) = \frac{\lambda^k e^{-\lambda}}{k!}

参数 λ\lambda 是平均发生率。

典型场景

  • 每天访问网站的用户数
  • 每分钟到达呼叫中心的电话数
  • 论文里实验的”罕见事件计数”

在 ML 里

  • 推荐系统的隐式反馈建模
  • 计数预测(点击数、转化数)
  • A/B 测试假设检验(特别是低频事件)
samples = np.random.poisson(lam=3, size=1000)
print(samples.mean())  # ~3

5. 指数分布(Exponential)

等待时间——下一个事件什么时候发生:

p(x)=λeλx,x0p(x) = \lambda e^{-\lambda x}, \quad x \geq 0

典型场景

  • 客户两次到达之间的间隔
  • 设备故障之间的时间
  • 模型上线后的”无 bug 持续时间”

与泊松的关系:如果事件计数是泊松(参数 λ\lambda),相邻事件间隔就是指数(同 λ\lambda)。

samples = np.random.exponential(scale=2, size=1000)
print(samples.mean())  # ~2 (scale = 1/lambda)

一图速查

分布类型参数一句话用途
伯努利离散pp一次二分类结果
Categorical离散p1,...,pKp_1, ..., p_K一次多分类结果
高斯连续μ,σ2\mu, \sigma^2连续值 + 默认噪声假设
泊松离散λ\lambda固定时间内事件计数
指数连续λ\lambda下一个事件等待时间

在 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 个常见坑

  1. 把高斯当万能 —— 数据有重尾(如收入、网络延迟)时,高斯严重低估极端值。考虑对数正态、t 分布、Pareto。
  2. 样本数太小看不出分布 —— 想判断”这数据像不像高斯”,至少需要 30+ 样本 + QQ-plot。
  3. 多元高斯协方差矩阵奇异 —— 当维度 > 样本数时常见。需要正则化或 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(见组件注释里的配置步骤)。