zoukankan      html  css  js  c++  java
  • 朴素贝叶斯分类器

    朴素贝叶斯分类器

    一、贝叶斯定理

    (1)条件概率:

      P(A|B)表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:

    (2)贝叶斯公式:

      P(B|A)是根据A参数值判断其属于类别B的概率,称为后验概率。P(B)是直接判断某个样本属于B的概率,称为先验概率。P(A|B)是在类别B中观测到A的概率,P(A)是在数据库中观测到A的概率。

    PS:先验概率:由以往的数据分析得到的概率,叫做先验概率。

      后验概率:在得到信息之后再重新加以修正的概率。

    二、关于贝叶斯分类

      对于贝叶斯网络分类器:

      1、设为一个待分类项,而每个a为x的一个特征属性。

      2、有类别集合

      3、计算

      4、如果,则xεyk。

    那么现在的关键就是如何计算第3步中的各个条件概率。可以这么做:

    1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

    2、统计得到在各类别下各个特征属性的条件概率估计。即

    3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

    因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为假设各特征属性是条件独立的,所以有:

    基于贝叶斯定理的贝叶斯算法是一类简单常用的分类算法,有严谨的数学理论做支撑。再假设待分类项的各个属性相互独立的情况下,构造出来的分类算法就称为朴素的,即朴素贝叶斯算法。

    基本思想:对于给定的待分类项,求解在此项出现的条件下各个类别yi出现的概率,哪个P(yi|X)最大,就把此待分类项归属于哪个类别。

     

    根据上述分析,朴素贝叶斯分类的流程可以由下图表示(暂时不考虑验证):

      可以看到,整个朴素贝叶斯分类分为三个阶段:

      第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

      第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

      第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

    三、特征属性为连续值的条件概率及Laplace校准

      由上文看出,计算各个划分的条件概率P(a|y)是朴素贝叶斯分类的关键性步骤,当特征属性为离散值时,只要很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),下面重点讨论特征属性是连续值的情况。

      当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。

    即:

      

      

      因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。均值与标准差的计算在此不再赘述。

      另一个需要讨论的问题就是当P(a|y)=0时怎么办,当某个类别下某个特征项划分没有出现时,就会产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。

    四、朴素贝叶斯分类实例

      下面讨论一个使用朴素贝叶斯分类解决实际问题的例子:检测SNS社区不真实账号;为了简单起见,对例子中的数据做了适当的简化。

      这个问题是这样的,对于SNS社区来说,,不真实账号(使用虚假身份或用户的小号)是一个普遍存在的问题,作为SNS社区的运营商,希望可以检测出这些不真实账号,从而在一些运营分析报告中避免这些账号的干扰,亦可以加强对SNS社区的了解与监管。

      如果通过纯人工检测,需要耗费大量的人力,效率也十分低下,如能引入自动检测机制,必将大大提升工作效率。这个问题说白了,就是要将社区中所有账号在真实账号和不真实账号两个类别上进行分类,下面我们一步一步实现这个过程。

      首先设C=0,表示真实账号,C=1表示不真实账号。

      1、确定特征属性及划分

      这一步要找出可以帮助我们区分真实账号与不真实账号的特征属性,在实际应用中,特征属性的数量是很多的,划分也会比较细致,但这里为了简单起见,我们用少量的特征属性以及较粗的划分,并对数据做了修改。

       我们选择三个特征属性:a1:日志数量/注册天数(比值),a2:好友数量/注册天数(比值),a3:是否使用真实头像。在SNS社区中这三项都是可以直接从数据库里得到或计算出来的。

       下面给出划分:a1:{a<=0.05, 0.05<a<0.2, a>=0.2},a1:{a<=0.1, 0.1<a<0.8, a>=0.8},a3:{a=0(不是),a=1(是)}。

      2、获取训练样本

       这里使用运维人员曾经人工检测过的1万个账号作为训练样本。

      3、计算训练样本中每个类别的频率

       用训练样本中真实账号和不真实账号数量分别除以一万,得到:

      

      4、计算每个类别条件下各个特征属性划分的频率

      5、使用分类器进行鉴别

      下面我们使用上面训练得到的分类器鉴别一个账号,这个账号使用非真实头像,日志数量与注册天数的比率为0.1,好友数与注册天数的比率为0.2。

      可以看到,虽然这个用户没有使用真实头像,但是通过分类器的鉴别,更倾向于将此账号归入真实账号类别。这个例子也展示了当特征属性充分多时,朴素贝叶斯分类对个别属性的抗干扰性。

    四、分类器的评价

      首先要定义,分类器的正确率指分类器正确分类的项目占所有被分类项目的比率。

      通常使用回归测试来评估分类器的准确率,最简单的方法是用构造完成的分类器对训练数据进行分类,然后根据结果给出正确率评估。但这不是一个好方法,因为使用训练数据作为检测数据有可能因为过分拟合而导致结果过于乐观,所以一种更好的方法是在构造初期将训练数据一分为二,用一部分构造分类器,然后用另一部分检测分类器的准确率。

      

  • 相关阅读:
    软件工程第十四周学习进度条
    软件工程第十五周学习进度条
    课堂练习-买书价格最低
    找水王2
    Struts结合马士兵视频的学习经验
    Spring结合马士兵视频的学习经验
    浅谈 《大型网站技术架构》 五六七章
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    浅谈架构漫谈
    软件架构设计师工作流程
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5453813.html
Copyright © 2011-2022 走看看