📝 到达过程黑话
  • arrival process (到达过程): 事件在时间轴上一个个冒出来的随机过程
  • N(t)N(t): 到时刻 tt 为止发生了多少次事件 (计数视角)
  • TkT_k: 第 kk 次事件发生的时刻 (等待视角)
  • λ\lambda: rate, 单位时间平均发生几次
  • survival function S(t)=P(T>t)S(t) = P(T > t): “撑到 tt 还没出事” 的概率
  • hazard rate h(t)h(t): 风险率, 已经活到 tt 了, 下一瞬间出事的密度
  • shape parameter kk: Weibull 里控制 hazard 走势的那个形状参数
1
2
3
4
5
6
7
8
9
Binomial (n 次独立试验, 每次概率 p)
↓ n → ∞, p → 0, np = λt 固定
Poisson(λt) "固定一段时间 t, 数一数发生了几次"
↓ 反过来问: 等第 1 次要多久
Exponential(λ) "间隔时间, 无记忆"
↓ 把 k 个间隔加起来
Gamma(k, λ) "等到第 k 次要多久"
↓ 放弃 λ 恒定的假设, 让风险率随时间变
Weibull(k, λ) "会老化 / 会磨合的那种失效"

Poisson: 把二项分布拉到极限

先讲怎么来的; 我们把一段长度为 tt 的时间切成 nn 个极小的格子, 每个格子里最多发生一次事件, 发生的概率是 pp; 既然平均下来这段时间要发生 λt\lambda t 次, 那么每格的概率就是

p=λtnp = \frac{\lambda t}{n}

然后让 n→∞n \to \infty, 格子无限细, 每格概率无限小, 但两者乘积保持 λt\lambda t 不变:

P(X=k)=lim⁡n→∞(nk)pk(1−p)n−k=lim⁡n→∞n!(n−k)! k!(λtn)k(1−λtn)n−kP(X = k) = \lim_{n \to \infty} \binom{n}{k} p^k (1-p)^{n-k} = \lim_{n \to \infty} \frac{n!}{(n-k)!\,k!} \left(\frac{\lambda t}{n}\right)^k \left(1 - \frac{\lambda t}{n}\right)^{n-k}

kk 固定而 n→∞n \to \infty, 所以 n!(n−k)!=n(n−1)⋯(n−k+1)∼nk\dfrac{n!}{(n-k)!} = n(n-1)\cdots(n-k+1) \sim n^k, 前面那坨阶乘直接塌成 nkk!\dfrac{n^k}{k!}:

=lim⁡n→∞nkk!⋅(λt)knk(1−λtn)n−k=(λt)kk!⋅lim⁡n→∞(1−λtn)n⋅lim⁡n→∞(1−λtn)−k= \lim_{n \to \infty} \frac{n^k}{k!} \cdot \frac{(\lambda t)^k}{n^k} \left(1 - \frac{\lambda t}{n}\right)^{n-k} = \frac{(\lambda t)^k}{k!} \cdot \lim_{n \to \infty} \left(1 - \frac{\lambda t}{n}\right)^{n} \cdot \lim_{n \to \infty} \left(1 - \frac{\lambda t}{n}\right)^{-k}

右边两个极限, 第二个因为指数 −k-k 是常数而底数趋于 1, 直接是 1; 第一个就是整篇笔记里 ee 唯一的出处, 值得单独拎出来说;

那个 e−λte^{-\lambda t} 到底是哪来的

很多讲义到这一步直接写"由重要极限得 e−λte^{-\lambda t}"就过去了, 但是这一步其实才是 Poisson 里最有意思的地方: 一个纯组合的计数问题, 凭什么会长出一个超越数;

先把 ee 本身摆出来; 它有两种等价定义, 一种是极限式, 一种是级数式:

ex:=lim⁡n→∞(1+xn)nex:=∑j=0∞xjj!e^x := \lim_{n \to \infty}\left(1 + \frac{x}{n}\right)^n \qquad e^x := \sum_{j=0}^{\infty} \frac{x^j}{j!}

这两个为什么是同一个东西? 把左边那个用二项式定理展开就看见了:

(1+xn)n=∑j=0n(nj)xjnj=∑j=0nn(n−1)⋯(n−j+1)nj⏟n→∞ 时→1⋅xjj!  ⟶  ∑j=0∞xjj!\left(1 + \frac{x}{n}\right)^n = \sum_{j=0}^{n} \binom{n}{j} \frac{x^j}{n^j} = \sum_{j=0}^{n} \underbrace{\frac{n(n-1)\cdots(n-j+1)}{n^j}}_{n \to \infty \text{ 时} \to 1} \cdot \frac{x^j}{j!} \;\longrightarrow\; \sum_{j=0}^{\infty} \frac{x^j}{j!}

也就是说, 二项分布拉到极限会冒出 ee, 跟"二项式展开拉到极限就是 exe^x 的级数"是同一件事; 我们在 Poisson 推导里做的那个 n!(n−j)!∼nj\frac{n!}{(n-j)!} \sim n^j 的塌缩, 跟这里那个下括号是一模一样的操作, 只不过一次用在了单项 kk 上, 一次用在了求和的每一项上;

如果不想展开二项式, 直接用等价无穷小也能一句话打完; 取对数, 令 x=−λt/n→0x = -\lambda t/n \to 0, 用 ln⁡(1+x)\ln(1+x) 的级数:

nln⁡(1−λtn)=n(−λtn−12(λt)2n2−13(λt)3n3−⋯ )=−λt−(λt)22n−⋯⏟n→∞ 时→0n \ln\left(1 - \frac{\lambda t}{n}\right) = n\left(-\frac{\lambda t}{n} - \frac{1}{2}\frac{(\lambda t)^2}{n^2} - \frac{1}{3}\frac{(\lambda t)^3}{n^3} - \cdots\right) = -\lambda t - \underbrace{\frac{(\lambda t)^2}{2n} - \cdots}_{n \to \infty \text{ 时} \to 0}

高阶项全都带着 1/n1/n 被扔掉, 只剩线性那一项活下来, 所以

lim⁡n→∞(1−λtn)n=e−λt\lim_{n \to \infty}\left(1 - \frac{\lambda t}{n}\right)^{n} = e^{-\lambda t}

这也顺带解释了为什么"每格概率 →0\to 0 而格子数 →∞\to \infty"这种设定不会退化成 0 或者 1: 一阶项 n⋅(−λt/n)n \cdot (-\lambda t/n) 是个不随 nn 变的常数, 恰好被保留, 二阶以上的全被 nn 稀释掉了; λt\lambda t 固定这个约束就是为了让这个一阶项活下来;

于是最终

P(X=k)=(λt)kk!e−λtP(X = k) = \frac{(\lambda t)^k}{k!} e^{-\lambda t}

顺手做个自洽性检查

既然 ex=∑jxjj!e^x = \sum_j \frac{x^j}{j!}, 那把所有 kk 的概率加起来:

∑k=0∞(λt)kk!e−λt=e−λt∑k=0∞(λt)kk!=e−λt⋅eλt=1\sum_{k=0}^{\infty} \frac{(\lambda t)^k}{k!} e^{-\lambda t} = e^{-\lambda t} \sum_{k=0}^{\infty} \frac{(\lambda t)^k}{k!} = e^{-\lambda t} \cdot e^{\lambda t} = 1

归一化白送; 换句话说 Poisson 的那个 (λt)kk!\frac{(\lambda t)^k}{k!} 本来就是 eλte^{\lambda t} 级数的第 kk 项, 前面那个 e−λte^{-\lambda t} 就是把整条级数除掉当归一化常数用的; 这么一看这个分布简直是硬凑出来的 从这个角度看, Poisson 根本就是"把 eλte^{\lambda t} 的泰勒级数按项拆成概率";

三个因子分别在干嘛

光有推导还是记不住, 我们把这三块拆开看看各自的角色:

  • e−λte^{-\lambda t} — 什么都不发生的基础概率, 也就是后面要反复用的 survival probability; 这是整个式子的"单位概率", 剩下两项都是在它上面做修正
  • (λt)k(\lambda t)^k — 权重; 想让它发生 kk 次, 就要付出 kk 份 λt\lambda t 的代价
  • k!k! — 去掉排列重复; 这 kk 次事件谁先谁后我们并不关心, 所以要把 kk 个位置的全排列除掉

CDF 就是老老实实往上累:

P(X≤N)=∑k=0N(λt)kk!e−λtP(X \le N) = \sum_{k=0}^{N} \frac{(\lambda t)^k}{k!} e^{-\lambda t}

Exponential: 换个方向问同一件事

上面问的是"给定时间 tt, 发生了几次"; 现在反过来问, 服务器视角更常见的那个问题: 下一个请求多久来?

答案其实已经在手里了; “等待时间 TT 超过 tt" 这件事, 翻译过来就是"前 tt 段时间里一次都没发生”, 也就是 N(t)=0N(t) = 0, 代进 Poisson 令 k=0k = 0:

S(t)=P(T>t)=e−λtS(t) = P(T > t) = e^{-\lambda t}

这就是 survival function 的本体; 取补集拿到 CDF, 求导拿到 PDF:

P(T≤t)=1−e−λt⟹f(t)=λe−λtP(T \le t) = 1 - e^{-\lambda t} \quad \Longrightarrow \quad f(t) = \lambda e^{-\lambda t}

所以 Poisson 和 Exponential 根本就是同一个过程的两种问法, 一个数次数, 一个量间隔;

Gamma: 把 k 个间隔叠起来

Exponential 管的是"等第 1 个", 那"等到第 kk 个"要多久? 直觉上就是 kk 段独立间隔加起来:

Gamma(k,λ)=∑i=1kExp(λ)\text{Gamma}(k, \lambda) = \sum_{i=1}^{k} \text{Exp}(\lambda)

独立随机变量求和, 密度做卷积, 这是逃不掉的; 我们定义 fT2(t)f_{T_2}(t) 为"两个事件一共花了 tt"的密度, 那就要对第一个事件落在哪一刻的所有可能积一遍:

fT2(t)=∫0tfT1(x) fT1(t−x) dxf_{T_2}(t) = \int_0^t f_{T_1}(x)\, f_{T_1}(t - x)\, dx

代进去算, 会发现指数项里的 xx 直接抵消掉了, 剩下一个跟 xx 无关的常数在那躺着:

fT2(t)=∫0tλe−λx⋅λe−λ(t−x) dx=λ2e−λt∫0tdx=λ2t e−λtf_{T_2}(t) = \int_0^t \lambda e^{-\lambda x} \cdot \lambda e^{-\lambda (t-x)}\, dx = \lambda^2 e^{-\lambda t} \int_0^t dx = \lambda^2 t\, e^{-\lambda t}

再往上递推一层, 用"二阶 ∗\ast 一阶"而不是从头再卷:

fT3(t)=∫0tfT2(x) fT1(t−x) dx=∫0tλ2xe−λx⋅λe−λ(t−x) dx=λ3e−λt∫0tx dx=λ3t22e−λtf_{T_3}(t) = \int_0^t f_{T_2}(x)\, f_{T_1}(t-x)\, dx = \int_0^t \lambda^2 x e^{-\lambda x} \cdot \lambda e^{-\lambda(t-x)}\, dx = \lambda^3 e^{-\lambda t} \int_0^t x\, dx = \frac{\lambda^3 t^2}{2} e^{-\lambda t}

规律已经很明显了, 每递推一层, e−λte^{-\lambda t} 岿然不动, λ\lambda 多一次方, 积分把 tt 的幂次抬高一级同时留下一个阶乘分母:

fTk(t)=λktk−1(k−1)!e−λtf_{T_k}(t) = \frac{\lambda^k t^{k-1}}{(k-1)!} e^{-\lambda t}

Gamma 和 Poisson 是一枚硬币的两面

这两个分布互为反函数关系, 写出来非常干净:

P(Tk≤t)=P(N(t)≥k)P(T_k \le t) = P(N(t) \ge k)

左边是"第 kk 次事件在 tt 之前就发生了", 右边是"到 tt 为止至少发生了 kk 次", 这俩描述的是同一个事件, 只是一个从时间轴问, 一个从计数问;

顺便也解释了那个让人别扭的 tk−1t^{k-1}: Poisson 的 (λt)k(\lambda t)^k 里 tt 是 kk 次方, 而 Gamma 是 k−1k-1 次方; 可以理解成总时长固定的情况下自由度少了一个, 因为 Gamma 要求第 kk 个事件恰好卡在 tt 这一瞬间, 这一次的位置被钉死了, 只剩前 k−1k-1 个可以自由安排;

Weibull: 当 λ 不再是个常数

到这里为止所有推导都建立在一个很强的假设上: λ\lambda 恒定; 也就是说不管这台机器已经跑了一天还是跑了十年, 它下一秒挂掉的概率都一样; 这就是 Exponential 那个著名的无记忆性;

现实里显然不是这样; 新机器有磨合期容易早夭, 老机器有磨损期容易报废, 中间那段反而最太平; 所以我们需要让风险随时间变化, 用 λ=c tk−1\lambda = c\,t^{k-1} 这种形式来建模;

要说清楚"随时间变化的风险", 先得把 hazard rate 定义出来; 从 survival function 出发:

h(t)=−ddtln⁡S(t)h(t) = -\frac{d}{dt} \ln S(t)

拿 Exponential 试一下, S(t)=e−λtS(t) = e^{-\lambda t}, 求出来 h(t)=λh(t) = \lambda, 果然是个常数, 跟无记忆性对上了;

现在反过来玩: 我们不先定 S(t)S(t), 而是先定 h(t)h(t) 再倒推 S(t)S(t); 人为规定

h(u)=kλ(uλ)k−1h(u) = \frac{k}{\lambda} \left(\frac{u}{\lambda}\right)^{k-1}

这个形式看起来很刻意, 那是因为它确实很刻意, 前面那个 k/λk/\lambda 纯粹是为了积分出来好看凑的; kk 就是 shape parameter;

把定义式反解, 两边积分:

ln⁡S(t)=−∫0th(u) du=−∫0tkλ(uλ)k−1du\ln S(t) = -\int_0^t h(u)\, du = -\int_0^t \frac{k}{\lambda}\left(\frac{u}{\lambda}\right)^{k-1} du

令 x:=uλx := \dfrac{u}{\lambda}, 则 dx=duλdx = \dfrac{du}{\lambda}, 上限跟着换成 t/λt/\lambda, 那个碍眼的 1/λ1/\lambda 正好被吃掉:

=−∫0t/λk xk−1 dx=−xk∣0t/λ=−(tλ)k= -\int_0^{t/\lambda} k\, x^{k-1}\, dx = -x^k \Big|_0^{t/\lambda} = -\left(\frac{t}{\lambda}\right)^k

于是

S(t)=e−(tλ)kS(t) = e^{-\left(\frac{t}{\lambda}\right)^k}

这就是 Weibull 的 survival function; 所谓"凑得好看"就体现在这: 积分完连个多余的系数都不剩, 直接把 Exponential 的 λt\lambda t 换成了 (t/λ)k(t/\lambda)^k;

k 决定了这是哪种失效

kk 一个参数就把三种完全不同的物理图景装进了同一个式子里:

kk 取值 hazard rate 走势 对应场景
k=1k = 1 常数, 退化成 Exponential 纯随机失效, 无记忆
k>1k > 1 单调递增 磨损老化, 用得越久越容易挂
0<k<10 < k < 1 单调递减 早夭期, 熬过磨合就稳了

把三段拼起来就是可靠性工程里那条经典的浴缸曲线, 不过那个得靠分段或者混合模型, 单个 Weibull 一次只能演一段;

收个尾

回头看这一路, 其实全程只做了两件事:

  1. 同一个到达过程, 换个角度提问就换一个分布: 数次数得 Poisson, 量首个间隔得 Exponential, 量第 kk 个间隔得 Gamma;
  2. 松开 λ\lambda 恒定这个假设, 改成先设计 hazard rate 再倒推 survival function, 就得到 Weibull;

S(t)=e−∫0th(u)duS(t) = e^{-\int_0^t h(u)du} 这个式子是整篇的枢纽, Exponential 和 Weibull 都是往里面塞不同的 hh 塞出来的; 记住这一条比记住四个 PDF 有用得多;