Python的numpy庫中有二項分佈採樣的函數:
numpy.random.binomial(n,p,size=None)
3個參數:n表示伯努利試驗次數,p表示伯努利試驗得到正例的概率,size表示採樣次數;返回結果爲出現正例的次數k。
可以使用該函數來模擬二項分佈,借用Inside_Zhang[1]的例子:
野外正在進行9(n=9)口石油勘探井的發掘工作,每一口井能夠開發出油的概率是0.1(p=0.1)。請問,最終所有的勘探井都勘探失敗的概率?
Python代碼:
import numpy as np
from matplotlib import pyplot as plt
# 統計一個列表中每個元素出現的次數
# 參考https://blog.csdn.net/qq_42467563/article/details/86182266.[2]
def count(lis):
lis=np.array(lis)
key=np.unique(lis)
x = []
y = []
for k in key:
mask =(lis == k)
list_new=lis[mask]
v=list_new.size
x.append(k)
y.append(v)
return x,y
n,p=9,0.1
size=10000
result=np.random.binomial(n,p,size) #得到採樣結果
a,b=count(result)
print(a)
print(b)
# 繪製結果分佈圖
# 參考https://www.jianshu.com/p/8c0fe1240e78.[3]
plt.figure(1)
plt.subplot(2,1,1)
plt.bar(a,height=b,width = 0.5, color = 'lightskyblue',edgecolor = 'white')
for x,y in zip(a,b):
plt.text(x, y+0.1, '%d' % y, ha='center', va= 'bottom')
plt.ylim(top=size)
plt.xlim(right=n)
x_ticks = np.arange(0, n+1, 1)
plt.xticks(x_ticks)
plt.ylabel('counter')
# 繪製pmf柱狀圖
# 參考https://blog.csdn.net/howhigh/article/details/78007317.[4]
plt.subplot(2,1,2)
plt.hist(result, bins=x_ticks, align='left', density=True, rwidth=0.5) # 繪製直方圖
plt.xticks(x_ticks)
plt.xlabel('k')
plt.ylabel('probability')
plt.show()
結果:
[0, 1, 2, 3, 4, 5, 6]
[3885, 3894, 1692, 457, 66, 5, 1]
最終所有的勘探井都勘探失敗的概率可以通過"sum(result==0)/size"來近似,結果爲:
0.3885
參考資料:
[1] Inside_Zhang, “二項分佈的實現(np.random.binomial)”, https://blog.csdn.net/lanchunhui/article/details/50172659.
[2] 三尺秋水一點飛鴻, “Python統計一個列表中每個元素出現的次數。四種方法,總有一款適合你”, https://blog.csdn.net/qq_42467563/article/details/86182266.
[3] Kedi, “python_使用matplotlib畫柱狀圖(bar),散點圖(scatter)”, https://www.jianshu.com/p/8c0fe1240e78.
[4] howhigh, “9.7 python模擬常用分佈”, https://blog.csdn.net/howhigh/article/details/78007317.