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