python计算条件概率_用Python实现贝叶斯定理(附代码)
寫作說明
上一期我們講了貝葉斯分類器,其中有很多的概率基礎知識和貝葉斯定理。但是講解的很沒有重點,前半部分講的是貝葉斯基礎知識,最后很突兀的插進來一個文本分析-貝葉斯分類器。很多童鞋看到很累。其實上一期和本期都想附上《貝葉斯思維:統計建模的Python學習法》書中的代碼,但我看了下源碼,發現代碼太長了信息量太大,不是我一篇文章就能展示的明白的。
今天我就早起翻看這本書,根據書上的講解和自己的理解,用Python實現的一個簡單的貝葉斯的腳本。本文只是用來驗證自己貝葉斯定理是否理解,是否能自己動手實現,本身這腳本并沒有什么高大上的功能,如果有的話,唯一的功能就是能用來做貝葉斯數學題O(∩_∩)O哈哈~。
曲奇餅案例
假設有兩碗曲奇餅,碗A包含30個香草曲奇餅和10個巧克力曲奇餅,碗B這兩種曲奇餅各20個。 現在假設你在不看的情況下隨機地挑一個碗拿一塊餅,得到了一塊香草曲奇餅。
問題:從碗A渠道香草曲奇餅的概率是多少
思路
這是一個條件概率問題,我們希望得到P(碗A|香草餅),
現在我們很容易知道P(香草餅|碗A)=3/4,
如果將兩者聯系起來,那么P(碗A|香草餅)就很容易算得。
但可惜P(碗A|香草餅)與P(香草餅|碗A)是不同的。
不過貝葉斯定理卻可以通過一個概率得到另一個概率。
貝葉斯定理
聯合概率可交換,即P(AandB)=P(BandA)
對于任意事件A、B都獨立,因此聯合概率P(AandB)=P(B)P(A|B)
兩步驟執行交換,即P(BandA)=P(A)P(B|A)
因為步驟1等式,有如下等式成立P(B)P(A|B)=P(A)P(B|A)
最后等式兩端除以P(B),得到P(A|B)=P(A)P(B|A)/P(B)
這就是貝葉斯定理,推導過程比中學時要簡單很多。先來計算下曲奇餅問題
本題數學的計算過程
P(碗A|香草餅)=P(碗A)*P(香草餅|碗A)/P(香草餅)
P(碗A)=1/2
P(香草餅|碗A)=3/4
P(香草餅)=50/(50+30)=5/8
所以最后經過計算
P(碗A|香草餅)=3/5=0.6
先驗概率、后驗概率、似然度、標準化常量
我覺得在python實現代碼前最好大家能夠記住先驗概率、后驗概率這些概念(如果能理解更好)。 對上述貝葉斯定理的理解,還有一種解釋思路,叫做“歷時詮釋”。“歷時”意味著某些事情隨著時間而發生,即假設的概率隨著看到新數據而發生變化。
在考慮H(Hypothsis)和D(Data)情況下,貝葉斯定理的表達式可以寫成:
P(H|D)=P(H)P(D|H)/P(D)
在考慮H和D的情況下,每項意義如下:
P(H)稱為先驗概率,即在得到新數據前某一假設的概率。如沒有得到擲硬幣結果前,我們先假設正反面概率各位50%。
P(H|D)稱為后驗概率,即看到新數據后,我們要計算的該假設的概率。
P(D|H)是該假設下得到這一數據的概率,稱為似然度。
P(D)是任何假設下得到這一數據的概率,稱為標準化常量。
本題目Python的實現分析
了解了前面的鋪墊,現在好辦了。希望大家沒有看暈,都能堅持到現在。
首先定義Bayes類,初始化創建一個dict類型的容器container。該容器是為了儲存貝葉斯各項信息。key鍵存儲假設,value值存儲概率
Set方法是給容器添加先驗假設及先驗概率
Mult方法:根據key查找到先驗概率,并更新概率。
Normalize方法:歸一化(建議大家等會運行代碼時候看下有無Normalize的區別,就能理解歸一化這一含義)
Prob方法:返回某一事件的概率
好了,有了前面的鋪墊,可以附上我的代碼
classBayes(object):
def__init__(self):
self._container=dict()
defSet(self,hypothis,prob):
self._container[hypothis]=prob
defMult(self,hypothis,prob):
old_prob=self._container[hypothis]
self._container[hypothis]=old_prob*prob
defNormalize(self):
count=0
forhypothisinself._container.values():
count=count+hypothis
forhypothis,probinself._container.items():
self._container[hypothis]=self._container[hypothis]/count
defProb(self,hypothis):
Prob=self._container[hypothis]
returnProb
用python解下曲奇餅題
#實例化Bayes類
bayes=Bayes()
#先驗概率
bayes.Set('Bow_A',0.5)#P(碗A)=1/2
bayes.Set('Bow_B',0.5)#P(碗B)=1/2
#后驗概率
bayes.Mult('Bow_A',0.75)#P(香草餅|碗A)=3/4
bayes.Mult('Bow_B',0.5)#P(香草餅|碗B)=1/2
bayes.Normalize()
prob=bayes.Prob('Bow_A')#P(碗A|香草餅)
print('從碗A渠道香草曲奇餅的概率:{}'.format(prob))
運行結果
從碗A渠道香草曲奇餅的概率:0.6
更多內容
文本分析
數據分析
神奇的python
爬蟲
總結
以上是生活随笔為你收集整理的python计算条件概率_用Python实现贝叶斯定理(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么去年叫11T今年叫12 Turbo
- 下一篇: python 支持向量机预测结果相同_P