朴素贝叶斯分类算法

之前有次考试考的是手工计算朴素贝叶斯的分类。当时没答对,后来搞明白了,不久又忘得差不多了。所以写个例子在这儿记一下。
先推导一下贝叶斯公式:
假定我们观察到两个事件都发生了,记做P(AB),那么我们既可以认为先发生了事件A,在此基础上又发生了事件B,也可以认为先发生了事件B,在此基础上又发生了事件A。所以这两个事件发生的概率,可以记做P(AB)=P(A|B)*P(B) 和 P(BA)=P(B|A)*P(A),其中P(A|B)、P(B|A)是条件概率,意思是在B事件的条件下又发生A的概率及在A事件的条件下又发生B的概率,那么显然P(AB)= P(BA),所以这两个公式合并就成了P(A|B)*P(B)=P(B|A)*P(A),再变形一下即得到P(A|B)=P(B|A)*P(A)/P(B)或者P(B|A)= P(A|B)*P(B)/P(A)。防止公式看花眼,只拿其中一个举例。

P(B|A)=P(A|B)*P(B)/P(A),观察等式两边,先不管P(A)和P(B),一边是P(B|A),一边是P(A|B),意味着如果我们知道了P(A)和P(B),那么就可以对两个条件概率进行互算。这正是朴素贝叶斯算法的理论基础——根据已有数据的概率预测新数据的概率,举个例子见表格:


观测项


类别(假定只有两类)


已有数据1


000


C1


已知P(观测项|类别)——可以算出各类别条件下某观测项的概率


已有数据2


001


C1


已有数据3


010


C1


已有数据4


011


C2


已有数据5


100


C1


已有数据6


101


C1


已有数据7


110


C2


… …


… …


… …


新数据


111



计算P(类别|观测项)——某观测项条件下各类别的概率,并选取最大概率那个类别作为“预测”结果

那再回到公式,P(A)和P(B)是否可知呢?当然是可知的,因为我们已有数据的数量是有限的,在这个数量中求某一观测项的概率或者某一类别的概率就是个简单的除法。而且并不需要计算P(A),我们只是要比较哪个类别的概率更大,分母相同,只计算分子,看哪个大就可以了。
以上表的7条已知数据为例:P(C1)=5/7;P(C2)=2/7;
P(000|C1)=1/5、P(001|C1)=1/5、P(010|C1)=1/5、P(011|C2)=1/2、P(100|C1)=1/5、P(101|C1)=1/5、P(110|C2)=1/2,这些都可以算出来。理想情况下我们要分别计算P(C1|111)和P(C2|111)的概率并比较二者大小。P(C1|111)= P(111|C1)*P(C1)/P(111);P(C2|111)= P(111|C2)*P(C2)/P(111),分母相同不去管,只计算并比较P(111|C1)*P(C1)和P(111|C2)*P(C2)。P(C1)、P(C2)有了,然而P(111|C1)和P(111|C2)都没有,等于0。说明这是一条从没出现过的“纯”新数据。这种情况其实是很常见的,但是0乘以任何数都是0,0和0怎么比较大小呢。所以应对这种情况,常用一种叫做Laplace平滑的方法,就是假设已知数据里每个类别下至少有一条这样的数据。看起来有些粗暴,但当数据量较大时几乎是不影响结果的正确性的。这样一来,P(C1|111)=P(111|C1)*P(C1)=1/6*5/7=0.12、P(C2|111)=P(111|C2)*P(C2)=1/3*2/7=0.09,0.12>0.09,以此推断111属于C1类。事实上我在设计上面的数据时改了好几次,因为数据量实在太小,即便+1也会对结果造成影响。这个完全的新数据111被预测为C1类,那么从逻辑上是否讲的通呢?只能说有一点儿,毕竟通过观察我们发现大部分(5/7)的数据都是C1类,那么来一条没有任何“迹象”的新数据我们也只能往可能性最大的类别里分。
在实际应用中,我们的观测项往往并非一项,也就是说,表格多半是这样的:


观测项1


观测项2


观测项3


类别


已有数据1


000



M


C1


已知P(观测项|类别)——可以算出各类别条件下某观测项的概率


已有数据2


001



A


C1


已有数据3


010



A


C1


已有数据4


011



M


C2


已有数据5


100



A


C1


已有数据6


101



A


C1


已有数据7


110



M


C2


… …


… …


… …


新数据


111



A



计算P(类别|观测项)——某观测项条件下各类别的概率,并选取最大概率那个类别作为“预测”结果

计算P(C1|111○A)和P(C2|111○A)需要用到P(111○A|C1)和P(111○A|C2),此时应用朴素贝叶斯算法,我们需要一个先决条件——各观测项相互独立、没有关联关系。因为如果相互独立,就可以把概率公式拆分成这样:P(111○A|C1)=P(111|C1)*P(○|C1)*P(A|C1),这样算起来会更容易,而且更少出现等于0的情况。
P(C1|111○A)= P(111○A|C1)*P(C1)= P(111|C1)*P(○|C1)*P(A|C1)*P(C1)=1/6*4/5*4/5*5/7=0.076
P(C2|111○A)= P(111○A|C2)*P(C2)= P(111|C2)*P(○|C2)*P(A|C2)*P(C2)=1/3*1/2*1/3*2/7=0.016
C1类比C2类概率大多了,自然预测为C1类。肉眼观察也能有这样感觉:虽然111没有在观测项1里出现过,但大部分○和大部分A都属于C1类,那么这条新数据属于C1类的可能性也很大。这就是三个观测项相互独立并共同作用于结果的情况。
实际类别是什么呢?那就没人知道了。其实我在设计第一个表格的时候预想的规则是这样的:只有连着两个1以上的数字是C2类,否则就是C1类。可见算法是很难猜测规则的,尤其训练数据量少的时候。我们只能在已有数据上多尝试几种算法,多试验一些参数,评估正确率最高的算法,再应用到未来的数据上去。

时间: 2024-10-11 17:06:11

朴素贝叶斯分类算法的相关文章

朴素贝叶斯分类算法介绍及python代码实现案例

朴素贝叶斯分类算法 1.朴素贝叶斯分类算法原理 1.1.概述 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立 P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z) 1.2.算法思想 朴素贝叶斯的思想是这样的: 如果一个事物在一些属性条件发生

朴素贝叶斯分类算法原理分析与代码实现

前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果是挺不错的. 在说明原理之前,先介绍一个叫词向量的概念. --- 它一般是一个布尔类型的集合,该集合中每个元素都表示其对应的单词是否在文档中出现. 对应关系和词汇表一一对应. 比如说,词汇表只有三个单词:'apple', 'orange', 'melo',某文档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}. 这种模型

数据挖掘系列(8)朴素贝叶斯分类算法原理与实践

隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践. 一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下: 这个公式虽然看上去简单,但它却能总结历史,预知未来.公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来. 举个例子,大学的时候,某男生经常去图

基于朴素贝叶斯分类算法的邮件过滤系统

转自穆晨 阅读目录 前言 准备数据:切分文本 训练并测试 小结 回到顶部 前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现. 回到顶部 准备数据:切分文本 获取到文本文件之后,首先要做的是两件事情: 1. 将文本文件转换为词汇列表 2. 将上一步的结果进一步转换为词向量 对于 1,具体来说

朴素贝叶斯分类算法:对贝叶斯公式的理解

为了完成自己的毕业论文,不得不接触这个朴素贝叶斯分类算法...真是惭愧啊(快毕业了才学这个...还初识) 哈哈,不过只要肯学什么时候都不会晚 要想完全理解这个算法,必须先去百度一下 原来朴素贝叶斯分类算法是借用到了贝叶斯定理,那什么是贝叶斯定理呢...不多BB, 先看一看什么是条件概率:P(A|B)=P(AB)/P(B) 其中P(A|B)指的是在B已经发生的情况下A发生的概率.而这个概率是由A和B同时发生的概率除以B发生的概率.点解???这是我第一次看到这个公式后的反应 当我看完这张图后,就差不

第五篇:朴素贝叶斯分类算法原理分析与代码实现

前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果挺不错的. 在说明原理之前,先介绍一个叫词向量的概念. --- 它一般是一个布尔类型的集合,该集合中每个元素都表示其对应的单词是否在文档中出现. 比如说,词汇表只有三个单词:'apple', 'orange', 'melo',某文档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}. 这种模型通常称为词集模型,如果词向量元

第六篇:基于朴素贝叶斯分类算法的邮件过滤系统

前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现. 准备数据:切分文本 获取到文本文件之后,首先要做的是两件事情: 1. 将文本文件转换为词汇列表 2. 将上一步的结果进一步转换为词向量 对于 1,具体来说,就是将文本文件以非字母或数字之外的字符为界进行切割. 仅仅使用字符串的 split

朴素贝叶斯分类算法(1)

转自http://blog.csdn.net/lch614730/article/details/17031145 朴素贝叶斯分类算法(Naive Bayesian classification) PS:本文在讲解的时候会用通俗的例子来讲解 本文我们将学习到: (1)什么是朴素贝叶斯? (2)先验概率和条件概率是如何证明的? (3)文本分类的多项式模型和伯努利模型(附加例子说明) (4)垃圾邮件的分类及代码的演示(暂缺以后会补上) (1)什么是朴素贝叶斯(Naive Bayes,以后简称NB)?

《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包括对当中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的全部算法源码和算法所用到的源文件,有须要的留言 ====================================================

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习.聚类与无监督学习. 简述分类与聚类的联系与区别? 分类与聚类:是把某个对象划分到某个具体的已经定义的类别当中,而聚类是把一些对象按照具体特征组织到若干个类别里. 虽然都是把某个对象划分到某个类别中,但是分类的类别是已经预定义的,而聚类操作时,某个对象所属的类别 却不是预定义的,而是可以根据情况做若干个聚类中心. 简述什么是监督学习与无监督学习. 监督学习与无监督学习:对于新的实例,监督学习可以用于映射出该实例的类别. 对于无监督学习,我们只知道特征,并不知 道答案,不同的