二项分布

问题描述:

二项分布就是重复n次独立的伯努利试验。在每次试验中只有两种可能的结果,而且两种结果发生与否互相对立,并且相互独立,与其它各次试验结果无关,事件发生与否的概率在每一次独立试验中都保持不变,则这一系列试验总称为n重伯努利实验,当试验次数为1时,二项分布服从0-1分布。

假设伯努利实验中事件发生的概率为p,求n次独立的伯努利实验,事件发生k次的概率。


数学公式

我们都知道,上述问题可采用公式(1):

P(X=k)=Cknpk(1−p)n−k式(1)

P(X=k)=C_n^kp^k(1-p)^{n-k} \quad\quad 式(1)
计算,其中

Ckn=n!k!(n−k)!式(2)

C_n^k = \dfrac{n!} {k! (n-k)!} \quad\quad 式(2)

我们还知道:

Ckn=n!k!(n−k)!=(n−1)!k!(n−1−k)!+(n−1)!(k−1)!(n−k)!=Ckn−1+Ck−1n−1式(3)

C_n^k = \dfrac{n!} {k! (n-k)!} = \dfrac{(n-1)!} {k! (n-1-k)!} + \dfrac{(n-1)!} {(k-1)! (n-k)!}= C_{n-1}^k + C_{n-1}^{k-1} \quad\quad 式(3)

于是:

Cknpk(1−p)n−k=(1−p)Ckn−1pk(1−p)n−1−k+pCk−1n−1pk−1(1−p)n−k式(4)

C_n^k p^k (1-p)^{n-k} = (1-p) C_{n-1}^k p^k (1-p)^{n-1-k}+ p C_{n-1}^{k-1}p^{k-1}(1-p)^{n-k} \quad\quad 式(4)

我们记

f(n,k)=Cknpk(1−p)n−k式(5)

f(n, k) = C_n^k p^k (1-p)^{n-k} \quad\quad 式(5)

于是我们有:

f(n,k)=(1−p)f(n−1,k)+pf(n−1,k−1)式(6)

f(n, k) = (1-p) f(n-1, k) + p f(n-1, k-1) \quad\quad 式(6)


算法:

递归算法:

算法思想:

递归算法思想就是来源于上面的公式(6),我们只需要找到递归出口,也就是最基本的情况就行了。
很明显:我们有

f(n,k)=⎧⎩⎨⎪⎪(1−p)f(n−1,k)+pf(n−1,k−1)ifn>k,k>01.0 ifk=n=0式(7)0.0 ifk>n或者n<0或者k<0

f(n, k) = \begin{cases} (1-p) f(n-1, k) + p f(n-1, k-1) \quad if \quad n > k, k >0 \\ 1.0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ if \quad k = n = 0 \quad\quad\quad 式(7) \\ 0.0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ if \quad k > n 或者 n

递归算法代码:

    /*** 时间复杂度:O(2^n)* @param N* @param K* @param p* @return 伯努利实验n次,事件发生k次的概率*/public static double binomialRec(int N, int K, double p) {if (N == 0 && K == 0) return 1.0;if (N < 0 || K < 0) return 0.0;return (1.0 - p) * binomialRec(N - 1, K, p) + p * binomialRec(N - 1, K - 1, p);}

非递归算法

算法思想:

上述递归算法的时间复杂度太高,当n比较大时,可能都运行不出结果。之所以时间复杂度太高,是因为有大量的重复计算,于是很直观的想法就是,把已经算出来的结果存储到数组里。由于是计算实验n次,事件发生k次的概率,所以我们可以用二维数组存放计算的中间结果。

非递归算法代码:

/*** * 伯努利实验,实验n次,出现k次的概率* 非递归方式实现,采用二维数组存储已经计算过的值* 时间复杂度:O(n * k),空间复杂度:O(n * k)* @param n* @param k* @param p* @return*/public static double binomialArray(int n, int k, double p) {double[][] array = new double[n+1][k+1];// Initilize arrayfor (int i = 0; i <= n; i++) {for (int j = 0; j <= k; j++) {array[i][j] = 0;}}array[0][0] = 1.0;for (int i = 1; i <= n; i++) {for (int j = 0; j <= k; j++) {if (j > i) {break;}if (i - 1 >= 0) {array[i][j] += (1.0 - p) * array[i-1][j];if (j - 1 >= 0) {array[i][j] += p * array[i-1][j-1];}}}}return array[n][k];}

非递归算法改进

算法思想: 上述非递归算法中,我们使用的是二维数组存放计算过的值,但我们发现,在计算array[i][j]时,只与其上一行的array[i-1][j]和array[i-1][j-1]有关,与其他值无关,所以我们可以使用一维数组来实现。这样空间复杂度可以降低到O(k).

非递归算法改进代码:

    /*** 伯努利实验,实验n次,出现k次的概率* 非递归方式实现,采用一维数组实现存储计算过的值* 时间复杂度:O(n * k),空间复杂度:O(k)* @param n* @param k* @param p* @return */public static double binomial(int n, int k, double p) {double[] array = new double[k+1];for (int i = 0; i < array.length; i++) {array[i] = 0.0;}array[0] = 1.0;for (int i = 1; i <= n; i++) {// 这里要倒着计算,因为正序计算新值会覆盖掉之前的旧值for (int j = k; j >= 0; j--) {if (j - 1 >= 0) {array[j] = (1.0 - p) * array[j] + p * array[j-1];}else {array[j] = (1.0 - p) * array[j];}}}return array[k];}

二项分布算法(伯努利实验)相关推荐

  1. HDU 5810(伯努利实验、多校7、规律)

    题意: 有nn个小球,mm个箱子.把小球放到箱子里.问每个箱子里的小球个数的方差. 解题思路: 比赛是想了好长时间也没想出来,感觉是到公式题,但怎么都找不出公式.跟官方题解想的一样但是E(x2)E(x ...

  2. matlab模拟伯努利实验,matlab仿真随机数的发生

    概率论和数理统计实验(matlab中实现) 一.伯努利漫衍 R=binornd(N,P); //N,P为二次漫衍的俩个参数,返回遵守参数为N,P的二项漫衍的随机数,且N,P,R的形式相同. R=bin ...

  3. #概率论#n重伯努利实验

  4. 概率论小课堂:伯努利实验(正确理解随机性,理解现实概率和理想概率的偏差)

    文章目录 引言 I 伯努利试验 1.1 伯努利分布(二项式分布) 1.2 数学期望值(简称期望值) 1.3 平方差(简称方差) 1.4 标准差 1.5 小结 引言 假设买彩票中奖的概率是一百万分之一, ...

  5. 三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯

    朴素贝叶斯 在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器. 朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝 ...

  6. 概率论笔记1.5伯努利模型(二项分布)

    1.5伯努利模型(二项分布) 定义 n重独立实验序列:E1 E2-En 事件之间互相独立 结果只有两种! n重伯努利实验:n次独立实验但是结果只有两种 定理:A的概率是p,A逆:1-p,n重伯努利实验 ...

  7. sklearn模块之朴素贝叶斯:(二)伯努利模型的实现

      多元Bernoulli模型的朴素贝叶斯分类器适用于离散数据.与MultinomialNB不同之处为: MultinomialNB使用出现次数(频数) BernoulliNB设计用于二进制/布尔特征 ...

  8. 概率论:古典概型与伯努利概型

    古典概型不要在意伯努利就是二项分布伯努利其实就是建模型 出的题什么模型都没告诉你的叫你自己建立模型 一般情况都是伯努利正态分布模型,指数分布模型题上都会直接告诉你的 比如某随机变量服从正态分布 什么话 ...

  9. 泊松抽样与伯努利抽样主要联系与区别

    泊松抽样是一个抽样过程,其中总体的每个元素都经过独立的伯努利实验,以确定该元素是否成为样本的一部分.总体中的每个元素可能有不同的概率被包含在样本中.如果所有一阶包含概率相等,则泊松抽样就等同于伯努利抽 ...

最新文章

  1. 讨论SELinux对系统安全的影响(转)
  2. R400换XP 所有驱动程序安装一览表
  3. spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
  4. BUAA_OO_Unit1总结
  5. sql server实例内存使用统计
  6. 刷新存储器的容量单位是什么_SRAM的容量扩展
  7. 手机端网页切图之间出现空白的问题
  8. linux 卸载vnc,realvnc的卸载
  9. 电脑快捷键大全 Alt
  10. 在win10里修改mysql的root密码
  11. Gartner魔力象限图横竖轴
  12. 【网络】OSI七层模型
  13. python怎么生成日志_python 生成模拟日志
  14. EL表达式三目运算符
  15. 位图BitMap图像的读取与存储
  16. 讯为4412开发板Linux驱动学习笔记
  17. 由浅入深了解Nirvana NAC公链的两面性NA公链
  18. 悟空CRM11.0 PHP版本docker容器化部署全流程
  19. 设计模式——共享模式
  20. ParrotSec-OS渗透测试系统

热门文章

  1. 求和符号的定义和性质
  2. 用python做一个好玩的数字炸弹游戏
  3. HTML知识点学习(二)
  4. 设计模式 | 观察者模式及典型应用
  5. 旷世face++人脸识别实名鉴权商汤科技ocr二要素哪家强
  6. HDU_1847 Good Luck in CET-4 Everybody!
  7. python实现骰子猜大小游戏
  8. MACD怎样判断趋势?巧用MACD指标研判市场的强弱!(实例)
  9. 亚马逊显示在售商品为0怎么办?亚马逊新品货还没到就在售了
  10. 计算机如何连接wifi台式,台式电脑怎么连接WIFI上网?台式电脑连接无线网络的方法...