文章目录
- 泊松分布
- 和二项分布的关系
- 和正态分布的关系
泊松分布
如果在有限时间 ( 0 , 1 ) (0,1) (0,1)内进行 n n n次伯努利实验,那么每次伯努利实验所占用的时间为 1 n \frac{1}{n} n1,按照自然规律,一件事情肯定是时间越长越容易发生,假定事件发生的概率与 1 n \frac{1}{n} n1成正比,记作 λ n \frac\lambda n nλ,则二项分布变为
P { X = k } = ( n k ) ( λ n ) k ( 1 − λ n ) n − k P\{X=k\}=\binom{n}{k}(\frac{\lambda}{n})^k(1-\frac{\lambda}{n})^{n-k} P{X=k}=(kn)(nλ)k(1−nλ)n−k
如果这个时间差 1 n \frac1n n1非常小,以至于事件变得近似连续,则有
lim n → ∞ P { X = k } = lim n → ∞ ( n k ) ( λ n ) k ( 1 − λ n ) n − k \lim_{n\to\infty} P\{X=k\}=\lim_{n\to\infty}\binom{n}{k}(\frac{\lambda}{n})^k(1-\frac{\lambda}{n})^{n-k} n→∞limP{X=k}=n→∞lim(kn)(nλ)k(1−nλ)n−k
其中
lim n → ∞ ( n k ) ( λ n ) k = λ k k ! \lim_{n\to\infty}\binom{n}{k}(\frac{\lambda}{n})^k=\frac{\lambda^k}{k!} n→∞lim(kn)(nλ)k=k!λk
而后面有一项更是传说中的重要极限
lim n → ∞ ( 1 − λ n ) n = e − λ \lim_{n\to\infty}(1-\frac{\lambda}{n})^n=e^{-\lambda} n→∞lim(1−nλ)n=e−λ
综上就得到了一个新的分布
P ( x = k ) = e − λ λ k k ! P(x=k)=\frac{e^{-\lambda}\lambda^k}{k!} P(x=k)=k!e−λλk
此即泊松分布,表示某个随机事件在连续时间内发生的概率,其中 λ n \frac\lambda n nλ表示单位时间内某件事发生的概率。
和二项分布的关系
下面通过scipy
中的stats
模块,模拟二项分布和泊松分布之间的关联。
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as ss
p,q = 0.2, 0.8
ns = [10, 500, 25000, 1250000]
fig = plt.figure()
for i,n in enumerate(ns):
lam = n * p
rs = ss.binom(n, p).rvs(50000)
rv = ss.poisson(n*p)
st, ed = rv.interval(0.999)
xs = np.linspace(st, ed, 100)
ax = fig.add_subplot(2,2,i+1)
ax.hist(rs, density=True, bins='auto', alpha=0.2)
ax.plot(xs, rv.pmf(xs))
plt.title(f"n={n}")
plt.show()
效果如下
和正态分布的关系
泊松分布是二项分布在有限时间内的极限情况,而根据中心极限定理,随着伯努利试验次数的增加,二项分布将逼近于 σ 2 = n p q , μ = n p \sigma^2=npq, \mu=np σ2=npq,μ=np的高斯分布。
在通过二项分布推导泊松分布的过程中,比较关键的一步是 λ n \frac{\lambda}{n} nλ作为概率的一个假定,当 n → ∞ n\to\infty n→∞时,可以发现 λ n \frac{\lambda}{n} nλ将趋近于0,如果继续沿用二项分布的模型,那么 q 1 ˉ − λ n − > 0 q\=1-\frac{\lambda}{n}->0 q1ˉ−nλ−>0,从而 n p q ≈ n p npq\approx np npq≈np。
由此可以得到,当事件趋近于无穷多时,泊松分布将趋近于 μ = λ , σ 2 = λ \mu=\lambda, \sigma^2=\lambda μ=λ,σ2=λ的正态分布。
下面对这个关系进行测试
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as ss
p = 0.1
#lam = 100
ns = [10, 500, 25000, 1250000]
fig = plt.figure()
for i,n in enumerate(ns):
lam = 0.1 * n
rs = ss.poisson(lam).rvs(n)
rv = ss.norm(lam, np.sqrt(lam))
st, ed = rv.interval(0.999)
xs = np.linspace(st, ed, 100)
ax = fig.add_subplot(2,2,i+1)
ax.hist(rs, density=True, bins='auto', alpha=0.2)
ax.plot(xs, rv.pdf(xs))
plt.title(f"n={n}")
plt.show()
效果如下