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.

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Python模拟二项分布并绘制直方图的例子: ```python import numpy as np import matplotlib.pyplot as plt def binomial(n, p, size=1): """Simulate a binomial distribution with parameters n and p.""" return np.random.binomial(n, p, size) # Set parameters n = 20 # Number of trials p = 0.5 # Probability of success # Simulate the distribution samples = binomial(n, p, size=1000) # Plot the histogram plt.hist(samples, bins=np.arange(n+1)-0.5, density=True, alpha=0.5) plt.xlabel('Number of successes') plt.ylabel('Probability') plt.title('Binomial distribution with n={}, p={}'.format(n, p)) plt.show() ``` 在这个例子中,我们使用了numpy库中的`binomial`函数来模拟二项分布。参数`n`表示试验次数,`p`表示每次试验成功的概率。我们使用`size`参数来指定需要生成多少个样本,这里设置为1000个。 我们使用matplotlib库中的`hist`函数来绘制直方图。参数`bins`表示我们希望将数据分成多少个区间,这里我们选择将数据分成`n+1`个区间,即每个成功次数对应一个区间。参数`density`表示是否将直方图转化为概率密度图。参数`alpha`表示直方图的透明度。 最后,我们使用`xlabel`和`ylabel`函数来标注x轴和y轴的标签,使用`title`函数来添加图表的标题。最后使用`show`函数显示图表。 运行上述代码,将会得到一个类似下图的二项分布直方图: ![binomial_distribution.png](https://i.loli.net/2021/05/10/4D7nNcKzBx8VJWd.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值