Python模擬二項分佈

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章