2.4 常见离散分布
2.2 节把随机变量定义为样本点到实数的映射,并引入了累积分布函数
把生成机制写下来,概率就由少数几个参数决定,分布也随之确定。这样的分布集合称为分布族(distribution family)。分布族的价值在于压缩模型:把无穷多个自由参数缩减为两三个有明确含义的数值,同时保留对数据来源的理解。日常生活中许多量都有清晰的生成机制,例如抛
本节按生成机制把常见的离散分布串成一条线索,而不孤立罗列。先从最基础的赋值方式出发,得到离散均匀分布与分类分布;加入独立重复试验的假设,得到伯努利分布、二项分布与多项分布;改变停止规则,得到几何分布与负二项分布;去掉有放回这一条件,得到超几何分布与泊松-二项分布;控制稀有事件的发生率,得到泊松分布;最后处理长尾与零过多这两类实际数据中常见的偏离,并给出经验分布这一非参数对象。每个分布都给出生成机制、概率质量函数、期望与方差、典型场景与参数含义,并用代码验证。下一节把同一套思路用于连续分布,本节末尾的分布关系图为 2.7 节的极限定理与 2.11 节的参数估计提供索引。
2.4.1 离散均匀分布与分类分布
离散均匀分布
最简单的离散分布是离散均匀分布(discrete uniform distribution)。生成机制是从有限个结果中任取一个,每个结果被选中的可能性相同。当取值集合为
取值集合为
掷一颗均匀骰子是
分类分布
分类分布(categorical distribution)把取值从等概率推广到任意概率。设随机变量
离散均匀分布是
分类分布的期望与方差取决于类别标签的数值编码。若把类别编码为一个独热向量
import numpy as np
from scipy import stats
# 离散均匀分布:均匀骰子,取值 {1, ..., 6}
du = stats.randint(1, 7) # scipy 约定区间为 [low, high),即 {1, ..., 6}
print(f"PMF(k=3) = {du.pmf(3):.4f}") # 1/6 ≈ 0.1667
print(f"理论均值 = {du.mean():.4f}") # (1 + 6)/2 = 3.5
print(f"理论方差 = {du.var():.4f}") # (6^2 - 1)/12 ≈ 2.9167
print(f"模拟均值 = {du.rvs(size=100000, random_state=0).mean():.4f}") # ≈ 3.5
# 分类分布:三类,概率 (0.5, 0.3, 0.2)
rng = np.random.default_rng(0)
probs = np.array([0.5, 0.3, 0.2])
samples = rng.choice(3, size=100000, p=probs)
print(f"各类别频率 = {np.bincount(samples, minlength=3) / 100000}") # ≈ [0.5, 0.3, 0.2]
# 用 rv_discrete 构造任意分类分布并计算期望方差
cat = stats.rv_discrete(values=(np.arange(1, 4), probs))
print(f"分类期望 = {cat.mean():.4f}, 分类方差 = {cat.var():.4f}") # 1.7 0.61分类分布的方差在标签序号编码下依赖类别的排列,改变类别顺序会改变数值。分类任务中若需要与顺序无关的概括量,通常报告熵或最大类别概率,而不报告标签序号的方差。
为什么需要分布族
只给定
2.4.2 伯努利分布与二项分布
伯努利分布
伯努利分布(Bernoulli distribution)描述单次二元试验。随机变量
期望与方差为
方差在
二项分布
把
组合数
方差的推导用到独立性:独立随机变量之和的方差等于方差之和(2.3 节)。二项分布的两个参数含义清楚,
泊松近似
当
当
这就是泊松极限定理。它说明试验次数很多、单次概率很小时,成功次数只由期望
正态近似与中心极限定理的预告
当
则
import numpy as np
from scipy import stats
n, p = 100, 0.05
lam = n * p
b = stats.binom(n, p)
po = stats.poisson(lam)
print(f"二项均值 {b.mean():.3f},方差 {b.var():.3f}") # 5.000 4.750
print(f"泊松均值 {po.mean():.3f},方差 {po.var():.3f}") # 5.000 5.000
# 泊松近似:比较若干取值的 PMF
for k in range(4):
print(f"k={k}: 二项 {b.pmf(k):.5f} 泊松 {po.pmf(k):.5f}")
# k=0: 二项 0.00592 泊松 0.00674
# k=1: 二项 0.03116 泊松 0.03369
# k=2: 二项 0.08118 泊松 0.08422
# k=3: 二项 0.13958 泊松 0.14037
# 正态近似:计算 P(X <= 8)
z = (8 - lam) / np.sqrt(n * p * (1 - p))
print(f"二项精确 P(X<=8) = {b.cdf(8):.4f}") # 0.9369
print(f"正态近似 = {stats.norm.cdf(z):.4f}") # 0.9487正态近似在
二项分布的两种近似
泊松近似只保留
2.4.3 多项分布、狄利克雷-多项分布与贝塔-二项分布
多项分布
多项分布(multinomial distribution)是二项分布向多类别的推广。进行
多项系数
负相关的来源是计数总和固定为
贝塔-二项分布与过散布
二项分布假设单次成功概率
其中
令
方括号中的因子大于
狄利克雷-多项分布
把贝塔分布换成它的多元推广狄利克雷分布(Dirichlet distribution),取
边缘期望为
括号外的因子
import numpy as np
from scipy import stats
rng = np.random.default_rng(1)
# 多项分布:n = 50,三类概率 (0.5, 0.3, 0.2)
n, p = 50, np.array([0.5, 0.3, 0.2])
counts = rng.multinomial(n, p, size=100000)
print(f"各类均值 = {counts.mean(axis=0)}") # ≈ [25. 15. 10.]
print(f"各类方差 = {counts.var(axis=0)}") # ≈ [12.5 10.5 8.0],与 n p (1-p) 一致
# 贝塔-二项与二项对比:n = 20,二项 p = 2/7,贝塔-二项 a = 2, b = 5
bb = stats.betabinom(20, 2, 5)
bi = stats.binom(20, 2 / 7)
print(f"二项方差 = {bi.var():.4f}") # ≈ 4.0816
print(f"贝塔-二项方差 = {bb.var():.4f}") # ≈ 13.7778,因子 (7+20)/(7+1) ≈ 3.375
print(f"两者均值相同 = {bi.mean():.4f}, {bb.mean():.4f}") # 5.7143 5.7143方差之比
2.4.4 几何分布与负二项分布
几何分布与无记忆性
几何分布(geometric distribution)描述在独立重复的伯努利试验中,首次成功所需的试验次数。若单次成功概率为
期望与方差为
几何分布具有无记忆性(memorylessness):对任意
推导用到
负二项分布
负二项分布(negative binomial distribution)描述首次成功推广为第
期望与方差为
负二项分布与几何分布的关系是求和:stats.nbinom(n, p) 采用后一种约定,第一个参数
负二项分布与过散布
按失败次数参数化时(记成功次数为
方差与均值之比为
第二项使方差大于均值,超出量由参数
import numpy as np
from scipy import stats
p = 0.2
g = stats.geom(p) # 试验次数,取值 >= 1
print(f"几何均值 {g.mean():.3f},方差 {g.var():.3f}") # 5.000 20.000
# 无记忆性验证
print(f"P(X>10)/P(X>5) = {g.sf(10) / g.sf(5):.6f}") # ≈ 0.327680 = 0.8^5
print(f"P(X>5) = {g.sf(5):.6f}") # 0.327680
# 负二项:scipy 约定为第 n 次成功前的失败次数
nb = stats.nbinom(5, 0.5)
po = stats.poisson(5)
print(f"负二项均值 {nb.mean():.3f},方差 {nb.var():.3f}") # 5.000 10.000
print(f"同均值泊松方差 = {po.var():.3f}") # 5.000,说明负二项过散布
print(f"方差/均值 = {nb.var() / nb.mean():.3f}") # 2.000 = 1 / p计数约定容易混淆
几何分布与负二项分布都有两套常见计数方式:一套记录试验总次数,取值范围从 geom 使用试验次数,nbinom 使用失败次数。混用两套约定会让均值相差一个偏移量,报告结果与写代码时应先确认约定。
2.4.5 超几何分布与泊松-二项分布
超几何分布
前面的二项分布假设各次试验相互独立,这在有放回抽样时成立。无放回抽样时,前一次抽到的结果会改变后一次的概率,计数服从超几何分布(hypergeometric distribution)。设总体中有
期望与方差为
方差的最后一项
泊松-二项分布
泊松-二项分布(Poisson-binomial distribution)描述
概率质量函数的显式表达需要展开生成函数
import numpy as np
from scipy import stats
# 超几何:总体 500,其中 50 个阳性,无放回抽 10 个
hg = stats.hypergeom(M=500, n=50, N=10) # scipy: M 总体, n 属性数, N 抽取数
bi = stats.binom(10, 0.1)
print(f"超几何均值 {hg.mean():.4f},方差 {hg.var():.4f}") # 1.0000 0.8838
print(f"二项 均值 {bi.mean():.4f},方差 {bi.var():.4f}") # 1.0000 0.9000
print(f"有限总体校正因子 = {hg.var() / bi.var():.4f}") # ≈ 0.9820
# 泊松-二项:10 次独立伯努利试验之和,成功率各不相同
rng = np.random.default_rng(2)
ps = np.array([0.05, 0.08, 0.1, 0.12, 0.15, 0.1, 0.09, 0.11, 0.07, 0.13])
sims = (rng.random((200000, ps.size)) < ps).sum(axis=1)
print(f"模拟均值 = {sims.mean():.4f},理论均值 = {ps.sum():.4f}") # 1.00 1.00
print(f"模拟方差 = {sims.var():.4f},理论方差 = {np.sum(ps * (1 - ps)):.4f}") # 0.86 0.8645把超几何分布误当成二项分布会低估方差的风险较小(两者很接近),但在抽样比例
2.4.6 泊松分布与泊松过程
泊松分布
泊松分布(Poisson distribution)描述给定区间内稀有事件发生的次数。参数
期望与方差相等:
这一等式是泊松分布最显著的特征,也是检验计数数据是否适合泊松模型的常用判据:若样本方差远大于样本均值,说明存在过散布,需要考虑负二项或零膨胀等替代模型。泊松分布的典型场景包括单位时间内到达服务台的顾客数、一页书上印刷错误的个数、某路段一天内发生的轻微事故数、一段音频中出现的爆音次数。
泊松极限定理
上一节已在二项分布中给出泊松极限定理的推导,此处补充它的适用范围。定理成立的条件是
泊松过程
泊松分布描述固定区间上的计数,泊松过程(Poisson process)描述计数在时间上的展开。速率参数为
import numpy as np
from scipy import stats
# 泊松极限:n 增大、p 减小、np 固定为 5
for n in [10, 100, 1000]:
p = 5 / n
print(f"n={n:4d}, p={p:.4f}, 二项 PMF(3) = {stats.binom(n, p).pmf(3):.5f}")
# n= 10, p=0.5000, 二项 PMF(3) = 0.11719
# n= 100, p=0.0500, 二项 PMF(3) = 0.13958
# n=1000, p=0.0050, 二项 PMF(3) = 0.14030
print(f"泊松 PMF(3) = {stats.poisson(5).pmf(3):.5f}") # 0.14037
# 泊松过程:速率 3 的事件流,模拟到达时刻并统计单位区间计数
rng = np.random.default_rng(3)
lamb = 3.0
gaps = rng.exponential(1 / lamb, size=20000)
arrivals = np.cumsum(gaps)
T = arrivals[-1]
counts = np.histogram(arrivals, bins=int(T), range=(0, T))[0]
print(f"单位区间计数均值 = {counts.mean():.4f}") # ≈ 3.0
print(f"单位区间计数方差 = {counts.var():.4f}") # ≈ 3.0,与均值接近,符合泊松特征泊松过程的两个视角
计数视角把时间切成区间,用泊松分布描述每段的计数;间隔视角关注相邻事件的等待时间,用指数分布描述。两者由同一速率参数
2.4.7 幂律分布与齐夫分布
幂律分布与长尾
前几节的计数分布(二项、泊松、负二项)的尾部随
归一化后写成
齐夫分布
齐夫分布(Zipf distribution)是有限支撑上幂律的一种形式。设取值
当 stats.zipf(a) 采用无限支撑形式,要求
重尾与对数坐标
识别幂律的常用方法是在双对数坐标下观察概率质量函数是否近似为直线。由
import numpy as np
from scipy import stats
z = stats.zipf(2.0)
print(f"均值 = {z.mean()}") # inf,因 a = 2 时期望发散
print(f"P(X=1)={z.pmf(1):.4f}") # 1/zeta(2) ≈ 0.6079
print(f"P(X=2)={z.pmf(2):.4f}") # 0.1520
print(f"P(X=10)={z.pmf(10):.4f}") # 0.0061
# 在双对数坐标下检查线性关系
ks = np.arange(1, 500)
pmf = z.pmf(ks)
slope = np.polyfit(np.log(ks), np.log(pmf), 1)[0]
print(f"log-log 斜率 = {slope:.4f}") # ≈ -2.0,与幂律指数对应2.4.8 零膨胀计数模型
零过多的来源
实际计数数据中经常出现零的比例高于标准模型预测的现象。以泊松分布为例,
两部分的混合结构
零膨胀泊松分布(zero-inflated Poisson,ZIP)用一个两部分结构描述上述机制。以概率
期望与方差为
方差大于均值,超出量为
import numpy as np
from scipy import stats
# 零膨胀泊松:结构零比例 pi = 0.3,计数部分 lambda = 4
pi, lam = 0.3, 4.0
k = np.arange(0, 11)
pmf_zip = pi * (k == 0) + (1 - pi) * stats.poisson(lam).pmf(k)
print(f"泊松(4) 零概率 = {stats.poisson(lam).pmf(0):.4f}") # 0.0183
print(f"ZIP 零概率 = {pmf_zip[0]:.4f}") # 0.3128
print(f"ZIP 均值 = {(1 - pi) * lam:.4f}") # 2.8000
print(f"ZIP 方差 = {(1 - pi) * lam * (1 + pi * lam):.4f}") # 6.1600,方差约为均值的 2.2 倍
# 从 ZIP 采样并与泊松对比零的比例
rng = np.random.default_rng(5)
n = 100000
is_struct_zero = rng.random(n) < pi
counts = np.where(is_struct_zero, 0, rng.poisson(lam, size=n))
print(f"ZIP 模拟零比例 = {np.mean(counts == 0):.4f}") # ≈ 0.3128零膨胀模型的参数
2.4.9 经验分布
经验分布函数
经验分布(empirical distribution)把观测样本本身当作分布的估计,不假定任何参数形式。给定样本
它统计不超过
与多项分布的关系
把实轴划分成
重抽样的基础
经验分布把概率质量
import numpy as np
from scipy import stats
rng = np.random.default_rng(4)
x = rng.poisson(3, size=200) # 来自 Poisson(3) 的样本
def ecdf(t, data):
return np.mean(data <= t)
print(f"经验 CDF(2) = {ecdf(2, x):.4f}") # 与理论值接近
print(f"理论 CDF(2) = {stats.poisson(3).cdf(2):.4f}") # 0.4232
# 经验分布的均值与方差是对样本均值与方差的估计
print(f"经验均值 = {x.mean():.4f},经验方差 = {x.var(ddof=1):.4f}") # 接近 3 与 3
# 自助法:用经验分布重抽样,估计样本均值的标准误
boot_means = np.array([rng.choice(x, size=x.size, replace=True).mean() for _ in range(2000)])
print(f"自助法标准误 = {boot_means.std(ddof=1):.4f}") # 接近 sqrt(3/200) ≈ 0.1225经验分布在样本量小时支撑稀疏,尾部估计粗糙;在样本量大时计算成本随样本量线性增长。它是众多非参数方法的基础,但在需要外推到样本范围之外的场景中并不适用,因为经验分布永远给不出观测范围以外的新取值。
2.4.10 分布关系的整体图景
把本节讨论的分布按生成机制排列,可以得到几条清晰的联系路径。极限关系描述一种分布在大参数极限下趋于另一种分布;混合关系描述把参数随机化后得到的更分散的分布;共轭关系描述参数估计中先验与后验保持同一分布族的情形。
| 关系类型 | 分布对 | 条件 | 结果 |
|---|---|---|---|
| 极限 | 二项 → 泊松 | 稀有事件计数 | |
| 极限 | 二项 → 正态 | 中心极限定理特例(2.7 节) | |
| 极限 | 超几何 → 二项 | 有放回与无放回趋于一致 | |
| 极限 | 负二项 → 泊松 | 过散布参数 | 过散布消失 |
| 极限 | 齐夫 → 幂律 | 无限支撑幂律 | |
| 混合 | 贝塔-二项 | 过散布的二项 | |
| 混合 | 狄利克雷-多项 | 过散布的多项 | |
| 混合 | 零膨胀泊松 | 退化分布与泊松混合 | 零过多且过散布 |
| 共轭 | Beta 与二项 | 先验 | 后验仍为 |
| 共轭 | Dirichlet 与多项 | 先验 | 后验仍为 |
| 分解 | 二项 = 伯努利之和 | 期望与方差可加 | |
| 分解 | 负二项 = 几何之和 |
生成机制的共性可以概括为一句话:先在单次试验层面确定结果的可能取值与概率,再规定试验如何进行(重复次数、是否放回、停止规则),最后决定是否需要引入个体异质或结构零。单次试验的取值从两类别推广到多类别,就得到伯努利到分类、二项到多项的对应;试验条件从独立同分布放宽到独立但不同分布、再到不独立,就得到泊松-二项与超几何分布;引入参数的不确定性,就得到贝塔-二项与狄利克雷-多项分布。
2.4.11 本节小结
从生成机制出发理解离散分布
本节按生成机制把离散分布组织成一条线索。离散均匀分布与分类分布给出最基础的赋值方式;伯努利分布描述单次二元试验,二项分布描述独立重复试验的成功次数,二者由求和关系相连;多项分布把类别推广到多个,贝塔-二项与狄利克雷-多项通过参数随机化引入过散布;几何分布与负二项分布来自改变停止规则,负二项分布同时是过散布计数的常用工具;超几何分布去掉有放回条件,泊松-二项分布去掉成功概率相同的条件;泊松分布刻画稀有事件计数,其期望与方差相等这一特征是检验计数模型是否合适的判据;幂律分布与齐夫分布描述长尾,方差可能不存在;零膨胀模型用两部分混合处理零过多;经验分布把样本当作分布的非参数估计,是自助法的基础。每个分布都对应一个可描述的生成过程,参数都有明确的含义,把参数的含义与数据的来源对应起来,模型的选择才有依据。
下一节把这些分布的连续类比逐一道来。离散情形中由求和定义的累积概率与期望,在连续情形中改为积分;二项分布的连续类比是贝塔分布(作为成功概率的分布),泊松分布的间隔分布是指数分布,幂律分布的连续版本是帕累托分布。连续分布还引入了离散情形没有的工具,例如逆变换采样、正态分布的经验法则与指数族的自然参数。掌握这些对象之后,2.6 节将把一元分布推广到随机向量,讨论联合分布与多元正态分布。
练习题
第 1 题 概念推导
设
参考答案
先计算单个伯努利随机变量的期望与方差。
由
由期望的线性性,
对和方差展开:
当各
独立性只用于方差的计算,期望的推导不需要独立性。若各次试验存在正相关,协方差项为正,方差会大于
第 2 题 计算推理
某学习平台记录每名用户在
参考答案
由贝塔分布的均值
方差用贝塔-二项分布的公式:
固定
两个模型的均值相同,均为
第 3 题 代码验证
用蒙特卡洛方法验证二项分布的泊松近似:取
参考答案
import numpy as np
from scipy import stats
rng = np.random.default_rng(7)
n_sim = 200000
for n, p in [(1000, 0.003), (1000, 0.3)]:
lam = n * p
# 用二项分布直接抽样,避免逐次伯努利试验的开销
sims = rng.binomial(n, p, size=n_sim)
po = stats.poisson(lam)
print(f"n={n}, p={p}, lambda={lam:.1f}")
for k in range(5):
print(f" k={k}: 模拟 {np.mean(sims == k):.5f} 泊松 {po.pmf(k):.5f}")第一组的理论结果为:
模拟频率与泊松概率的差异在千分之一以内,泊松近似成立。第二组中
第 4 题 综合应用
某平台统计一批用户一个月内的网购次数,样本均值约为
参考答案
先检查泊松分布。泊松分布要求方差等于均值,而样本方差
再检查零的比例。
负二项分布可以容纳过散布,其方差为
零膨胀负二项分布同时具备两部分结构:一部分以概率
实际建模时还应检查是否存在过度拟合,并比较 ZIP 与 ZINB 的拟合优度:若计数部分的过散布不明显,ZIP 已经足够;若计数部分方差仍显著大于均值,则应选择 ZINB。
常见错误
错误 1 · 混淆几何分布与负二项分布的两套计数约定
原因:几何分布与负二项分布既可以记录试验总次数,也可以记录失败次数,两套约定的取值范围与均值相差一个偏移量。scipy 的 geom 使用试验次数(取值从 nbinom 使用失败次数(取值从
解决:确定约定后再写公式。记录试验总次数时,几何分布的均值为
错误 2 · 对强相关的计数数据套用二项分布或泊松分布
原因:二项分布要求各次试验独立且成功概率相同,泊松分布要求计数区间不重叠且事件独立。数据中存在个体异质或事件聚集时,方差会超过名义值,标准差被低估,置信区间过窄,检验的显著性被高估。
解决:先比较样本方差与样本均值。方差接近均值时可以尝试泊松模型;方差明显大于均值时改用负二项分布、贝塔-二项分布或零膨胀模型。对无放回抽样场景改用超几何分布,对成功概率不同的独立试验改用泊松-二项分布。
错误 3 · 用多项分布计算两类别计数时忽略负相关
原因:多项分布中各类计数之和固定为
解决:需要联合分布时直接用多项分布的概率质量函数,或由类别概率与计数总和推导。只关心单类计数时可以退化为二项分布,但涉及两类以上同时出现的问题必须保留负相关结构,不可简单相乘。
错误 4 · 把零膨胀模型的两部分参数合并解释
原因:零膨胀泊松分布由结构零与计数两部分混合而成,参数
解决:解释结果时分开报告