美文网首页
朴素贝叶斯与Python

朴素贝叶斯与Python

作者: ghostdogss | 来源:发表于2018-11-08 17:23 被阅读0次

    一、贝叶斯算法引入

          朴素贝叶斯算法是基于贝叶斯定理和特征条件独立假设的分类法,是一种基于概率分布的分类算法。

          贝叶斯分类算法,通俗的来讲,在给定数据集的前提下,对于一个新样本(未分类),在数据集中找到和新样本特征相同的样本,最后根据这些样本算出每个类的概率,概率最高的类即为新样本的类。

           哈哈,先用个样例来大体感受下。

           这里有大学生恋爱情况的数据集,见下表:

            首先要注意的是,贝叶斯算法的特征都是离散值,如果是连续值,得先对连续值进行离散化处理。对于这个数据集,我们有三个特征,即性别、专业和身高,恋爱情况为类别,1代表谈恋爱了,0代表还是single dog。

            若我们现在有了一个新样本,特征为(男,计算机技术,高),那怎么用贝叶斯算法来判断这个样本的类呢,首先,我们要在数据集中找出和这个新样本特征相同的样本,即下图的红色部分:

          然后,根据恋爱情况所有的类别(即0,1),计算在这些特征下每个类别的概率,概率最高的类即为新样本的类别。

          在这里先不进行计算操作,由表可以大体看出,在(男,计算机技术,高)这特征下,恋爱情况为1的概率更大,即新样本的类别为1。

    二、贝叶斯算法思想及其原理

          通过前文我们知道,贝叶斯算法是依据概率来进行分类的,通过我们直观的感觉,对于特定的样本,哪个类概率大,我们就选谁。

          那么这么做是以什么为科学依据?为什么这么做会预测的效果最好?下面,我们先来说说贝叶斯的思想。

    假设每个样本用一个n维特征向量X={x1,x2,…,xn}来表示,描述属性为A1、A2、…、An(Ai之间相互独立)。类别属性为C,假设样本中共有m个类即C1、C2、…、Cm,如下图所示

          给定一个未知类别的样本X,朴素贝叶斯分类将预测X属于具有最高后验概率P(Ci|X)的类,也就是说,将X分配给类Ci,当且仅当:

      P(Ci|X)>P(Cj|X),1≤j≤m,i≠j

         根据贝叶斯定理有:

         由于P(X)对于所有类为常数,只需要最大化P(X|Ci)P(Ci)即可。而:

         所以对于某个样本(a1,a2,…,an),它所在类别为:

          思想简单易懂,在没有给出精确率召回率等评测标准前,还是无法让人信服,那么接下来,我们给出贝叶斯算法的数学推到。

          朴素贝叶斯算法将实例分到后验概率最大的类中,这就等价于期望风险最小化。假设我们研究的是二分类问题,选择0-1损失函数。即:

         公式中f(X)是分类决策函数,这时期望风险函数为:

          我们知道,要想得到的结果最好,我们要做的就是将期望风险函数降到最低。好了,我们接下来要做的就是细节化风险函数,得出最优解。

          我们知道,期望是对联合分布P(X,Y)取的,由此取条件期望为:

          接着,对X=x进行逐个极小化,就可使期望最小,由此接着推:

         到此,我们就得到了朴素贝叶斯算法的后验概率最大化准则,即:

    三、代码实现

    #二分类朴素贝克斯分类器训练函数

    def trainNB0(trainMatrix,trainCategory):    #trainMatrix为输入参数的文档矩阵,trainCategory为class标签

        numTrainDocs = len(trainMatrix) #数据集中样本的数量

        numWords = len(trainMatrix[0])  #数据集中特征的数量

        pAbusive = sum(trainCategory) / float(numTrainDocs) #计算class为1的概率

        #初始化概率

        p0Num = zeros(numWords)    #初始化class为0的特征

        p1Num = zeros(numWords)    #初始化class为1的特征

        p0Denmo = 0.0

        p1Denmo = 0.0

        for i in range(numTrainDocs):

            if trainCategory[i] == 1:

                p1Num += trainMatrix[i]

                p1Denmo += sum(trainMatrix[i])

            else:

                p0Num += trainMatrix[i]

                p0Denmo += sum(trainMatrix[i])

        p1Vect = p1Num/p1Denmo

        p0Vect = p0Num/p0Denmo

        return p0Vect,p1Vect,pAbusive

    #构建朴素贝叶斯分类函数

    def classifyNB(vec2Classify,p0Vec,p1Vec,PClass1):

        p1 = sum(vec2Classify * p1Vec) + log(PClass1)

        p0 = sum(vec2Classify * p0Vec) + log(1.0 - PClass1)

        if p1 > p0 :

            return 1

        else:

            return 0

    ---------------------

    作者:lonely_square_three

    来源:CSDN

    原文:https://blog.csdn.net/xzfreewind/article/details/74012311

    相关文章

      网友评论

          本文标题:朴素贝叶斯与Python

          本文链接:https://www.haomeiwen.com/subject/sjnwxqtx.html