博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
概率统计Python计算(7)全概率公式
阅读量:655 次
发布时间:2019-03-15

本文共 3260 字,大约阅读时间需要 10 分钟。

1. numpy数组的按元素计算

设完备事件组 A 1 , A 2 , ⋯   , A n A_1,A_2,\cdots,A_n A1,A2,,An作为引发事件 B B B n n n个因素。诸因素的先验概率构成的序列为 P ( A 1 ) , P ( A 2 ) , ⋯   , P ( A n ) P(A_1),P(A_2),\cdots,P(A_n) P(A1),P(A2),,P(An),在诸因素 A i A_i Ai发生的条件下,事件 B B B的似然度构成序列 P ( B ∣ A 1 ) , P ( B ∣ A 2 ) , ⋯   , P ( B ∣ A n ) P(B|A_1),P(B|A_2),\cdots,P(B|A_n) P(BA1),P(BA2),,P(BAn),这两个序列是等长(所含元素个数相同)的。序列对应元素积之和 ∑ i = 1 n P ( A i ) P ( B ∣ A i ) \sum\limits_{i=1}^nP(A_i)P(B|A_i) i=1nP(Ai)P(BAi),即为用全概率公式计算的事件 B B B的概率 P ( B ) P(B) P(B)。Python的numpy包提供的数组array类的两个等长(所含元素个数相同)对象之间就支持这样的“按元素”运算:对应元素分别计算,得到一个新的数组(如图所示)。

在这里插入图片描述
运算包括常见的加+、减-、乘*、除/、幂**以及各种函数计算。例如以下代码示例了等长数组间的四则运算:

import numpy as npx=np.array([2, 3, 4])y=np.array([1, 2, 3])print(x+y)print(x-y)print(x*y)print(x/y)

运行程序,输出

[3 5 7][1 1 1][ 2  6 12][2.         1.5        1.33333333]

2. 全概率公式计算

利用numpy的这一技术,将计算全概率公式的算法表示成如下的函数定义:

def totalProb(prioProbs, likelihood):   #参数类型为np.array    return (prioProbs*likelihood).sum() #按元素乘法然后求和

上列程序定义了计算全概率公式的函数totalProb,该函数有两个numpy数组类型的参数:表示完备组先验概率序列的prioProb和表示似然度序列的likelihood。函数计算先验概率序列prioProb和似然度序列likelihood按元素的积(prioProbs*likelihood),然后调用该数组的sum方法对所得序列求和((prioProbs*likelihood).sum()),最后将所得值作为返回值返回(第2行)。

例1 设某仓库有一批产品,已知其中甲、乙、丙三个工厂生产的产品依次占 50 % 50\% 50% 30 % 30\% 30% 20 % 20\% 20%,且甲、乙、丙厂的次品率分别为 1 / 10 1/10 1/10 1 / 15 1/15 1/15 1 / 20 1/20 1/20。现从这批产品中任取一件,求取得正品的概率。\
:设事件“从仓库中任取一件产品是正品”为 B B B A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3分别表示事件:“产品是甲、乙、丙厂生产的”,则 A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3构成一个完备事件组,可视为事件 B B B发生的3个因素。按题设 P ( A 1 ) = 1 / 2 P(A_1)=1/2 P(A1)=1/2 P ( A 2 ) = 3 / 10 P(A_2)=3/10 P(A2)=3/10 P ( A 3 ) = 1 / 5 P(A_3)=1/5 P(A3)=1/5(各因素的前验概率),且由 P ( B ˉ ∣ A 1 ) = 1 / 10 P(\bar{B}|A_1)=1/10 P(BˉA1)=1/10 P ( B ˉ ∣ A 2 ) = 1 / 15 P(\bar{B}|A_2)=1/15 P(BˉA2)=1/15 P ( B ˉ ∣ A 3 ) = 1 / 20 P(\bar{B}|A_3)=1/20 P(BˉA3)=1/20,得 P ( B ∣ A 1 ) = 9 / 10 P(B|A_1)=9/10 P(BA1)=9/10 P ( B ∣ A 2 ) = 14 / 15 P(B|A_2)=14/15 P(BA2)=14/15 P ( B ∣ A 3 ) = 19 / 20 P(B|A_3)=19/20 P(BA3)=19/20(B相对于各因素的似然率)。
运用全概率公式计算事件“从仓库中任取一件产品是正品”的概率 P ( B ) P(B) P(B),实际上就是将各因素的先验概率序列 [ P ( A 1 ) , P ( A 2 ) , P ( A 3 ) ] [P(A_1), P(A_2), P(A_3)] [P(A1),P(A2),P(A3)]与似然率序列 [ P ( B ∣ A 1 ) , P ( B ∣ A 2 ) , P ( B ∣ A 3 ) ] [P(B|A_1), P(B|A_2), P(B|A_3)] [P(BA1),P(BA2),P(BA3)]逐元素相乘,然后求和而得:
P ( B ) = P ( A 1 ) P ( B ∣ A 1 ) + P ( A 2 ) P ( B ∣ A 2 ) + P ( A 3 ) P ( B ∣ A 3 ) = 1 2 ⋅ 9 10 + 3 10 ⋅ 14 15 + 1 5 ⋅ 19 20 = 23 / 25. P(B)=P(A_1)P(B|A_1)+P(A_2)P(B|A_2)+P(A_3)P(B|A_3)\\=\frac{1}{2}\cdot\frac{9}{10}+\frac{3}{10}\cdot\frac{14}{15}+\frac{1}{5}\cdot\frac{19}{20}=23/25. P(B)=P(A1)P(BA1)+P(A2)P(BA2)+P(A3)P(BA3)=21109+1031514+512019=23/25.
下列程序验算本例。

import numpy as np                          #导入numpyfrom sympy import Rational as R             #导入Rational类prioProb=np.array([R(1,2), R(3,10), R(1,5)])likelihood=np.array([R(9,10), R(14,15), R(19,20)])p=totalProb(prioProb, likelihood)print('P(B)=%s'%p)

第3、4行分别将 A 1 , A 2 , A 3 A_1,A_2,A_3 A1,A2,A3的先验概率序列 { 1 / 2 , 3 / 10 , 1 / 5 } \{1/2,3/10,1/5\} {

1/2,3/10,1/5}和对 B B B的似然度序列 { 9 / 10 , 14 / 15 , 19 / 20 } \{9/10,14/15,19/20\} {
9/10,14/15,19/20}
分别设置为numpy(第1行导入)的array类数组prioProbs和likelihood。第5行调用函数totalProb,传递参数prioProb和likelihood,返回值赋予p。第7行输出计算结果:

P(B)=23/25

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

转载地址:http://fhpmz.baihongyu.com/

你可能感兴趣的文章