python 二项分布_二项分布的理论基础、应用及Python实践

ca86629396b971b5adfa6700f0ddfd7d.png

二项分布是概率统计中非常基础、非常实用的一种分布,可以说它在我们的生活中无所不在。它说明了这样一种现象:在给定的试验次数中,某一结果会发生多少次。

比如:

这个月有多少天会刮北风?

今年有多少天会下雨?

经过一个路口100次,有多少次会是绿灯?

一年之中会有多少次出门就见狗?

伯努利分布

伯努利分布是二项分布的基础,它只有两种状态,比如抛硬币的时候,结果只有正面和反面两种情况,且两种情况的概率之和为1。也就是说,当我们给定正面朝上的概率的时候,这个分布的一切就都确定了。

我们以0和1来标识这两种可能的结果,那么其概率函数为:

0dbfbda8558701f6ac6cd218912c7127.png

那么其期望值为:

59e1022830744152c826e3f2f45f9dd1.png

其方差为:

a9beadf746dac408f3b34a62bb12ea70.png排列组合

1. 排列

从n个对象中有序地挑选出r个对象,我们称之为排列,我们用以下公式统计其可能产生的排列数:

d775a8742cad0e39dba64e377b2a999f.png

2. 组合

考虑另一种情况,仍然是从n个对象中抽取r个对象,但是这次我们不考虑其顺序,这种过程我们称之为组合。我们用以下公式统计其可能产生的组合数:

0e3fe4803760e685814a07afa3d66cf2.png

可以看出,这是n选r的排列数除以r的排列数。上述公式又被称作二项系数,通常用“n选r”表示。

3. Python计算

那么接下来我们用Python来写一个函数,用来计算不同参数下的排列与组合的数量。在排列组合的计算中,我们可能会输入两个参数:总样本量n、需要抽取的样本数k。

那么我们就定义如下函数:

from functools import reducedef PC(n, k):    """    计算并返回排列组合数    """    # 非法输入返回空    if n <= 0 or k < 0 or n < k:        print('Wrong Input!')        return None        # k为0时,排列组合的情况恒为1    if k == 0:        return 1, 1        # 生成正序及倒序的序列    series_asc = list(range(1, n+1))    series_desc = sorted(series_asc, reverse=True)        # 排列    permutation = reduce(lambda x, y: x*y, series_desc[:k])        # 组合    perm2 = reduce(lambda x, y: x*y, series_asc[:k])    combination = int(permutation / perm2)            return permutation, combination

随手测试几个:

for n in range(1, 5):    for k in range(1, 3):        print('-'*10)        print(n, k)        print(PC(n, k))

结果是正确的:

----------1 1(1, 1)----------1 2Wrong Input!None----------2 1(2, 2)----------2 2(2, 1)----------3 1(3, 3)----------3 2(6, 3)----------4 1(4, 4)----------4 2(12, 6)

二项分布

回顾伯努利分布的情况:一次实验只有可能有两种结果,分别用0和1来表示,其中结果1发生的概率为p。那么在n次独立实验中,不考虑顺序的情况下,结果1出现k次的概率是多少?

首先,因为n次实验相互独立,所以根据乘法定律,任何一种结果1出现k次的场景发生的概率均为:

8ff9ab51ac1da37b275f7a73893dc145.png

然后,我们需要考虑结果为1的次数刚好为k的情况有多少种。很明显,这就是一个伯努利试验的组合问题,n次实验中有k次结果为1的情况共有“n选k”种,两者相乘就是该事件发生的概率。

因此:

448c7da398cde63a23b9f2ad2f25ed81.pngPython计算

那么我们来用Python实现一个计算二项分布概率的小工具,在这里,我们的输入参数包含总试验次数n、正样本发生的次数k以及正样本发生的概率p:

def binominal_prob(n, k, p):    """    计算并返回二项分布中某结果发生的概率    """    # 任一k次成功的序列出现的概率    p_base = p ** k * (1-p) ** (n-k)        # n次试验中k次成功的组合数    # 直接用上边我们编写的排列组合函数来求解    combination = PC(n, k)[1]    p_result = p_base * combination        return p_result

那么接下来,我们利用我们刚刚写好的小工具,来看一下在10次试验中,不同的概率对应的二项分布是什么样的。

probs = [binominal_prob(10, i, 0.5) for i in range(11)]

我们将结果画出来看看:

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snssns.set()probs = [round(i/10,1) for i in range(1, 10)]n = 20plt.figure(figsize=(16, 6))for p in probs:    dist_probs = [binominal_prob(n, i, p) for i in range(n+1)]    plt.plot(range(n+1), dist_probs, label='p={0}'.format(p))plt.legend()plt.title('Binominal Distributions of Different P value')plt.savefig('binominal.jpg')plt.show()
6a2bcc5281493f9e1fd11990b1fdcea8.png

或者我们使用交互式的绘图库plotly来尝试同样的事情:

import plotly.graph_objects as goprobs = [round(i/10,1) for i in range(1, 10)]n = 20fig = go.Figure()for p in probs:    dist_probs = [binominal_prob(n, i, p) for i in range(n+1)]    fig.add_trace(go.Scatter(        x=list(range(n+1)),         y=dist_probs,         name='p={0}'.format(p)    ))fig.show()
4bfc2540a12533e85f38428b173dba16.png

可以看到,plotly实现的效果更加靓丽,且额外支持了动态交互,在这里我就选择把p=0.8这条线隐藏了起来。

一个利用极大似然估计求二项分布概率参数的例子

我们现在想象一种情况,有一枚分布不太均匀的硬币,每次抛向空中后,落地为正面的概率为p,任意两次实验之间相互独立。现在我们做了4次实验,其中有三次正面朝上,那么请问p的值为多少?

我们之前曾经提到过极大似然估计,在这里我们用同样的思路去估计p的取值。极大似然估计的思想就是寻找一个参数,使得当前结果发生的概率最大,那么我们先定义出来当前结果发生的概率公式:

e4b9024a828eb96f5b9e8d05af1b9a36.png

对其求导并使导数为0,有:

7e6f45906cdc59034d1b44e232ee3ff8.png

可得,当p=0.75时,P(X=3)=0.422达到最大(另一个解p=0显然不可能,因为硬币朝上已经发生了,并不是“不可能事件”;另外考虑不同区间导数的取值也可以得到答案)。

- END -

文源网络,仅供学习之用,如有侵权,联系删除。

往期精彩

c551edb6d627ff3bb3c93709fc05a811.png

◆  50款开源工具你都用过吗?

◆  python+C、C++混合编程的应用

◆  python网络爬虫的基本原理详解

◆  Python自动操控excel,一小时解决你一天的工作

◆  如何用Python增强Excel,减少处理复杂数据的痛苦?

45d9abc38a89d708787e3f1a6c83bd67.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

在现阶段大数据的时代中&#xff0c;想要实现对数据的获取和分析&#xff0c;要先具备足够的数据源&#xff0c;网络爬虫技术就为其数据获取提供了良好的条件&#xff0c;且还能够实现对数据源的目的性采集。在网络爬虫技术应用中&#xff0c;Python 脚本语言的使用十分广泛&am…

阿诗玛的传说|阿诗玛民间故事

是彝族的 阿诗玛的传说 撒尼族阿着底地方&#xff0c;格路日明夫妻耕种山地住着草房。他们有个勇敢的儿子阿黑&#xff0c;又生下一个可爱的小姑娘。 天空闪出一朵花&#xff0c;小姑娘名叫阿诗玛。她的名字像香草&#xff0c;从此美名传四方。不知不觉长到十六岁&#xff0c;就…

maven 整体打包_Spirng boot maven多模块打包不踩坑(示例代码)

本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340经过实战一次通过。回话不多说&#xff0c;话费不多说&#xff0c;直接上图。项目整体结构&#xff1a;父模块&#xff1a;xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

ADO.NET中在C/S模式中使用的连接池

前几天同事问我一个问题&#xff0c;一种CS架构的程序&#xff0c;直接把SQL Server作为服务端&#xff0c;每个客户端直接连接数据库操作&#xff0c;如果客户端打开的数量过多时SQL Server的连接数将会特别高&#xff0c;数据库端形成性能瓶颈&#xff0c;这种情况下怎么办&a…

使用mysql制作学生成绩单_【实例讲解】快速制作学生成绩单

本文由网友潇之骥授权原创直发今天有位学校的老师找我给她作学生成绩单&#xff0c;给的数据如图1&#xff1a;(图1)需要的效果如下&#xff1a;(图2)讲解&#xff1a;要实现这种效果&#xff0c;只要用【邮件合并】这个功能就可以轻松搞定。要用好【邮件合并】这个功能&#x…

c语言 判断一个图是否全连通_基于云平台的全链路大规模网络连通性检测系统详解...

虚拟网络排查问题困难&#xff0c;传统的traceroute等工具很难起到太大作用&#xff0c;大部分情况下都需要到宿主机、混合云网关上抓包来troubleshooting&#xff0c;耗时又费力。有些场景中包的传送路径比较长(如跨域、混合云等)&#xff0c;可能丢包的地方比较多&#xff0c…

把checkbox复选框转换成单选按钮radio

文章原创&#xff0c;转载请说明文章来自&#xff1a;http://blog.csdn.net/xxd851116/archive/2009/03/16/3994833.aspx 网页中单选按钮的缺陷 &#xff1a;当一组单选按钮选择一项后改组按钮无法撤销选择改组&#xff0c;导致必须选择一项&#xff0c;用户体验差。 解决办法&…

python三大器_Python - 三大器 迭代器,生层器,装饰器

Python - 三大器 迭代器,生层器,装饰器在介绍三大器之前先来了解一下容器和可迭代对象...一. 容器容器是一种把多个元素组织在一起的数据结构&#xff0c;容器中的元素可以逐个地迭代获取&#xff0c;可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的…

python类的成员函数_Python为类对象动态添加成员函数

Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一个完整的合法的 Python 函数定义 , 然后为一个对象添 加这个函数 : method_strudef say(self, name) print…

关于重装系统后或打补丁后不能上网的问题的解决

前些日子&#xff0c;换了新机器&#xff0c;装系统&#xff0c;然后下驱动装一些最基本的软件&#xff0c;如QQ&#xff0c;安全卫士&#xff0c;杀毒软件&#xff08;俺只用免费的&#xff0c;嘿嘿&#xff0c;如德国的小红伞&#xff0c;一般情况就作够用了&#xff09;。上…

java对接华为推送服务_华为HMS Core 4.0版本即将来袭:包含新推送服务

据官方消息&#xff0c;在12月27日的HUAWEI Developer Groups(简称HDG)大连活动上&#xff0c;华为消费者云服务HMS运营经理透露HMS Core 4.0版本即将上线&#xff0c;由原来的14项增加至24项核心开放功能&#xff0c;近日即将开放新版本众测&#xff0c;不久之后开发者们将会体…

python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...

1、解析速度&#xff1a;ElementTree在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree &#xff0c;另外一种是速度快一点的 xml.etree.cElementTree 。你要记住&#xff1a; 尽量使用 C 语言实现的那种&#xff0c;因为它速度更快&#xff0c;而…

CISSP的成长之路(二十一):用户持有凭证

在51CTO安全频道特别策划的CISSP的成长之路系列的上一篇文章《讲解身份验证过程》里,J0ker给大家介绍了用户验证时所依赖的三种验证要素、密码和密码短语及其安全使用原则。作为技术实施难度和成本最低的用户验证方案&#xff0c;基于密码的用户验证方案广泛应用于我们的日常生…

mysql主从同步面试题_面试被问MySQL 主从复制,怎么破?

注意&#xff1a;此处使用的是新创建的账户。# 4.4 启动主从复制1)启动从库 slave 线程&#xff1a;start slave;2)查看从服务器复制功能状态&#xff1a;show slave status\G;返回结果&#xff1a;*************************** 1. row ***************************Slave_IO_St…

python控制手机自动刷新闻_Python控制android手机实现微信自动跳一跳

学习一个新东西一定要有趣&#xff0c;如果只是简单学习语法太枯燥了。弄了个跳一跳的程序&#xff0c;注释写的很清楚#!/usr/bin/env python # encoding: utf-8 # software: PyCharm # time: 2019/7/10 15:39 # author: Paulson●Wier # file: jump_跳一跳.py # desc: import …

独家:Havok 发布新的 AI 中间件

独家&#xff1a;Havok 发布新的 AI 中间件 March 23rd, 2009 Alex J. Champandard 2009-3-23&#xff0c;赖勇浩&#xff08;http://blog.csdn.net/lanphaday&#xff09;译 原文地址&#xff1a;http://aigamedev.com/middleware/havok-ai-announced 在20日&#xff08;上周五…

mysql查询入门_Mysql入门(四)查询

我们继续查询~条件查询及逻辑运算符条件查询如果我只想查询&#xff0c;年级小于30的&#xff0c;可以加个where条件关键字~条件查询敲黑板select * from yingxiong where y_age<30where 表示条件(条件关键字)&#xff0c;在where之后跟过滤的条件注意&#xff1a;逻辑运算符…

maven provided_Maven 教程之 pom.xml 详解

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;dunwuhttps://github.com/dunwu/blog推荐阅读(点击即可跳转阅读)1. SpringBoot内容聚合2. 面试题内容聚合3. 设计模式内容聚合4. Mybatis内容聚合5. 多线程内容聚合简介什…

python将一个列表里面的某类元素取出来_03|Python列表常见操作

欢迎关注pythoner派微信公众号及头条号Python常见的数据结构我们在上一节中已经讲过再阅读文章前&#xff0c;请打开PythonIDE列表&#xff1a;1.定义一个列表现在我们有3瓶不同类型的啤酒&#xff0c;现在我们将其放入列表之中beer [粉象,白熊,橙色炸弹]2.向列表中追加元素现…

使用SDL打造游戏世界之入门篇 - 2

VC6下SDL的安装和初步使用首先&#xff0c;我们为所有的工程创建一个文件夹tutorial,将下载的开发库SDL-devel-1.2.8-VC6.zip拷贝到tutorial下并解压&#xff0c;并保证如下的文件夹层次&#xff08;图2&#xff09;如下&#xff1a;图2下面我们打开Visual Studio6.0&#xff0…