【1】引言
前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式,它们作为基础,解释了事件发生及其概率的对应关系,相关文章链接为:
神经网络|(四)概率论基础知识-古典概型-CSDN博客
神经网络|(五)概率论基础知识-条件概率-CSDN博客
神经网络|(六)概率论基础知识-全概率公式_部分概率和总概率的关系-CSDN博客
神经网络|(七)概率论基础知识-贝叶斯公式-CSDN博客
在此基础上,我们更进一步,学习二项分布。
【2】概念分析
【2.1】随机变量
时间的发生可以用符号来记录,例如事件A,事件B等等。每个时间具体发生的情况又可以用数量来表达,例如事件A发生时记录为1,事件B发生时有5只小猫在玩耍3只小猫在睡觉等,总而言之千般万物各有对应的表征。
进一步,各个事件发生时,真正改变的那个因素才是我们关心的,这个因素就是变量。
随机变量就是随机试验中,事件发生时会改变的因素。
随机试验的特点是:试验可以在相同的条件下重复;每次试验的结果不止一个,且能明确所有可能的结果;但实际上不能提前预知哪个结果会出现。
所以,随机变量就是:可在相同条件下重复的试验中,虽然知道所有可能结果,但无法确定具体哪种结果可能出现时,具体出现的那个结果的表征,随机变量代表了具体的试验结果。
随机变量有离散和连续两种形式,此处我们先研究离散形式的随机变量。
【2.2】离散型随机变量及其分布
虽然定义了离散型随机变量这个名字,但还是要强调:
随机变量是随机试验的结果表征,因为只有随机试验完成,才知道具体的结果,所以这个结果的取值随着试验次数的增加不断变化,又因为试验都是在相同的条件下重复进行,所以每次出现的结果彼此独立、互不影响。
离散型的随机变量,就是指这些相互独立的随机变量的取值是跳跃的,在数学上的呈现是离散的点,而非练成一条线。
如果记X为随机变量,以x记录具体的随机变量取值,就可以简写随机试验的概率:
P{X=x}=p
在全概率公式的分析中已知:各个分概率对应的事件,是彼此互斥但总体互补的关系,它们互不隶属,但总体上能凑成一个完整的试验。所以各个分概率加起来,总和应该是1。
所以随机试验的概率,详细写可以为:
具体的解释为:随机变量X取值为时的概率为
。
同时也一定会满足:
【2.3】二项分布-伯努利分布
如果一个随机试验只有两种结果:A或者非,这种试验可以称为伯努利试验。
伯努利试验的概率,可以记作:P(A)=p(0<p<1)和P()=1-P。
伯努利试验重复n次,成为n重伯努利试验。如果想计算这n次试验中,A发生k次的概率,就可以分析:
a.用X记录A发生;
b.用X=k表征A发生k次。
所以有:
刚好,上式就是二项式的第n项,所以n重伯努利试验结果的分布规律,也称为二项分布。
本质上,二项分布涉及三个量:代表事件的X,记录事件的x,以及时间对应的概率p。
当n=1时,二项分布也称为(0-1)分布。
有时候为了让公式更好看和便于书写,可以记录q=1-p。
【3】二项分布python仿真
使用python语言,调用numpy模块中的numpy.random.binomial()函数,可以实现对多重伯努利试验概率分布即二项分布的数学仿真。
numpy.random.binomial()函数的官网链接为:
https://numpy.org/doc/stable/reference/random/generated/numpy.random.binomial.html
这个函数是按照伯努利试验概率分布的形式生成随机数,官网对此的说明为:
图1 numpy.random.binomial()函数生成随机数工作原理
numpy.random.binomial()函数的参数解释为:
random.binomial(n, p, size)
n:伯努利试验的次数
p:伯努利试验的成功概率
size:把上述n次伯努利试验看成一个完整的大型伯努利试验,size代表对这个大型伯努利试验重复的次数,实际上就是打包重复n重伯努利试验
基于此函数的特点,先引入必要模块和定义所需参数:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 二项分布参数
n = 10 # 试验次数
p = 0.5 # 成功的概率
size = 1000 # 生成随机数的数量
然后生成伯努利随机数:
# 生成符合二项分布的随机数
data_binomial = np.random.binomial(n, p, size) #随机数分布符合二项分布的形式
之后就是对随机数的分布情况进行绘图:
# 绘制直方图
fig,axs=plt.subplots(1,2) #定义一行两列的图像绘制
axs[0].hist(data_binomial, bins=n+1, density=False, alpha=0.6, color='g') #按数量绘制生成的数字分布图
axs[1].hist(data_binomial, bins=n+1, density=True, alpha=0.6, color='y') #按概率回执生成的数字分布图
fig.suptitle('Binomial Distribution Simulation',y=0.95) #设置图像名称
axs[0].set_xlabel('Number of Successes') #设置X轴标签
axs[0].set_ylabel('Probability') #设置Y轴标签
axs[1].set_xlabel('Number of Successes') #设置X轴标签
plt.savefig(‘binomial.png’) #保存图像
plt.show() #显示图像
在这里调用了hist()函数进行数据的概率分布画图,如果不是很熟悉,可以参考链接回忆:
python画图|hist()函数画直方图初探_python hist()-CSDN博客
python画图|hist()函数画直方图进阶_ax.hist()函数-CSDN博客
python画图|hist()函数深层体验_python hist函数-CSDN博客
python画图|hist()函数高阶探索_python 画图.hist(bars=100)-CSDN博客
puthon画图|hist()函数深度探索-CSDN博客
代码使用了10次伯努利试验,单次成功率为0.5,然后对这10次c重伯努利试验打包dabao重复1000次,获得的试验成功次数和概率为:
图2 伯努利仿真
图2的显示效果非常类似于正态分布,其中仿真结果等于5的次数出现了大概250次,在所有渠道的数据中的占比大约为0.28。
此时的完整代码为:
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块
# 二项分布参数
n = 10 # 试验次数
p = 0.5 # 成功的概率
size = 1000 # 生成随机数的数量
# 生成符合二项分布的随机数
data_binomial = np.random.binomial(n, p, size) #随机数分布符合二项分布的形式
# 绘制直方图
fig,axs=plt.subplots(1,2) #定义一行两列的图像绘制
axs[0].hist(data_binomial, bins=n+1, density=False, alpha=0.6, color='g') #按数量绘制生成的数字分布图
axs[1].hist(data_binomial, bins=n+1, density=True, alpha=0.6, color='y') #按概率回执生成的数字分布图
fig.suptitle('Binomial Distribution Simulation',y=0.95) #设置图像名称
axs[0].set_xlabel('Number of Successes') #设置X轴标签
axs[0].set_ylabel('Probability') #设置Y轴标签
axs[1].set_xlabel('Number of Successes') #设置X轴标签
plt.savefig('binomial.png') #保存图像
plt.show() #显示图像
【4】细节说明
使用python语言调用numpy模块中的numpy.random.binomial()函数时,生成的数据本身按照二项分布的形式出现,实际代码没有去编写二项分布函数。
【5】总结
回顾了二项分布的基础知识,使用python语言调用numpy模块中的numpy.random.binomial()函数进行了二项分布效果仿真。