zoukankan      html  css  js  c++  java
  • 朴素贝叶斯分类算法(2)

    转自:http://blog.163.com/jiayouweijiewj@126/blog/static/1712321772010102802635243/

    琢 磨了两天,对于朴素贝叶斯的原理弄得很清楚,可是要做文本分类,看了好多文章知道基于朴素贝叶斯公式,比较出后验概率的最大值来进行分类,后验概率的计算 是由先验概率与类条件概率的乘积得出,先验概率和类条件概率要通过训练数据集得出,即为朴素贝叶斯分类模型,将其保存为中间结果,测试文档进行分类时调用 这个中间结果得出后验概率。大的思路理解的很清楚,可是中间的细节可以说很重要的部分没弄明白,中间得出的模型怎样和新的要分类的文档联系起来?训练集得 出的条件概率和先验概率怎么运用到测试文档上?又仔细看了几篇文章,将以前看过的在脑子里整理了下,总算弄明白是怎么回事了,赶紧记录下来以备查询,其中 的例子是从我从一篇我认为写得比较详细的文章中粘过来的,一看就懂。

    1、基本定义:

    分类是把一个事物分到某个类别中。一个事物具有很多属性,把它的众多属性看作一个向量,即x=(x1,x2,x3,…,xn),用x这个向量来代表这个事物,x的集合记为X,称为属性集。类别也有很多种,用集合C={c1,c2,…cm}表示。一般XC的关系是不确定的,可以将XC看作是随机变量,P(C|X)称为C的后验概率,与之相对的,P(C)称为C的先验概率。

    根据贝叶斯公式,后验概率P(C|X)=P(X|C)P(C)/P(X),但在比较不同C值的后验概率时,分母P(X)总是常数,忽略掉,后验概率P(C|X)=P(X|C)P(C),先验概率P(C)可以通过计算训练集中属于每一个类的训练样本所占的比例,容易估计,对类条件概率P(X|C)的估计,这里我只说朴素贝叶斯分类器方法,因为朴素贝叶斯假设事物属性之间相互条件独立,P(X|C)=∏P(xi|ci)。

    2、文本分类过程

    例如文档:Good good study Day day up可以用一个文本特征向量来表示,x=(Good, good, study, Day, day , up)。在文本分类中,假设我们有一个文档dX,类别c又称为标签。我们把一堆打了标签的文档集合<d,c>作为训练样本,<d,c>X×C。例如:<d,c>={Beijing joins the World Trade Organization, China}对于这个只有一句话的文档,我们把它归类到 China,即打上china标签。

    朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)即为词频型和伯努利模型(Bernoulli model)即文档型。二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在d中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为反方参与的。这里暂不考虑特征抽取、为避免消除测试文档时类条件概率中有为0现象而做的取对数等问题。

    2.1多项式模型

    1)基本原理

    在多项式模型中,设某文档d=(t1,t2,…,tk)tk是该文档中出现过的单词,允许重复,则

    先验概率P(c)= c下单词总数/整个训练样本的单词总数

    类条件概率P(tk|c)=(c下单词tk在各个文档中出现过的次数之和+1)/(c下单词总数+|V|)

    V是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。 P(tk|c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)

    2)举例

    给定一组分好类的文本训练数据,如下:

    docId

    doc

    类别

    In c=China?

    1

    Chinese Beijing Chinese

    yes

    2

    Chinese Chinese Shanghai

    yes

    3

    Chinese Macao

    yes

    4

    Tokyo Japan Chinese

    no

    给定一个新样本Chinese Chinese Chinese Tokyo Japan,对其进行分类。该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan),类别集合为Y={yes, no}

    yes下总共有8个单词,类no下总共有3个单词,训练样本单词总数为11,因此P(yes)=8/11, P(no)=3/11。类条件概率计算如下:

    P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7

    P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/14

    P(Chinese|no)=(1+1)/(3+6)=2/9

    P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9

    分母中的8,是指yes类别下textc的长度,也即训练样本的单词总数,6是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 6个单词,3是指no类下共有3个单词。

    有了以上类条件概率,开始计算后验概率:

    P(yes | d)=(3/7)3×1/14×1/14×8/11=108/184877≈0.00058417

    P(no | d)= (2/9)3×2/9×2/9×3/11=32/216513≈0.00014780

    比较大小,即可知道这个文档属于类别china

    2.2伯努利模型

    1)基本原理

    P(c)= c下文件总数/整个训练样本的文件总数

    P(tk|c)=(c下包含单词tk的文件数+1)/(c下单词总数+2)

    2)举例

    使用前面例子中的数据,模型换成伯努利模型。

    yes下总共有3个文件,类no下有1个文件,训练样本文件总数为11,因此P(yes)=3/4, P(Chinese | yes)=(3+1)/(3+2)=4/5,条件概率如下:

    P(Japan | yes)=P(Tokyo | yes)=(0+1)/(3+2)=1/5

    P(Beijing | yes)= P(Macao|yes)= P(Shanghai |yes)=(1+1)/(3+2)=2/5

    P(Chinese|no)=(1+1)/(1+2)=2/3

    P(Japan|no)=P(Tokyo| no) =(1+1)/(1+2)=2/3

    P(Beijing| no)= P(Macao| no)= P(Shanghai | no)=(0+1)/(1+2)=1/3

    有了以上类条件概率,开始计算后验概率,

    P(yes|d)=P(yes)×P(Chinese|yes)×P(Japan|yes)×P(Tokyo|yes)×(1-P(Beijing|yes))×(1-P(Shanghai|yes))×(1-P(Macao|yes))=3/4×4/5×1/5×1/5×(1-2/5) ×(1-2/5)×(1-2/5)=81/15625≈0.005

    P(no|d)= 1/4×2/3×2/3×2/3×(1-1/3)×(1-1/3)×(1-1/3)=16/729≈0.022

    因此,这个文档不属于类别china

    后记:文本分类是作为离散型数据的,以前糊涂是把连续型与离散型弄混一块了,朴素贝叶斯用于很多方面,数据就会有连续和离散的,连续型时可用正态分布,还可用区间,将数据的各属性分成几个区间段进行概率计算,测试时看其属性的值在哪个区间就用哪个条件概率。再有TF、TDIDF,这些只是描述事物属性时的不同计算方法,例如文本分类时,可以用单词在本文档中出现的次数描述一个文档,可以用出现还是没出现即0和1来描述,还可以用单词在本类文档中出现的次数与这个单词在剩余类出现的次数(降低此属性对某类的重要性)相结合来表述。

  • 相关阅读:
    Android 开发学习进程0.19 webview 的使用
    2020年4到6月—7家公司面试总结(3家已拿offer)
    iOS今日头条第3轮面试回忆
    [搬运]Dart之枚举中使用扩展
    Proguard 常用规则
    shiro安全框架
    Android服务的AIDL跨进程(程序)操作
    Android——服务的实例,银行服务
    Android四大组件之服务————服务的生命周期和启动方式
    Android 程序间的广播和Manifest找不到(解决方法)
  • 原文地址:https://www.cnblogs.com/lysuns/p/4635026.html
Copyright © 2011-2022 走看看