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(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/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

更多内容

文本分析中文分词-jieba库知识大全自然语言处理库之snowNLP用gensim库做文本相似性分析基于共现发现人物关系的python实现

用python计算两文档相似度文本分类-贝叶斯分类器

数据分析酷炫的matplotlib如何对csv文件中的文本数据进行分析处理用词云图解读“于欢案”

神奇的python初识Python的GUI编程Python实现文字转语音功能怜香惜玉,我用python帮助办公室文秘

开扒皮自己微信的秘密

8行代码实现微信聊天机器人

使用Python登录QQ邮箱发送QQ邮件

爬虫爬虫实战视频专辑抓取单博主的所有微博及其评论【视频】手把手教你抓美女~

当爬虫遭遇验证码,怎么办【视频】于欢案之网民的意见(1)?selenium驱动器配置详解【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

【视频教程】用python批量抓取简书用户信息

爬豆瓣电影名的小案例(附视频操作)

爬豆瓣电影名的小案例2(附视频操作)用Python抓取百度地图里的店名,地址和联系方式蒙了,这一长串鬼文是什么鬼

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贝叶斯定理是一种用于计算条件概率的数学定理,它基于先验概率和后验概率之间的关系。在概率论和统计学中,贝叶斯定理可以表示为: P(A|B) = (P(B|A) * P(A)) / P(B) 其中,P(A|B) 表示在事件 B 发生的条件下事件 A 发生的概率,P(B|A) 表示在事件 A 发生的条件下事件 B 发生的概率,P(A) 和 P(B) 分别表示事件 A 和事件 B 独立发生的概率。 在Python中,我们可以使用贝叶斯定理进行概率计算。有一些库可以帮助我们计算贝叶斯定理,如scipy和numpy。另外,还有一些专门用于贝叶斯推断的库,例如pymc3和stan。 以下是一个简单的例子,演示如何使用贝叶斯定理计算事件的概率: ```python def bayes_theorem(p_a, p_b_given_a, p_b): # 计算 P(A|B) p_a_given_b = (p_b_given_a * p_a) / p_b return p_a_given_b # 示例:假设有一个罐子里有30个苹果和20个橙子,从中随机抽取一个水果并判断是苹果或橙子。 # 假设苹果和橙子被随机选择的概率是相等的。 p_apple = 30 / 50 # P(A):苹果被选择的先验概率 p_orange = 20 / 50 # P(not A):橙子被选择的先验概率 p_apple_given_red = 25 / 35 # P(B|A):选择一个红色水果时选中苹果的条件概率 p_red = 35 / 50 # P(B):选择一个红色水果的概率 # 计算 P(apple|red) p_apple_given_red = bayes_theorem(p_apple, p_apple_given_red, p_red) print("P(apple|red) =", p_apple_given_red) ``` 这只是一个简单的例子,展示了如何使用贝叶斯定理进行概率计算。在实际应用中,贝叶斯定理可以用于各种领域,如机器学习、自然语言处理、图像处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值