从负指数分布/泊松分布到排队论(经理能扣篮,但不经常也不绝对)

从经理穿着皮鞋能不能扣篮,引起了一段思考。

周六上午在家带娃,我已经快崩溃,所以作文时间放在了午后。

假如你相信上帝真的是在掷骰子,那么我们的世界就是上帝的一系列实验生成的。
假如你相信世界是二元元素的组合,那么使用二进制便可以完整描述整个世界。

一切从二项分布开始裂变。


二项分布

让我们看一道非常简单的概率统计习题:
如果做一次实验,一个独立的事件 E E E发生的概率是 p p p,那么请问,连续做 n n n次实验,让事件 E E E发生 k k k次的概率是多少?

非常简单的习题,只要知道独立事件同时发生的概率相乘性质即可解题。

  1. 单次事件发生的概率就是 p p p,单次事件不发生的概率是 1 − p 1-p 1p
  2. 事件发生 k k k次的概率就是 p k p^k pk
  3. 实验进行了 n n n次, k k k次发生了事件,意味着 n − k n-k nk次没有发生事件
  4. n − k n-k nk次没有发生事件的概率是 ( 1 − p ) n − k (1-p)^{n-k} (1p)nk
  5. 事件的发生与实验顺序无关,故发生 k k k次的可能性有 C n k C_n^k Cnk

综上1~4,连续做 n n n次实验,事件 E E E发生 k k k次的概率为:

P ( X = k ) = C n k × p k × ( 1 − p ) n − k P(X=k)=C_n^k\times p^k\times (1-p)^{n-k} P(X=k)=Cnk×pk×(1p)nk

是的,这就是 二项分布

根据以上的二项分布,我们可以计算出在 P ( X = k ) P(X=k) P(X=k)的概率下,重复实验 k k k次,事件发生的 平均次数 为:

λ = n × p \lambda=n\times p λ=n×p


现在让我们来看所谓的 事件 以及 平均次数 的具体意义和性质。

对于在推导二项分布时的我们理解的事件,都是 单次等概率的事件。 即做一次实验,事件发生的概率是相同的,也就是定值 p p p,比如抛硬币。利用这类事件,我们已经非常容易地推导出二项分布的式子。

但是还有一种事件,固定的时间内它们发生的 次数 与单次实验事件发生的概率是无关的,而是与连续的时间段或者连续的空间大小有关,即 单位时间/空间内时间发生的次数平均值为定值。 典型的例子就是生产线产品的良品率,无论你用多少条相同的生产线做实验,良品率总是相等的。本文接下来要讨论的所有事件,均是此类事件。

此类事件具有 累加性质 。即 事件在一个连续的时间段或者空间中持续以某种概率发生。

这种事件很难对应到 二项分布 的所谓独立实验重复多次的场景,我们不妨先借用一下 λ = n × p \lambda=n\times p λ=n×p这个式子,从事情的本初开始。


负指数分布

再看一遍 一段时间内事件发生平均次数 的式子:

λ = n × p \lambda=n\times p λ=n×p

如果 λ \lambda λ为定值,即在确定的区间内,无论做多少次实验,都不会改变实验成功的次数,我们换一种写法:

p = λ × 1 n p=\lambda\times \dfrac{1}{n} p=λ×n1

事件发生的概率与 1 n \dfrac{1}{n} n1成正比! 至于 1 n \dfrac{1}{n} n1如何被解释,我们接着往下看。

如果我们把所谓的 单位时间 规约为1,那么 1 n \dfrac{1}{n} n1就是一个小的时间片,整个单位时间被分成了等大小的 n n n份, n n n越大,时间片就越小,我们在单位1的约束下,不妨将 1 n \dfrac{1}{n} n1看作是 Δ t \Delta t Δt,那么 p p p就是 Δ t \Delta t Δt内事件发生 k k k次的概率:

P k ( Δ t ) = λ Δ t P_k(\Delta t)=\lambda \Delta t Pk(Δt)=λΔt

事件发生的概率与时间片的长短成正比!

但是发生几次呢?至少发生1次!也可能发生2次,3次,5次,100次。可是,如果发生次数大于1次,在后面的推导中,便无法拟合二项分布的含义,如何将发生的次数限制在至多1次呢?

答案是 Δ t \Delta t Δt想象成非常小,即发生1次事件的概率都超级小,更何况多次。

所以,在 Δ t \Delta t Δt非常小的保证下,我们认为 P k P_k Pk可以表达成下面的式子:

P k ( Δ t ) = P 1 ( Δ t ) + o ( Δ t ) = λ Δ t P_k(\Delta t)=P_1(\Delta t)+o(\Delta t)=\lambda \Delta t Pk(Δt)=P1(Δt)+o(Δt)=λΔt

我们将发生事件大于1次的概率看作是一个关于 Δ t \Delta t Δt高阶无穷小。反正后面我们采用微积分推导时必然保证 Δ t \Delta t Δt趋向于 0 0 0,因此高阶无穷小是可以忽略的。

我们忽略高阶无穷小后,有:

P 1 ( Δ t ) = λ Δ t P_1(\Delta t)=\lambda \Delta t P1(Δt)=λΔt

接下来,按照概率的定义,在 Δ t \Delta t Δt内事件不发生的概率就是:

P 0 ( Δ t ) = 1 − λ Δ t P_0(\Delta t)=1-\lambda \Delta t P0(Δt)=1λΔt

我们将其形式化:

P 0 ( t ) = 1 − λ t P_0(t)=1-\lambda t P0(t)=1λt 【式子1】

注意,虽然我们为了形式化将 Δ t \Delta t Δt换成了 t t t,但是这只是为了数学上推导方便,我们必须记住,自变量 t t t是时间片的长短,而不是一个绝对时间!那么按照 P 0 ( t ) P_0(t) P0(t)的解释, P 0 ( t + Δ t ) P_0(t+\Delta t) P0(t+Δt)的意思就是 时间片长度为 t + Δ t t+\Delta t t+Δt时事件不发生的概率!

请注意,长度为 t + Δ t t+\Delta t t+Δt的时间片可以分割为连续的两个小时间片 t t t Δ t \Delta t Δt时间片 t + Δ t t+\Delta t t+Δt中不发生事件的概率要求时间片 t t t和时间片 Δ t \Delta t Δt中均不发生事件! 按照概率相乘的原理:

P 0 ( t + Δ t ) = P 0 ( t ) P 0 ( Δ t ) P_0(t+\Delta t)=P_0(t)P_0(\Delta t) P0(t+Δt)=P0(t)P0(Δt) 【式子2】

代入式子1,我们整理式子2:

P 0 ( t + Δ t ) = P 0 ( t ) ( 1 − λ Δ t ) = P 0 ( t ) − λ Δ t P 0 ( t ) P_0(t+\Delta t)=P_0(t)(1-\lambda \Delta t)=P_0(t)-\lambda \Delta tP_0(t) P0(t+Δt)=P0(t)(1λΔt)=P0(t)λΔtP0(t)

稍微变换一下:

P 0 ( t + Δ t ) − P 0 ( t ) Δ t = − λ P 0 ( t ) \dfrac{P_0(t+\Delta t)-P_0(t)}{\Delta t}=-\lambda P_0(t) ΔtP0(t+Δt)P0(t)=λP0(t) 【式子3】

式子3是什么?取极限不就是个求导吗:

lim ⁡ Δ t → 0 P 0 ( t + Δ t ) − P 0 ( t ) Δ t = P 0 ′ ( t ) = − λ P 0 ( t ) \lim_{\Delta t \to 0}\dfrac{P_0(t+\Delta t)-P_0(t)}{\Delta t}=P_0\prime(t)=-\lambda P_0(t) limΔt0ΔtP0(t+Δt)P0(t)=P0(t)=λP0(t)

写成微分方式:

d ( P 0 ( t ) ) P 0 ( t ) d t = − λ \dfrac{d(P_0(t))}{P_0(t)dt}=-\lambda P0(t)dtd(P0(t))=λ

两边同时积分,按照第一类换元积分:

∫ d ( P 0 ( t ) ) P 0 ( t ) d t d t = ∫ 1 P 0 ( t ) d ( P 0 ( t ) ) = l o g e P 0 ( t ) = − λ t + C \displaystyle\int\dfrac{d(P_0(t))}{P_0(t)dt}dt=\displaystyle\int\dfrac{1}{P_0(t)}d(P_0(t))=log_eP_0(t)=-\lambda t+C P0(t)dtd(P0(t))dt=P0(t)1d(P0(t))=logeP0(t)=λt+C

e e e的指数得到:

P 0 ( t ) = e C × e − λ t P_0(t)=e^C\times e^{-\lambda t} P0(t)=eC×eλt

t t t是一个时间片, t = 0 t=0 t=0就是无,当然不会有任何事件发生,即 P 0 ( 0 ) = 1 P_0(0)=1 P0(0)=1,即:

P 0 ( t ) = e − λ t P_0(t)=e^{-\lambda t} P0(t)=eλt

在时间片长度为 t t t的时间内不发生事件的概率是 e − λ t e^{-\lambda t} eλt,那么至少发生1个事件的概率就是:

P 1 ( t ) = 1 − e − λ t P_1(t)=1-e^{-\lambda t} P1(t)=1eλt

这就是概率积累函数,这不就是 负指数分布 吗?即 单位时间内时间发生平均次数为固定值 λ \lambda λ的事件的时间间隔的概率为负指数分布!


泊松分布

再看一遍 一段时间内事件发生平均次数 的式子:

λ = n × p \lambda=n\times p λ=n×p

这里,我们依然假定 λ \lambda λ为定值。这个是本文通篇的假定。

在推导负指数分布的时候,我们已经将单位时间分割成了要多小有多小的 Δ t \Delta t Δt,并且我们还知道,这些小的时间片 Δ t \Delta t Δt内发生1次以上事件的概率为 Δ t \Delta t Δt的高阶无穷小,在参与取极限,微积分等数学运算的时候是被忽略的,于是我们得到了非常清爽的式子:

P 1 ( Δ t ) = λ Δ t P_1(\Delta t)=\lambda \Delta t P1(Δt)=λΔt

我们将其形式化:

P 1 ( t ) = λ t P_1(t)=\lambda t P1(t)=λt

注意,自变量 t t t是一个时间段,而不是绝对时间,这里再次强调。

好了,开始我们的推导。

现在我把这个已经非常小的时间片 t t t(也就是 Δ t \Delta t Δt,只是写成 t t t好看一些)画出来:

从负指数分布/泊松分布到排队论(经理能扣篮,但不经常也不绝对)_第1张图片

我们终于可以套用 二项分布中的实验模型 了。

  • t t t时间片内,发生了一次事件。

我们知道 t t t已经非常小,小到可观测范围只能发生1次事件,发生1次以上事件的概率微乎其微(高阶无穷小 o ( t ) o(t) o(t)),然而,由于时间片是连续的,即便再小它依旧是 继续可分的 ,像分形一样,我们把 t t t放大,将其再等分成 m m m份:

从负指数分布/泊松分布到排队论(经理能扣篮,但不经常也不绝对)_第2张图片

之所以将 t t t再继续等分 m m m份是因为,我们知道 t t t时间片内事件发生的概率是 λ t \lambda t λt,那么在 t t t时间片内,如果事件发生了,那么事件具体在哪一个更精细的时间片内发生,又是一个概率问题:

  1. 是在第1个 t m \dfrac{t}{m} mt时间片里发生吗?
  2. 是在第2个 t m \dfrac{t}{m} mt时间片里发生吗?
  3. 是在第3个 t m \dfrac{t}{m} mt时间片里发生吗?
  4. …是在第 m m m t m \dfrac{t}{m} mt时间片里发生吗?

到底再哪个小时间片里发生呢?很简单,都有可能发生。都是等概率的,每个小时间片发生事件的概率均为 1 m \dfrac{1}{m} m1,按照概率相乘的规则:

  • 事件在 t t t事件片发生的概率为 λ t \lambda t λt
  • 事件如果真的在 t t t时间片发生,那么它在某一个 t m \dfrac{t}{m} mt小时间片发生的概率就是 λ t × 1 m \lambda t\times \dfrac{1}{m} λt×m1

是的,概率就是

P = λ t × 1 m P=\lambda t\times \dfrac{1}{m} P=λt×m1

哈哈,为了得到概率分布,我们可以做实验了:

  • 连续做 k k k次实验, k < m k<m k<m,每次实验事件发生的概率是 λ t × 1 m \lambda t\times \dfrac{1}{m} λt×m1

这就是一个典型的二项分布:

P ( X = k ) = C m k × ( λ t m ) k × ( 1 − λ t m ) m − k P(X=k)=C_m^k\times (\dfrac{\lambda t}{m})^k\times (1-\dfrac{\lambda t}{m})^{m-k} P(X=k)=Cmk×(mλt)k×(1mλt)mk

现在事情可以开始了。

由于时间是连续流逝的(空间也一样),那么时间片就是无限可分割的,我们求一个连续变量下事件发生的概率,需要就是将时间片(或者空间) 无限分割

以上这个式子里,其实 t t t已经是无限分割的结果了,但是我们不要在乎 t t t,只需知道在 t t t时间片里至多发生1次事件就好了,重要的是, 我们将 t t t分割 m m m份,让 m m m趋向于无穷大会怎样?

求极限:

lim ⁡ m → ∞ C m k × ( λ t m ) k × ( 1 − λ t m ) m − k \lim_{m \to \infty}C_m^k\times (\dfrac{\lambda t}{m})^k\times (1-\dfrac{\lambda t}{m})^{m-k} limmCmk×(mλt)k×(1mλt)mk

直接求解即可,其中只需要应用一个重要极限公式,一切迎刃而解:

lim ⁡ m → ∞ ( 1 − λ t m ) m = lim ⁡ m → ∞ ( 1 − 1 m λ t ) m λ t λ t = e λ t \lim_{m \to \infty}(1-\dfrac{\lambda t}{m})^m=\lim_{m \to \infty}(1-\dfrac{1}{\frac{m}{\lambda t}})^{\frac{m}{\lambda t}\lambda t}=e^{\lambda t} limm(1mλt)m=limm(1λtm1)λtmλt=eλt

直接写答案吧:

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

这是什么?这就是 泊松分布。

单位时间内时间发生平均次数为固定值 λ \lambda λ的事件在单位时间内发生的次数符合泊松分布!


所以说,负指数分布和泊松分布是一回事。它们两个均可以从 单位时间内时间发生平均次数为固定值 λ \lambda λ 这个大前提推导出来。


生灭过程和排队

有来必有往,有去必有回。

我们为所谓的事件赋予其意义。

把单位时间发生的事件的看作 请求的到达 ,那么, 请求被处理 自然也可以被看作是同类的事件。

请求不断地到达,又不断地被处理,这是一个马尔可夫过程,最终这个过程就形成了一个马尔可夫链,每一个状态,我们可以看作是 未被处理请求为 i i i的概率

从负指数分布/泊松分布到排队论(经理能扣篮,但不经常也不绝对)_第3张图片

由于请求的到来和被处理均是统计分布,那么统计意义的突发必然会造成排队,即上述的马尔可夫过程必然向后延展,然而如果系统是稳定的,积压的请求将会在突发空闲期被持续处理,从而使得马尔可夫过程向前收缩,最终对于每一个状态而言,都将达成一个平衡:

P i − 1 λ + P i + 1 μ = P i λ + P i μ P_{i-1}\lambda+P_{i+1}\mu=P_i\lambda+P_i\mu Pi1λ+Pi+1μ=Piλ+Piμ

此外,系统中所有的状态的概率之和恒等于 1 1 1

Σ i = 0 n P i = 1 \displaystyle \Sigma_{i=0}^{n}P_i=1 Σi=0nPi=1

此外,对于状态 0 0 0,它没有前置状态,所以必然有:

P 0 λ = P 1 μ P_0\lambda = P_1\mu P0λ=P1μ

我们用此而递推:

P 0 λ + P 2 μ = P 1 ( λ + μ ) P_{0}\lambda+P_{2}\mu=P_1(\lambda+\mu) P0λ+P2μ=P1(λ+μ)
P 1 λ + P 3 μ = P 2 ( λ + μ ) P_{1}\lambda+P_{3}\mu=P_2(\lambda+\mu) P1λ+P3μ=P2(λ+μ)
P 2 λ + P 4 μ = P 3 ( λ + μ ) P_{2}\lambda+P_{4}\mu=P_3(\lambda+\mu) P2λ+P4μ=P3(λ+μ)
. . . ... ...
P i λ + P i + 2 μ = P i + 1 ( λ + μ ) P_{i}\lambda+P_{i+2}\mu=P_{i+1}(\lambda+\mu) Piλ+Pi+2μ=Pi+1(λ+μ)

上面所有式子整理,得到:

P i = ( λ μ ) i P 0 P_i=(\dfrac{\lambda}{\mu})^iP_0 Pi=(μλ)iP0

进一步:

Σ i = 0 n P i = P 0 Σ i = 0 n ( λ μ ) i = 1 \displaystyle \Sigma_{i=0}^{n}P_i=P_0\Sigma_{i=0}^{n}(\dfrac{\lambda}{\mu})^i=1 Σi=0nPi=P0Σi=0n(μλ)i=1

数列求和而已:

P 0 μ μ − λ = 1 P_0\dfrac{\mu}{\mu-\lambda}=1 P0μλμ=1

嗯,这样就求出了 P 0 P_0 P0

P 0 = 1 − λ μ P_0=1-\dfrac{\lambda}{\mu} P0=1μλ

那么 P i P_i Pi自然也求出来了:

P i = ( 1 − λ μ ) ( λ μ ) i P_i=(1-\dfrac{\lambda}{\mu})(\dfrac{\lambda}{\mu})^i Pi=(1μλ)(μλ)i

接下来,排队论基础中的典型结论基本就都能出来了:

  • 平均排队实体数量
    N a v g = Σ n n P n = λ μ − λ N_{avg}=\Sigma_{n}nP_n=\dfrac{\lambda}{\mu-\lambda} Navg=ΣnnPn=μλλ
  • 平均等待时延
    T a v g = N λ = 1 μ − λ T_{avg}=\dfrac{N}{\lambda}=\dfrac{1}{\mu-\lambda} Tavg=λN=μλ1.

现在公式都可以非常简单明确地根据泊松分布,负指数分布推导出来了,但是问题是, 你真的相信世界上的一些事情符合泊松分布吗?或者说,即便你相信它们符合,它们真的符合泊松分布吗?

如果是,那么上面的公式就可以描述一切,如果不是,怎么办?


泊松分布/排队论的适用性

基于泊松分布/负指数分布的排队论不适用任何现实场景!!

因为现实中根本就没有什么事件规律符合泊松分布。

我们以为路面某个监测点的车辆的到达符合泊松分布,但是非也!几乎可以肯定,人是喜欢跟风的,这意味着车辆到达某个点并非独立事件,这也是交通拥堵的根本原因。

我们以为互联网交换节点数据包的到达符合泊松分布,但是非也!数据包确实具有突发性达到的特征,但是前后两个数据包之间关联着巨大的粘性,它们并非独立到达的。这也是我在2014年设计状态防火墙cache的依据,利用局部性嘛。

之所以泊松分布的结论被如此普遍地被利用,完全在于 其在数学上非常容易处理,容易预测后事。 然后我们利用现实的参数,给予矫正,即可得到相当不错的结论。

其实仔细想想,世界本应该就是泊松分布主宰的,所谓的跟风和粘性,那可能是人性使然。路面上车里的司机,你不认识我,我也不认识你,大家却往同一条路上走,如果不是 我相信别人有更好的选择 ,那么就是别无选择了…对了,上下班高峰,节假日,天气,也会让泊松分布失效。但这些说来说去还是因为人为原因导致,比如人都是白天才出门,晚上则闭户。所以说,你要把事件尺度拉大,在以年为单位时间的范围,或者更长的单位1,泊松分布将会越离越拟合现实。


单队列和多队列的问题

存在多个服务台的情况下,到底是单队列效率高还是多队列效率高?

这个我们来算一下。

M/M/1情况下,单队列,排队实体的平均等待延时为:

T s i n g l e = 1 1 × μ − λ T_{single}=\dfrac{1}{1\times\mu-\lambda} Tsingle=1×μλ1.

如果队列被分成了 N N N个,那么单位 1 1 1作用于每一个队列则为 1 N \dfrac{1}{N} N1,而平均到达率对于每一个队列,均将是 λ N \dfrac{\lambda}{N} Nλ,平均等待时间,代入上式:

T m u l t i = 1 ( 1 N ) × μ − λ N = N × T s i n g l e T_{multi}=\dfrac{1}{(\dfrac{1}{N})\times \mu-\dfrac{\lambda}{N}}=N\times T_{single} Tmulti=(N1)×μNλ1=N×Tsingle

很遗憾,有点有悖于常识,如果采用多队列,平均等待时间将会延长!这就是为什么对于以太网这种统计复用的突发流量网络而言,并没有采用任何XDM(X可为时间,频率…)的策略,而只是采用了时间域上单队列退避的CSMA/CD策略的原因!

然而,比如以Linux内核而论,进程调度, 却是多队列的,每CPU核心一个队列,这是Why?这是因为,相比于进程的到达和被调度,锁以及cache miss的开销更大,这纯粹是一个实现上的工程优化,不伤排队论的大雅,和算法无关。

经理能不能扣篮

经理穿着皮鞋能扣篮吗?我觉得能。

经理能扣篮,但不经常,也不绝对。

这就跟总有那么一个非零的概率,一个立方的空气分子全部朝着一个方向运动是一样的道理。

经理能扣篮,这只是一个概率性的结论,经理能扣篮并不意味着经理扣篮就一定能成功。


浙江温州皮鞋湿,下雨进水不会胖。

你可能感兴趣的:(从负指数分布/泊松分布到排队论(经理能扣篮,但不经常也不绝对))