4. 泊松过程的叠加与稀疏
前几节我们讨论的都是单一泊松流:事件以某个速率 λ 独立、无记忆地到达。但在真实系统里,事件往往来自多个源头,或者到达后还要被进一步分类。呼叫中心同时接到中文、英文、西班牙语来电;电商平台同时收到普通订单、预售订单、退货申请。这一节要解决两个方向相反的问题:多个流合并成一个流(叠加),以及一个流按概率拆成多个子流(稀疏/标记)。这两个定理是泊松过程最实用的性质之一,也是后续排队建模和仿真实现的基础。
叠加定理:独立泊松流相加仍是泊松流
设 K 个相互独立的泊松过程 N₁(t), N₂(t), …, N_K(t),速率分别为 λ₁, λ₂, …, λ_K。把它们的事件放在一起,得到合并过程 N(t) = N₁(t) + … + N_K(t)。叠加定理告诉我们:N(t) 仍然是泊松过程,速率等于各分速率之和 λ = λ₁ + λ₂ + … + λ_K。
这个结论的直观解释是:泊松过程的“无记忆性”在合并后依然成立——无论当前时刻距离上一个事件多久,下一个事件来自哪个流、何时到达,都不受历史影响。合并后任意长度 t 的时间区间内事件数服从 Poisson(λt),且区间内事件到达时刻的条件分布与单一泊松过程完全一致。
一个常被忽略但很重要的推论是:合并流中每个事件来自哪个源,其归属是独立同分布的,第 i 个源所占比例为 p_i = λ_i / λ。也就是说,叠加之后我们不仅能知道总速率,还能按比例“反推”来源构成。这一点在后面的案例里会直接用到。
稀疏(标记)定理:按概率拆分仍是泊松流
反方向的操作是稀疏。设 N(t) 是速率为 λ 的泊松过程,每个事件独立地以概率 p 被标记为“类型 A”,以概率 1−p 被标记为“类型 B”。稀疏定理指出:类型 A 的事件构成一个速率为 λp 的泊松过程,类型 B 的事件构成一个速率为 λ(1−p) 的泊松过程,且两者相互独立。
这里的关键词是“独立”和“每个事件独立标记”。如果标记不是逐事件独立进行的(例如按时间窗口批量分类、或存在相关性),结论就不再成立。实际建模时,只要分类决策对每个事件单独做出、且不依赖到达时刻,就可以放心使用稀疏定理。
叠加与稀疏互为逆操作,可以组合使用:先把多个流叠加成一个总流,再按类型稀疏成若干子流;或者先把一个流稀疏成子流,再分别与其它流叠加。这种“先合后分”或“先分后合”的结构,是构建复杂到达模型的基本积木。
案例建模:呼叫中心的多语言来电与订单类型拆分
假设某呼叫中心有三条独立来电线路:中文来电速率 λ₁ = 6 次/分钟,英文来电 λ₂ = 3 次/分钟,西班牙语来电 λ₃ = 1 次/分钟。三条线路的到达相互独立,且各自服从泊松过程。
第一步,叠加。总来电流是三者之和,速率 λ = 6 + 3 + 1 = 10 次/分钟。根据叠加定理,总流仍是泊松过程。这意味着我们可以用单一泊松过程来模拟总来电,而不必分别模拟三条线路再合并——在仿真实现上这能显著简化代码。同时,任意一通来电属于中文的概率是 p₁ = 6/10 = 0.6,英文 0.3,西班牙语 0.1。
第二步,稀疏。现在考虑业务分类:每通来电在接入后,坐席会将其标记为“咨询”“投诉”“办理”三类之一。假设标记是逐通独立做出的,比例为 0.5、0.3、0.2。根据稀疏定理,三类来电各自构成泊松过程,速率分别为 10×0.5 = 5、10×0.3 = 3、10×0.2 = 2 次/分钟,且三者相互独立。
这里有一个容易混淆的点:语言维度和业务类型维度是两个不同的标记维度。我们可以先按语言稀疏、再按业务类型稀疏,也可以反过来,结果一致——因为每次标记都是逐事件独立的。但如果业务类型的分布依赖于语言(例如中文来电中“咨询”占比更高),那么两个维度就不再独立,需要按条件概率分层处理:先按语言稀疏,再在每个语言子流内按各自的业务比例二次稀疏。这仍然是合法的,因为每一层内部都满足逐事件独立标记。
仿真实现要点
在代码层面,叠加与稀疏可以极大简化模拟。与其分别生成三条线路的到达时刻再排序合并,不如直接以 λ = 10 生成总流的到达间隔(指数分布,均值 1/10 分钟),然后对每个到达时刻独立抽取一个类型标签。下面是一个可运行的 Python 片段(示例参数,非实测结果):
import numpy as np
rng = np.random.default_rng(42)
lam_total = 10.0 # 次/分钟
T = 60.0 # 模拟 60 分钟
n = rng.poisson(lam_total * T) # 总事件数
arrivals = np.sort(rng.uniform(0, T, n)) # 条件分布:均匀
# 按语言稀疏(逐事件独立)
lang_p = [0.6, 0.3, 0.1]
lang = rng.choice(['中文','英文','西语'], size=n, p=lang_p)
# 按业务类型稀疏
biz_p = [0.5, 0.3, 0.2]
biz = rng.choice(['咨询','投诉','办理'], size=n, p=biz_p)
for name in ['中文','英文','西语']:
print(name, (lang == name).sum())
注意这里用“先定总数、再均匀撒点”的方式生成到达时刻,依据是泊松过程在固定区间内给定事件数后,到达时刻的条件分布是均匀分布。这与逐次抽取指数间隔在分布上等价,但向量化后更快。运行后各类型的计数应围绕 λ_i×T 波动,例如中文约 360 次、英文约 180 次、西语约 60 次(60 分钟示例)。判断模型是否正确,可以看两点:各类型计数的均值是否接近理论值,以及类型之间是否存在相关性——独立稀疏下应无相关。
把这两个定理用熟,后续建立多类顾客、多服务台的排队模型时,就可以把复杂的到达结构拆解成若干个标准泊松流分别处理,再通过叠加汇总系统负载。这是泊松过程建模中最常用的“分而治之”手法。