用Python實現貝葉斯定理

寫作說明

上一期我們講了貝葉斯分類器,其中有很多的概率基礎知識和貝葉斯定理。但是講解的很沒有重點,前半部分講的是貝葉斯基礎知識,最後很突兀的插進來一個文本分析-貝葉斯分類器。很多童鞋看到很累。其實上一期和本期都想附上《貝葉斯思維:統計建模的Python學習法》書中的代碼,但我看了下源碼,發現代碼太長了信息量太大,不是我一篇文章就能展示的明白的。

今天我就早起翻看這本書,根據書上的講解和自己的理解,用Python實現的一個簡單的貝葉斯的腳本。本文只是用來驗證自己貝葉斯定理是否理解,是否能自己動手實現,本身這腳本並沒有什麼高大上的功能,如果有的話,唯一的功能就是能用來做貝葉斯數學題O(∩_∩)O哈哈~。

曲奇餅案例

假設有兩碗曲奇餅,碗A包含30個香草曲奇餅和10個巧克力曲奇餅,碗B這兩種曲奇餅各20個。 現在假設你在不看的情況下隨機地挑一個碗拿一塊餅,得到了一塊香草曲奇餅。

問題:從碗A渠道香草曲奇餅的概率是多少

思路

這是一個條件概率問題,我們希望得到P(碗A|香草餅)

現在我們很容易知道P(香草餅|碗A)=3/4

如果將兩者聯繫起來,那麼P(碗A|香草餅)就很容易算得。

但可惜P(碗A|香草餅)P(香草餅|碗A)是不同的。

但貝葉斯定理可以通過一個概率得到另一個概率。

貝葉斯定理

聯合概率可交換,即 P(A and B)=P(B and A)

對於任意事件A、B都獨立,因此聯合概率P(A and B)=P(B)P(A|B)

兩步驟執行交換,即P(B and A)=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方法:返回某一事件的概率

好了,有了前面的鋪墊,可以附上我的代碼

class Bayes(object): def __init__(self): self._container = dict() def Set(self,hypothis,prob): self._container[hypothis]=prob def Mult(self,hypothis,prob): old_prob = self._container[hypothis] self._container[hypothis] = old_prob*prob def Normalize(self): count = 0 for hypothis in self._container.values(): count=count+hypothis for hypothis,prob in self._container.items(): self._container[hypothis]=self._container[hypothis]/count def Prob(self,hypothis): Prob = self._container[hypothis] return Prob

用python解下曲奇餅題

#實例化Bayes類bayes = Bayes()#先驗概率bayes.Set("Bow_A",0.5) #P(碗A)=1/2bayes.Set("Bow_B",0.5) #P(碗B)=1/2#後驗概率bayes.Mult("Bow_A",0.75) #P(香草餅|碗A)=3/4bayes.Mult("Bow_B",0.5) #P(香草餅|碗B)=1/2bayes.Normalize()prob = bayes.Prob("Bow_A")#P(碗A|香草餅)print("從碗A渠道香草曲奇餅的概率:{}".format(prob))

運行結果:

從碗A渠道香草曲奇餅的概率:0.6

更多內容

文本分析

python居然有情感??真的嗎??

文本分析之網路關係

中文分詞-jieba庫知識大全自然語言處理庫之snowNLP用gensim庫做文本相似性分析基於共現發現人物關係的python實現

用python計算兩文檔相似度

簡單的中文分詞演算法

文本分類-貝葉斯分類器

數據分析

酷炫的matplotlib

文本分析之網路關係

pandas庫讀取csv文件

如何對csv文件中的文本數據進行分析處理用詞雲圖解讀「於歡案」

神奇的python

初識Python的GUI編程Python實現文字轉語音功能憐香惜玉,我用python幫助辦公室文秘

逆天的量化交易分析庫-tushare

開扒皮自己微信的秘密

8行代碼實現微信聊天機器人

使用Python登錄QQ郵箱發送QQ郵件

爬蟲

爬蟲實戰視頻專輯抓取單博主的所有微博及其評論【視頻】手把手教你抓美女~

當爬蟲遭遇驗證碼,怎麼辦【視頻】於歡案之網民的意見(1)?selenium驅動器配置詳解【視頻】有了selenium,小白也可以自豪的說:「去TMD的抓包、cookie」

【視頻】快來get新技能--抓包+cookie,爬微博不再是夢

【視頻教程】用python批量抓取簡書用戶信息

爬豆瓣電影名的小案例(附視頻操作)

爬豆瓣電影名的小案例2(附視頻操作)用Python抓取百度地圖裡的店名,地址和聯繫方式蒙了,這一長串鬼文是什麼鬼
推薦閱讀:

跟黃哥學習python第二章
可能是最全面的75個Python爬蟲資源
爬蟲入門到精通-mongodb的基本使用
[18] Python元組
一步一步教你用Python畫出專業的K線圖

TAG:Python | Python入门 | 贝叶斯统计 |