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(B∣A1),P(B∣A2),⋯,P(B∣An),這兩個序列是等長(所含元素個數相同)的。序列對應元素積之和 ∑ i = 1 n P ( A i ) P ( B ∣ A i ) \sum\limits_{i=1}^nP(A_i)P(B|A_i) i=1∑nP(Ai)P(B∣Ai),即為用全機率公式計算的事件 B B B的機率 P ( B ) P(B) P(B)。Python的numpy包提供的數組array類的兩個等長(所含元素個數相同)對象之間就支援這樣的“按元素”運算:對應元素分别計算,得到一個新的數組(如圖所示)。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLyUzN0QTN0ATMyATNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
運算包括常見的加+、減-、乘*、除/、幂**以及各種函數計算。例如以下代碼示例了等長數組間的四則運算:
import numpy as np
x=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(B∣A1)=9/10, P ( B ∣ A 2 ) = 14 / 15 P(B|A_2)=14/15 P(B∣A2)=14/15及 P ( B ∣ A 3 ) = 19 / 20 P(B|A_3)=19/20 P(B∣A3)=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(B∣A1),P(B∣A2),P(B∣A3)]逐元素相乘,然後求和而得:
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(B∣A1)+P(A2)P(B∣A2)+P(A3)P(B∣A3)=21⋅109+103⋅1514+51⋅2019=23/25.
下列程式驗算本例。
import numpy as np #導入numpy
from 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行輸出計算結果:
寫博不易,敬請支援:
如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支援!
傳回《導引》