朴素贝叶斯的理解

最近在学习贝叶斯分类器,看着公式头大,记一下自己的理解。
在讲贝叶斯之前,要把条件概率公式和全概率公式简单回顾一下。

条件概率

在这里插入图片描述

条件概率本身没有什么需要讲的,但是它有一个很常用的变形,得到概率的乘法公式:
在这里插入图片描述
概率的乘法公式:
一个事件发生的概率等于造成这件事发生的所有事件概率的乘积,如果甲和乙同时发生,那么就让其中一个发生,另一件随后发生,这样两件事就同时发生了。
下面写出概率乘法公式的n个事件的形式:
在这里插入图片描述
每个发生的事件,都要成为下一个事件发生的条件之一。

全概率公式

在这里插入图片描述
全概率公式:
在这里插入图片描述
例如一个事情的结果有三种A1,A2,A3,也能知道概率,但是这时有一个事件B发生了,现在的目的是通过A得到B发生概率,让B和A发生联系,从而进行试验,得到条件概率P(B/A1),P(B/A2),P(B/A3),这样就得到了B发生的概率:
在这里插入图片描述
下面这样图就更清晰了:
在这里插入图片描述

贝叶斯公式

贝叶斯公式的核心是使用现有的优先能得到的数据去调优一个未知事件的概率,使其接近于真实值。
在这里插入图片描述
P(A/B)-----称为后验概率
P(A)-------称为先验概率
P(B/A)/P(B)-----调整因子
关于先验概率和后验概率的理解:
假设一个概率未知事件的主观概率因为另一个新事件的发生而发生改变,那么改变之前的称为先验概率,改变之后的称为后验概率。

案例

来自一个github项目
根据人名猜测性别:

解决方法:贝叶斯定理
重要假设:名字各个字之间相互独立
在这里插入图片描述

def py2compat(name):
    try:
        name = name.decode('utf-8')
    except:
        pass
    return name

class Gusser(object):
    def __init__(self):
        self._load_model()
        
    def _load_model(self):
        self.male_total = 0
        self.female_total = 0
        self.freq = {}
        with open('charfreq.csv','rb') as f:  
            next(f)                                        # 返回 f 的下一行
            for line in f:
                line = line.decode('utf-8')
                char,male,female = line.split(',')
                char = py2compat(char)
                self.male_total += int(male)               # 男人数累加每一个‘字’
                self.female_total += int(female)           # 女人数累加每一个‘字’
                self.freq[char] = (int(female),int(male))  # 返回一个字典 {‘字’:(有这个字男人数,有这个字的女人数)}
        self.total = self.male_total + self.female_total
        
        for char in self.freq:
            female,male = self.freq[char]
            
           # 改变freq这个字典 为  {‘字’:(男人中出现这个的频率,女人中出现这个字的频率)}
            self.freq[char] = (1.* female / self.female_total
                               , 1.* male / self.male_total)
            
    def prob_for_gender(self,firstname,gender = 0):
        """"""
        p = 1. * self.female_total / self.total \
            if gender == 0 \
            else 1.* self.male_total / self.total
        
        for char in firstname:
            p *= self.freq.get(char)[gender]
        return p
    
    def guss(self,name):
        name = py2compat(name)
        firstname = name[1:]
        for char in firstname:
             assert u'\u4e00' <= char <= u'\u9fa0', u'姓名必须为中文'
                
        pf = self.prob_for_gender(firstname,0)
        pm = self.prob_for_gender(firstname,1)
        
        if pm > pf:
            return ('male',1.* pm / (pm + pf))
        elif pm < pf:
            return ('female',1.* pf/(pm + pf))
        else:
            return ('unknow',0)
        
gusser = Gusser()
gusser.guss('嬴政')
    
('male', 0.9341976700488538)

本文部分搬运自:https://zhuanlan.zhihu.com/p/134036707

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页