python 二项分布_二项分布的理论基础、应用及Python实践
二项分布是概率统计中非常基础、非常实用的一种分布,可以说它在我们的生活中无所不在。它说明了这样一种现象:在给定的试验次数中,某一结果会发生多少次。
比如:
这个月有多少天会刮北风?
今年有多少天会下雨?
经过一个路口100次,有多少次会是绿灯?
一年之中会有多少次出门就见狗?
伯努利分布
伯努利分布是二项分布的基础,它只有两种状态,比如抛硬币的时候,结果只有正面和反面两种情况,且两种情况的概率之和为1。也就是说,当我们给定正面朝上的概率的时候,这个分布的一切就都确定了。
我们以0和1来标识这两种可能的结果,那么其概率函数为:
那么其期望值为:
其方差为:
排列组合
1. 排列
从n个对象中有序地挑选出r个对象,我们称之为排列,我们用以下公式统计其可能产生的排列数:
2. 组合
考虑另一种情况,仍然是从n个对象中抽取r个对象,但是这次我们不考虑其顺序,这种过程我们称之为组合。我们用以下公式统计其可能产生的组合数:
可以看出,这是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次的场景发生的概率均为:
然后,我们需要考虑结果为1的次数刚好为k的情况有多少种。很明显,这就是一个伯努利试验的组合问题,n次实验中有k次结果为1的情况共有“n选k”种,两者相乘就是该事件发生的概率。
因此:
Python计算
那么我们来用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()
或者我们使用交互式的绘图库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()
可以看到,plotly实现的效果更加靓丽,且额外支持了动态交互,在这里我就选择把p=0.8这条线隐藏了起来。
一个利用极大似然估计求二项分布概率参数的例子
我们现在想象一种情况,有一枚分布不太均匀的硬币,每次抛向空中后,落地为正面的概率为p,任意两次实验之间相互独立。现在我们做了4次实验,其中有三次正面朝上,那么请问p的值为多少?
我们之前曾经提到过极大似然估计,在这里我们用同样的思路去估计p的取值。极大似然估计的思想就是寻找一个参数,使得当前结果发生的概率最大,那么我们先定义出来当前结果发生的概率公式:
对其求导并使导数为0,有:
可得,当p=0.75时,P(X=3)=0.422达到最大(另一个解p=0显然不可能,因为硬币朝上已经发生了,并不是“不可能事件”;另外考虑不同区间导数的取值也可以得到答案)。
- END -
文源网络,仅供学习之用,如有侵权,联系删除。
往期精彩
◆ 50款开源工具你都用过吗?
◆ python+C、C++混合编程的应用
◆ python网络爬虫的基本原理详解
◆ Python自动操控excel,一小时解决你一天的工作
◆ 如何用Python增强Excel,减少处理复杂数据的痛苦?
python 二项分布_二项分布的理论基础、应用及Python实践相关推荐
- 请给出计算231-1的python表达式_计算 2 31 -1 的 Python 表达式是 。_学小易找答案
[填空题]国内教学目标分类的二维层次模型中,教学内容被分为哪五个层次:事实.概念.技能.______.问题解决. [多选题]报表子系统提供的图表格式一般包括? [填空题]激发和维持学生学习动机的模型- ...
- flask执行python脚本_如何在Flask中运行python脚本
我有一个Flask脚本,可以创建网站并动态打印一些数据.-打印的数据应来自另一个python脚本. 我目前面临的问题是,如果我将执行python脚本的行放在执行Flask应用程序的行之前,它将运行Py ...
- 苹果系统安装python环境_如何在mac下配置python虚拟环境
安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip insta ...
- ai python 面试_面试分享系列 | 17道Python面试题,让你在求职中无往不利
今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷. 1.Python中pass语句的作用是 ...
- 量化投资与python语言_在量化投资领域,为什么Python如此受欢迎?
说起Web领域 你立马会想到JavaScript语言,它在Web领域不可撼动:Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现. 在量化投资(证券和比特币)开源 ...
- 小猿圈python视频_小猿圈分享学习Python的最佳方式
原标题:小猿圈分享学习Python的最佳方式 python现在是世界上功能最多的编程语言之一,可以是用Python编辑应用程序,游戏.算法程序.还可以编程一个机器人,学习Python可以担任软件工程师 ...
- 下载anaconda前需要卸载python吗_装了anaconda要卸载python吗
装了anaconda其实是可以选择卸载python,当然也可以不卸载.Anaconda 是Python的一个发行版,里面内置了很多工具,不用单独安装,因为做了优化也免去了单独安装带来的一些麻烦. An ...
- linux python优势_来讲讲 Julia胜于Python的5个优势
导读 Julia是一种多范式函数编程语言,主要用于机器学习和统计编程.虽然Julia当然没有Python那么受欢迎,但是将Julia用于数据科学有一些巨大的好处,使得它在Python的许多情况下都是一 ...
- 小白如何学python编程_零基础小白如何学习Python编程?
随着社会的发展,人工智能市场的火爆,因此也让Python这门语言一举成名,成为了最受欢迎的编程语言,也是现代四大编程语言之一,打破了原有的局面.下面,我带领着大家一起来探索一下吧. 1.Python跟 ...
最新文章
- 1. 验证集 -- 批量测试和可视化 2. 测试集 -- 批量测试和可视化
- 2012年河南省普通高校招生本科一批院校 平行投档分数线(理科)
- 360 mysql无法启动_安装MySQL 5后无法启动(不能Start service)解决方法小结
- 测试SAP BRF+ ruleset
- React向对象数组进行赋值
- 用VC写Assembly代码(5) --函数调用(三)
- mysql参数配置调优详解配置(1)
- python无法导入模块_python怎么导入模块
- RabbitMQ交换器Exchange
- 什么叫做支路_你知道什么叫电路图的了吧...
- Java 并发 —— 从 BIO 到 NIO
- Android View layout方法的简单使用案例
- html php连接mysql数据库连接,PHP如何连接MySQL数据库?附两种方法!
- android系统同时使用wifi和4g上网
- 树莓派集成BH1750光敏传感器配置
- 微信小程序开发笔记--07
- mysql memos
- 浅谈BIM技术在“智慧工地”建设中的应用
- 磁场强度单位T(特斯拉)和高斯
- 使用 Scrapy-Redis 进行分布式爬取
热门文章
- 跨平台开发框架 Lynx 初探
- 文档声明和HTML样式表
- Java基础笔记之数据类型
- 手把手教你用 elementUI 实现导航栏
- androidmanifest.xml权限中文说明
- xpath和css selector
- SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false...
- 页面传值的方法 和JSON与字符串和对象之间的转换
- jfinal java搭建_Eclipse快速搭建Jfinal web应用 (一)
- 上传文件显示进度条_【技巧 】iOSamp;Windows互传文件?透过「文件」轻松解决~...