朴素贝叶斯算法

介绍

朴素贝叶斯分类器是一种基于概率的分类方法,它利用贝叶斯定理来预测某个样本属于哪个类别。它的“朴素”之处在于假设特征之间相互独立,这意味着每个特征对于分类的贡献是相互独立的。

公式

贝叶斯公式如下:

朴素贝叶斯基于贝叶斯公式得出:

  • p(x_{1}x_{2}...x_{n})是给定特征 x_{1}x_{2}...x_{n}​ 下类别 y 的概率。
  • p(y) 是类别 y 的先验概率。
  • p(x_{1}x_{2}...x_{n}|y)是在类别 y 下特征 x_{1}x_{2}...x_{n} 的条件概率。
  • p(x_{1}x_{2}...x_{n}) 是特征 x_{1}x_{2}...x_{n}​ 的先验概率。

由于对于所有的特征 𝑥x_{1}x_{2}...x_{n}p(x_{1}x_{2}...x_{n})在给定类别 y 的条件下是常数,因此朴素贝叶斯分类器可以简化为:

p(y|x_{1}x_{2}...x_{n})p(y)p(x_{1}|y)p(x_{2}|y)⋅...⋅p(x_{n}|y)

先验概率

先验概率指根据以往经验和分析。在实验或采样前就可以得到的概率。

后验概率

后验概率指某件事已经发生,想要计算这件事发生的原因是由某个因素引起的概率。

例子

给定一个文档数据集:

现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?

此时出现了概率0,而实际情况不为0,则需要解决

拉普拉斯平滑:

α为指定的拉普拉斯平滑系数,一般为1,m为训练文档中的统计出的特征词个数。

运用拉普拉斯平滑处理后:

这样处理完之后结果就不会为0,更符合实际情况,同样另一个也需要这样的处理。

代码

import numpy as np
class NB:
    def __init__(self,data,label):
        self.data=data
        self.label=label
        self.VocaList=self.get_VocaList()
        self.p=len(self.VocaList) #单词表长度
        self.n=len(data) #样本数据个数
        self.pClass,self.pCondition=self.train()
    def get_VocaList(self):
        VocalList=set()
        for i in self.data:
            VocalList=VocalList | set(i) #求单词集合并集
        return list(VocalList)
    def get_WordsVec(self,words):
        '''构建文档向量'''
        Words_Vec=np.ones(shape=self.p)
        for word in words:
            if word in self.VocaList:
                Words_Vec[self.VocaList.index(word)] +=1 #词袋模型
                #Words_Vec[self.VocaList.index(word)] =1 #词集模型
        return Words_Vec
    def train(self):
        pClass={} #各类概率P(c)
        numWords={} #各类数据某单词数
        pCondition={} #各个单词的类条件概率
        for i in range(self.n):
            if self.label[i] not in pClass:
                pClass[label[i]]=0
                numWords[label[i]]=np.zeros(shape=self.p)
            pClass[label[i]]+=1/(self.n)
            numWords[label[i]]+=self.get_WordsVec(words=self.data[i])
        for key in pClass.keys():
            pCondition[key]=numWords[key]/(2+np.sum(numWords[key]))
        return pClass,pCondition
    def predict(self,words):
        '''预测文档words属于哪一类'''
        v=self.get_WordsVec(words=words)
        p={}
        for key in self.pClass.keys():
            p[key]=np.sum(np.log(self.pCondition[key])*v)+np.log(self.pClass[key])
        pmax=max(p.values())
        for key,value in p.items():
            if value==pmax:
                return key
if __name__=='__main__':
    txt=['it is a lovely rabbit',
         'This Dog is a pet',
         'I like singing',
         'He is singing',
         'The rabbit and dog are pet',
         'The song is very nice',
         'This mathematical problem is very difficult',
         'I like study',
         'I like math and can solve mathematical problems very well',
         'Have you heard this song']
    label=['pet','pet','music','music','pet','music','study','study','study','music']
    data=[]
    for i in txt:
        data.append(i.split())
    nb=NB(data=data,label=label)
    nb.train()
    c=nb.predict(words=['it','is','a','pet'])
    c1=nb.predict(words=['I','like','math'])
    print(c,c1)

最终运行结果c为pet类,c1为study类,结果较为准确。

总结

朴素贝叶斯作为一种基于概率的分类方法,其应用是十分广泛的,并且大多数情况下分类预测效果较好,训练速度较快。针对贝叶斯决策问题中P(x|c)不易求解的问题,该方法采用了属性条件独立性假设,但是现实情况下这种假设难以成立,所以针对该问题后面又有了半朴素贝叶斯等方法的出现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值