Elea Notes.

词条 · 理论 · 核心

泊松分布

已知平均每小时来 6 个,它给出下一小时来 0 个、1 个、10 个的各自概率。

也称:泊松、泊松分布、Poisson、Poisson distribution、泊松密度、泊松近似

一句话

泊松分布回答这样一个问题:某件事平均每小时发生 6 次,那么下一个小时具体发生几次?它给出 0 次、1 次、一直到 15 次各自的概率,全部由那个平均值 6 一个数决定。

下面从一件很具体的麻烦讲起,一步步走到那个只有一个参数的公式为什么必须长成那样。

先看一个麻烦:平均值不是承诺

一家小书店的老板数了一整年的账,得出一个结论:平均每小时进来 6 位顾客。

他想拿这个数排班。可他立刻发现,“平均 6 位”这句话对下一个小时几乎什么都没保证。这一小时可能进来 2 位,柜台闲着;也可能一下涌进 11 位,队排到门外。他真正需要知道的不是那个 6,而是每一种情况各有多大可能:一小时空无一人的概率有多大?超过 10 位的概率有多大?

同一个麻烦在别处一模一样地出现。矿工知道全网平均 10 分钟出一个区块,那么接下来一小时会出几个块?收款方知道自己等了 6 个区块的时间,那么在这段时间里,一个藏在暗处的攻击者可能已经挖出了几个?

这类问题都长着同一副样子:一段固定的时间窗口,里面装着若干次互不相干的、随时可能发生的事件,你只知道平均装几次,想知道具体装几次的概率分布。

朴素尝试与失败

招数一:就用平均值。 说下一小时来 6 位。问题是概率论里”平均”和”通常”是两码事。后面会算出来,平均 6 位时,恰好来 6 位的概率只有 0.160623——不到六分之一。剩下六分之五的时间里,答案都不是 6。

招数二:查历史记录。 老板翻出去年 3000 小时的账本,数出”有 178 个小时来了 4 位”,用 178/3000 当概率。这办法本身没错,但它有两个硬伤:第一,你必须先攒够数据,一家新店什么都不知道;第二,稀有情况永远数不准——“一小时来 20 位”也许一年只出现过一次,你无法判断那是 1/3000 还是 1/30000。而稀有情况恰恰是排班和安全分析最关心的部分。

招数三:把一小时切成 60 分钟,每分钟”来”或”不来”。 这一招方向对了。平均一小时 6 位,那就假定每分钟以 6/60=0.16/60 = 0.1 的概率来一位,六十分钟独立重复——这是二项分布,可以算。

它错在哪?错在一分钟里可能来两位。切成 60 格,每格最多装一位,所以你算出的”一小时来 6 位”的概率是偏的。

那就切细一点。切成 3600 秒,每秒 6/36006/3600;还不够,切成毫秒。这个”再切细一点”的动作可以一直做下去,而关键的事情发生了:切得越细,答案越稳定,最后收敛到一个固定的数。λ=2\lambda = 2 来看这个收敛(λ\lambda 就是窗口内的平均次数):

把窗口切成 n 格,每格发生概率 λ/n,算"0 次""1 次""2 次"的概率

  n         P(0 次)     P(1 次)     P(2 次)
  4         0.062500    0.250000    0.375000
  20        0.121577    0.270170    0.285180
  100       0.132620    0.270652    0.273414
  10000     0.135308    0.270671    0.270698
  ──────────────────────────────────────────
  切到无穷  0.135335    0.270671    0.270671   ← 泊松分布

极限就是泊松分布。它不是另一套理论,而是”把时间切到无限细的二项分布”。也正因为经过了这个极限,格子数 nn 消失了,公式里只剩下一个参数 λ\lambda

机制:亲手算 λ = 2 的那一列

公式是

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

三个零件:λ\lambda 是窗口内的平均次数;kk 是你要问的具体次数;k!k! 是阶乘(3!=3×2×1=63! = 3\times2\times1 = 6,规定 0!=10! = 1)。e2.718282e \approx 2.718282 是自然常数,e2=0.135335e^{-2} = 0.135335

λ=2\lambda = 2 手算一遍,每一步都写出来:

k=0:  2^0 · e^-2 / 0!  =  1    × 0.135335 / 1   =  0.135335
k=1:  2^1 · e^-2 / 1!  =  2    × 0.135335 / 1   =  0.270671
k=2:  2^2 · e^-2 / 2!  =  4    × 0.135335 / 2   =  0.270671
k=3:  2^3 · e^-2 / 3!  =  8    × 0.135335 / 6   =  0.180447
k=4:  2^4 · e^-2 / 4!  =  16   × 0.135335 / 24  =  0.090224
k=5:  2^5 · e^-2 / 5!  =  32   × 0.135335 / 120 =  0.036089
k=6:  2^6 · e^-2 / 6!  =  64   × 0.135335 / 720 =  0.012030
                                        累计     =  0.995466
                                   k ≥ 7 的剩余  =  0.004534

画成柱状图(一个 # 约 0.0067):

 k=0 │####################                      0.135335
 k=1 │#########################################  0.270671
 k=2 │#########################################  0.270671
 k=3 │###########################                0.180447
 k=4 │##############                             0.090224
 k=5 │#####                                      0.036089
 k=6 │##                                         0.012030
     └──────────────────────────────────────────

形状里有三件事值得停一下。

一,最高点不止一个。 k=1k=1k=2k=2 概率完全相同,都是 0.270671。不是巧合:从 P(1)P(1)P(2)P(2) 要乘 λ/2=1\lambda/2 = 1,正好不变。一般地 P(k)=P(k1)λ/kP(k) = P(k-1)\cdot\lambda/k,这个递推比原公式好算——从 P(2)=0.270671P(2) = 0.270671 出发,乘 2/32/3 就得到 P(3)=0.180447P(3) = 0.180447

二,不对称。 左边被 0 挡住(次数不能是负的),右边可以一直伸出去。所以尾巴在右侧拖得很长。

三,右尾衰减极快。 分母的 k!k! 涨得比分子的 λk\lambda^k 猛得多,kk 一大就把整项压平。P(6)P(6) 只有 P(2)P(2) 的二十二分之一。

回到书店。λ=6\lambda = 6,同一个公式:

 k=0  0.002479 │
 k=1  0.014873 │###
 k=2  0.044618 │#########
 k=3  0.089235 │##################
 k=4  0.133853 │###########################
 k=5  0.160623 │################################
 k=6  0.160623 │################################
 k=7  0.137677 │############################
 k=8  0.103258 │#####################
 k=9  0.068838 │##############
 k=10 0.041303 │########
 k=11 0.022529 │#####
 k=12 0.011264 │##
 k=13 0.005199 │#
 k=14 0.002228 │

老板要的答案都在这张表里:恰好 6 位的概率 0.160623;3 位或更少 0.151204;10 位或更多 0.083924;落在 4 到 8 位之间 0.696034。他现在知道,按”6 位”排班,大约每七个小时就有一个小时人手明显不够。

这张表也解释了为什么 λ=6\lambda = 6k=5k=5k=6k=6 又打平:P(6)=P(5)6/6P(6) = P(5) \cdot 6/6λ\lambda 是整数时,k=λk = \lambdak=λ1k = \lambda - 1 概率总是相等的。

回访:这就是切细了的抛硬币

第三招被否掉的时候,其实已经把泊松分布造出来了。它就是二项分布——独立重复地”发生/不发生”——把格子切到无限细的样子。所以它和随机游走同源:随机游走每一步问”往前还是往后”,也是一串独立的二元选择。区别只在关心什么:随机游走关心累计位置,泊松分布关心固定窗口内发生的次数。

这个亲缘关系还解释了工作量证明为什么天然是泊松的。矿工每一次哈希尝试,都是一次成功概率极小的独立试验;一秒钟里有天文数字般多次尝试。这正是”格子极多、每格概率极低”的标准情形,于是”十分钟内出几个块”就服从 λ=1\lambda = 1 的泊松分布。难度调整所维护的东西,本质上就是让这个 λ\lambda 保持在 1。

λ=2\lambda = 2 这个例子不是随手挑的。比特币白皮书第 11 节要算:收款方等了 zz 个确认,藏在暗处的攻击者在这段时间里可能已经挖出了几个块。中本聪的处理是——攻击者的进度服从泊松分布,期望值

λ=zqp\lambda = z \frac{q}{p}

其中 qq 是攻击者算力占比,p=1qp = 1 - q 是诚实方的。直觉是:诚实方花了出 zz 个块的时间,攻击者以 q/pq/p 的相对速率在挖,所以期望挖出 zq/pz \cdot q/p 个。

代入一个具体攻击者:q=0.25q = 0.25(掌握四分之一算力),z=6z = 6(等六个确认)。那么 q/p=0.25/0.75=1/3q/p = 0.25/0.75 = 1/3,于是

λ=6×13=2\lambda = 6 \times \frac{1}{3} = 2

上面手算的那一列,正是这个攻击者的进度分布。它说:他一个块都没挖到的概率 0.135335,挖到 1 个 0.270671,挖到 2 个 0.270671,挖到 6 个及以上(也就是已经追上)约 0.017。把每一种进度的概率乘上”从落后 zkz-k 处还能追平”的概率再加起来,就得到白皮书那个总概率 0.0499426——这一步用到的追平概率来自赌徒破产问题。

值得记住的是这个对比:只看赌徒破产、忽略攻击者的隐藏进度,会算出 (1/3)6=0.0013717(1/3)^6 = 0.0013717,也就是 1/729。而把泊松分布考虑进去后是 0.0499426,大了 36 倍。泊松分布在这里不是装饰,它是”收款方不知道对手已经跑了多远”这个不确定性的价钱。

边界与常见误解

它不是万能的计数分布。 泊松分布有两个前提:事件互相独立,平均速率恒定。都不难违反。顾客成群结队进店(一家四口同时进门)就不独立;午餐时段的速率和凌晨不一样,就不恒定。把泊松分布套到一个明显扎堆的过程上,会系统性地低估极端情况。

方差不是可以随便设的。 泊松分布的方差恰好等于 λ\lambda,标准差是 λ\sqrt{\lambda}λ=6\lambda = 6 时标准差 6=2.449490\sqrt{6} = 2.449490。这是公式的推论,不是可调的旋钮。真实数据的方差常常大于均值(叫过度分散),那是在提醒你事件其实不独立。

λ\lambda 不必是整数,kk 必须是。 λ=zq/p\lambda = z\,q/p 在白皮书里通常算出小数,完全正常——平均值可以是 2.5 个块。但 kk 是发生次数,只能取 0, 1, 2, …。所以严格说泊松分布没有”密度”,只有各点的概率,白皮书里的”Poisson density”是个不太严谨的叫法。

P(0)=eλP(0) = e^{-\lambda},不是 0。 常有人以为”平均 6 次”意味着一小时肯定至少来一个人。λ=6\lambda = 6 时空一小时的概率是 e6=0.002479e^{-6} = 0.002479,不大,但每 400 小时就该出现一次。同理,攻击者在 λ=2\lambda = 2 时一块未得的概率是 e2=0.135335e^{-2} = 0.135335,这是分布里最需要单独盯住的一项,因为它对应着攻击者最不利的开局。