朴素贝叶斯与Python

一、贝叶斯算法引入

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

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

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

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

        首先要注意的是,贝叶斯算法的特征都是离散值,如果是连续值,得先对连续值进行离散化处理。对于这个数据集,我们有三个特征,即性别、专业和身高,恋爱情况为类别,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)