很多場合下,我們感興趣的試驗進行了很多次,但其中成功的卻發生的相當稀少。例如一個芯片的生廠商想要把生產出的芯片做一番檢測后再出售。每個芯片都有一個不能正常工作的微小概率p,在數量為n的一大批芯片中,出現r個故障芯片的概率是多少?
相關閱讀
二項式的泊松近似
問題似乎很簡單,芯片故障的概率符合二項分布X~B(n,p),我們可以用二項分布計算出現r個故障芯片的概率:
實際問題是,芯片的數量很大,但故障率又是一個很小的數值,雖然二項分布提供了一個精確的概率模型,但計算起來並不容易,而且在計算時還會丟掉大量的精度。既然這樣,還不如一開始就使用一個近似式計算預期的概率。
我們首先看看全部芯片都合格(每次試驗都不成功)的概率:
等號兩邊同時取對數:
接下來需要利用一點無窮級數和積分的知識:
同時我們也知道∫dx/1-x的精確表達:
由此可以得到:
當p遠遠小於1,且np2遠遠小於1時,可以忽略p的高階項,得到近似式:
n個芯片全部合格的概率約等於e-np,出現r個故障芯片的概率又是多少呢?直接計算並不容易,幸運的是,我們可以用二項分布精確表達r個和r-1個故障芯片的概率的比值:
當n很大時,對於少量r個故障芯片來說,n-(r-1) ≈ n;對於很小概率p來說,p/(1-p) ≈ p,因此上式可以得到近似地表達為:
類似地,可以計算出B(r-1;n,p)/B(r-2;n,p)……直到B(1;n,p)/B(0;n,p):
這就是二項分布的泊松近似,對於給定的n和r來說,泊松分布計算起來比二項分布簡單多了。泊松近似經常用P(r; λ)表示。當n很大,λ2/n(即np2)遠遠小於1時,泊松近似非常理想。
泊松分布
我們知道ex的泰勒展開式:
現在把r = 0,1,2,…的所有P(r; λ)相加:
由此看出二項分布的泊松近似有一個很好的性質:r = 0,1,2,…的所有P(r; λ)之和等於1。因此可以把P(X=r; λ)用於離散型隨機變量的質量函數,其中隨機變量取正整數,對於每一個正實數λ,都可以指定一個泊松分布:
泊松分布記作X~Po(λ)。
二項分布產生於對同一個伯努利試驗的多次重復,而泊松分布用於描述時間發生在隨機的區間點(時間或空間,比如一星期或一公里)上的情形。例如某一服務設施在一定時間內到達的人數,電話交換機接到呼叫的次數,汽車站台的候客人數,機器出現的故障數,自然災害發生的次數,一塊產品上的缺陷數,顯微鏡下單位分區內的細菌分布數等等。假設這種事件發生在一個區間點上的可能性與發生在其他任何時間點上的可能性完全一致,而且這些事件的發生時相互獨立的,那么在任何給定的單位區間內發生r個事件的概率可以由泊松分布P(X=r; λ)給出,其中隨機變量X表示在給定的單位區間內發生的事件的個數,λ是事件的平均發生率(單位區間內事件發生的平均發生次數)。
泊松分布的形狀取決於λ的大小,λ較小,則分布向右偏斜,隨着λ的增大,分布逐漸變得對稱:
泊松分布成立的條件是λ2/n(即np2)遠遠小於1。我們用2個示例看看泊松分布是如何應用於實際的。
噪聲數據的分布
圖像的在傳播過程中可能會受到某些干擾,從而使某個像素點變成了噪聲。假設一個給定像素出錯的概率是1/10-5,且每個像素出錯相互獨立的。對於一幅1000×1000的圖像來說,噪聲的分布是什么?
對於傳播后的圖像來說,每個像素不是正確就是錯誤,我們可以使用二項分布得到精確概率模型,但是相關的參數要么極大,要么極小,因此使用泊松近似看起來是個不錯的主意。1000×1000的圖像有n=106個像素,錯誤率是p=10-5,n和p是個懸殊的比率,λ2/n=10-4遠遠小於1,泊松近似將非常理想。
下面的代碼對比了泊松分布和二項分布:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 from scipy import stats 4 5 n = 10 ** 6 # 單位區間上的點 6 p = 10 ** -5 # 事件在單位區間上發生的概率 7 lam = n * p # λ = np 8 print('X ~ Po(X=r;λ)'.format(lam)) 9 10 rs = np.array(range(1, 26, 1)) # 隨機變量的取值 11 # 泊松分布 X ~ Po(X=r;λ) 12 ps = stats.poisson.pmf(rs, lam) # 每個隨機變量對應的概率 13 # 二項分布 X ~ B(X=r;n,p) 14 bs = stats.binom.pmf(rs, n, p) # 每個隨機變量對應的概率 15 16 fig = plt.figure(figsize=(10, 4)) 17 plt.subplots_adjust(hspace=0.5) # 調整子圖之間的上下邊距 18 19 ax1 = fig.add_subplot(2, 2, 1) 20 ax1.set_xlabel('r') 21 ax1.set_ylabel('P(X=r;λ)'.format(lam)) 22 ax1.set_title('泊松分布') 23 ax1.bar(left=rs, height=ps, width=0.5) 24 25 ax2 = fig.add_subplot(2, 2, 2) 26 ax2.set_xlabel('r') 27 ax2.set_ylabel('P(X=r;{0},{1})'.format(n, p)) 28 ax2.set_title('二項分布') 29 ax2.bar(left=rs, height=bs, width=0.5) 30 31 ax3 = fig.add_subplot(2, 2, 3) 32 ax3.set_xlabel('r') 33 ax3.set_ylabel('泊松分布-二項分布'.format(n, p)) 34 ax3.set_title('誤差') 35 ax3.bar(left=rs, height=(bs - ps), width=0.5) 36 37 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 38 plt.rcParams['axes.unicode_minus'] = False # 解決中文下的坐標軸負號顯示問題 39 plt.show() 40 41 print('最大誤差', np.max(bs - ps))
可以看到,兩個分布的形狀幾乎相同,二者的最大誤差是6.254614978717932e-07,該數值遠遠小於1。
程序無故障的概率
假設某個公司開有一個帶傷上線的系統,每周平均的故障次數是2次,在下周不發生故障概率是多少?
泊松分布是離散概率分布,是一個描述給定的時間間隔內事件發生次數的模型,而時間是一個連續區間。面對連續區間,一個自然的選擇是把區間分成n等份,每個時間小段事件發生的概率就是pn = p/n,n越大,pn越小,npn2<<1時泊松近似非常理想。當n→∞時,pn→0,此時將得到一個准確的模型。也就是說,如果事件的平均發生率是λ,那么泊松分布就是一個單位時間內事件發生的准確模型。
回到問題,每周平均的故障次數是2次,我們可以把“一周”看作單位時間,程序的故障率是λ=2,在下周不發生故障的概率相當於發生了0個故障的概率:
類似的例子還有很多,比如根據歷史數據預測網站的訪問量在1小時內達到某個值的概率;根據歷史報告預測某個路段發生事故的概率。
期望和方差
泊松分布告訴我們,事件在單位區間內平均發生的次數是λ,也就是E[X]= λ。更簡潔的地方在於,泊松分布的方差也是λ。
也就是說,如果給出了一個泊松分布X~Po(λ),那么你根本不用計算,它的參數就是期望和方差
出處:微信公眾號 "我是8位的"
本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!
掃描二維碼關注作者公眾號“我是8位的”