机器学习四 -- 基于概率论的分类方法:朴素贝叶斯

基于概率的分类方法:朴素贝叶斯

贝叶斯决策理论

朴素贝叶斯是贝叶斯决策理论的一部分,所以在讲解朴素贝叶斯之前我们先快速简单了解一下贝叶斯决策理论知识。

贝叶斯决策理论的核心思想:选择具有最高概率的决策。比如我们毕业选择就业方向,选择C++方向的概率为0.3,选择Java的概率为0.2,选择机器学习的概率为0.5。那么我们就把这样的一位毕业生就业方向归类为机器学习方向。

条件概率

什么是条件概率?事件A在另一个事件B已知发生条件下的发生概率,记为P(A|B),读作“在B条件下A的概率”。

例子1:有两个骰子,一个骰子扔出点数是6,那么扔另一个骰子时,求出两个骰子点数之和大于等于10的概率。

例子2:有三个箱子编号为1,2,3。1号箱子有1个红球4个白球,2号箱子有2个红球3个白球,3号箱子有3个红球。从三个箱子中任取一箱,从中任意摸出一个球,求取得红球的概率。

另一种有效计算条件概率的方法就是贝叶斯准则。贝叶斯准则告诉我们如何交换条件概率中的条件和结果,即如果已知P(x|c),要求P(c|x) ,  此时我们可以使用这样的计算方法:P(c|x)*P(x)=P(x|c)*P(c)。

到目前为止,我们基本了解了贝叶斯决策理论和条件概率,我们就开始学习编写代码,用Python语言来试着实现朴素贝叶斯分类器吧。

朴素贝叶斯分类器

以留言板为例,为了不影响社区的发展,我们要屏蔽侮辱性的言论,所以要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的词语,就将这条留言标识为内容不当。过滤这类内容是很多网站的基本需求。这里,我们就将言论归为侮辱类和非侮辱类,分别用1和0来表示。

 1 # coding : utf-8
 2 from numpy import *
 3
 4 def loadDataSet():
 5     postingList = [[‘my‘, ‘dog‘, ‘has‘, ‘flea‘,  6         ‘problems‘, ‘help‘, ‘please‘],
 7         [‘maybe‘, ‘not‘, ‘take‘, ‘him‘,  8         ‘to‘, ‘dog‘, ‘park‘, ‘stupid‘],
 9         [‘my‘ ,‘dalmation‘, ‘is‘, ‘so‘, ‘cute‘, 10         ‘I‘, ‘love‘, ‘him‘],
11         [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘],
12         [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘ 13         ‘to‘, ‘stop‘, ‘him‘],
14         [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stupid‘]
15         ]
16     classVec = [0,1,0,1,0,1]
17     return postingList, classVec
18
19 def createVocabList(dataSet):
20     vocabSet = set([])
21     for doc in dataSet:
22         vocabSet = vocabSet | set(doc)
23     return list(vocabSet)
24
25 def setOfWord2Vec(vocabList, inputSet):
26     returnVec = [0]*len(vocabList)
27     for word in inputSet:
28         if word in vocabList:
29             returnVec[vocabList.index(word)] = 1
30         else:
31             print "the word: %s is not in my Vocabulary!" % word
32     return returnVec
33     

第一个函数loadDataSet()创建了一些实验样本。该函数返回的第一个变量是进行词条切分后的文档集合,这些文档来自对狗狗的留言板。第二个变量是一个类别标签的集合。这里有两类,分别是侮辱性和非侮辱性。

下一个函数createVocabList()会创建一个包含在所有文档中出现的不重复词的列表,使用了set数据类型。操作符“|”用于求两个集合的并集。

第三个函数的输入参数为词汇列表和某个文档,输出的是文档向量,向量的每一个元素为1或者0,分别表示词汇表中的单词在输入文档中是否出现过。

接下来我们看看执行这个函数块的效果是怎么样的。

1 # coding : utf-8
2 import bayes
3 from numpy import *
4
5 list2Posts, listClasses = bayes.loadDataSet()
6 myVocabList = bayes.createVocabList(list2Posts)
7 print myVocabList, len(myVocabList)
8 print bayes.setOfWord2Vec(myVocabList, list2Posts[0])
9 print bayes.setOfWord2Vec(myVocabList, list2Posts[3])

计算概率

 1 def trainNBO(trainMatrix, trainCategory):
 2     numTrainDocs = len(trainMatrix)
 3     numWords = len(trainMatrix[0])
 4     pAbusive = sum(trainCategory)/float(numTrainDocs)
 5     p0Num = zeros(numWords); p1Num = zeros(numWords)
 6     p0Denom = p1Denom = 0.0
 7     for i in range(numTrainDocs):
 8         if trainCategory[i] == 1:
 9             p1Num += trainMatrix[i]
10             p1Denom += sum(trainMatrix[i])
11         else :
12             p0Num += trainMatrix[i]
13             p0Denom += sum(trainMatrix[i])
14     p1Vect = p1Num/p1Denom
15     p0Vect = p0Num/p0Denom
16     return p0Vect,p1Vect,pAbusive

万事俱备,只欠东风。接下来,就是重要的朴素贝叶斯分类函数了。

 1 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
 2     p1 = sum(vec2Classify * p1Vec) + log(pClass1)
 3     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
 4     if p1 > p0:
 5         return 1
 6     else :
 7         return 0
 8
 9 def testingNB():
10     listOPosts,listClasses = loadDataSet()
11     myVocabList = createVocabList(listOPosts)
12     trainMat = []
13     for postinDoc in listOPosts:
14         trainMat.append(setOfWord2Vec(myVocabList,postinDoc))
15     p0V,p1V,pAb = trainNBO(array(trainMat),array(listClasses))
16     testEntry = [‘love‘, ‘my‘, ‘dalmation‘]
17     thisDoc = array(setOfWord2Vec(myVocabList, testEntry))
18     print testEntry, ‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)
19     testEntry = [‘stupid‘, ‘garbage‘]
20     thisDoc = array(setOfWord2Vec(myVocabList, testEntry))
21     print testEntry, ‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)

试试看我们的运算结果:

和我们期望的结果一样,文档单词正确的进行了分类。

总结:

朴素贝叶斯算法总体来说,是比决策树和KNN算法较复杂一些,代码量也相对而言多一些。回想起大一时期青涩的我,没有好好学习概率论,当时没有对其引起重视,导致如今这个鸟样。哎,只怪当时还年轻啊!条件概率部分有很多较复杂的概率公式还是很模糊,接下来会花一点时间在概率这方面。只要概率方面没问题的话,相信读懂以上这几份代码应该不成问题,classifyNB函数里就是在计算最终的概率。

加油吧,BaiYiShaoNian!

时间: 2024-08-08 06:26:07

机器学习四 -- 基于概率论的分类方法:朴素贝叶斯的相关文章

第四章:基于概率论的分类方法: 朴素贝叶斯

本章内容□使用概率分布进行分类□学习朴素贝叶斯分类器□解析RSS源数据口使用朴素贝叶斯来分析不同地区的态度 前两章我们要求分类器做出艰难决策,给出“该数据实例属于哪一类”这类问题的明确答案.不过,分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时给出这个猜测的概率估计值.       概率论是许多机器学习算法的基础,所以深刻理解这一主题就显得十分重要.第3章在计算特征值取某个值的概率时涉及了一些概率知识,在那里我们先统计特征在数据集中取某个特定值的次数,然后除以数据集的

基于概率论的分类方法:朴素贝叶斯算法实践学习

      关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月12日 13:03:46所撰写内容(http://blog.csdn.net/qq_37608890/article/details/78738552).             本文根据最近学习机器学习书籍 网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过.          通过前两篇文章,我们对于k-近

机器学习实战读书笔记(四)基于概率论的分类方法:朴素贝叶斯

4.1 基于贝叶斯决策理论的分类方法 朴素贝叶斯 优点:在数据较少的情况下仍然有效,可以处理多类别问题 缺点:对于输入数据的准备方式较为敏感 适用数据类型:标称型数据 贝叶斯决策理论的核心思想:选择具有最高概率的决策. 4.2 条件概率 4.3 使用条件概率来分类 4.4 使用朴素贝叶斯进行文档分类 朴素贝叶斯的一般过程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法 5.测试算法 6.使用算法 朴素贝叶斯分类器中的另一个假设是,每个特征同等重要. 4.5 使用Python进行文本分类

机器学习(基于概率论的分类方法:朴素贝叶斯)

概率论是许多机器学习算法的基础,因而本篇将会用到一些概率论知识,我们先统计在数据集中取某个特定值的次数,然后除以数据集的实例总数,就得到了取该值的概率. 优点:在数据较少的情况下仍然有效,可以处理多类别问题 缺点:对输入数据的准备方式比较敏感 适用于标称型数据 如果P1(X,Y)>P2(X,Y),那么属于类别1 如果P2(X,Y)>P1(X,Y),那么属于类别2 也就是说我们会选择高概率对应的类别.这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策 朴素贝叶斯的朴素就是特征之间相互独立

机器学习 基于概率论的分类方法:朴素贝叶斯

分类器可能产生错误分类,要求分类器给出一个最优的类别猜测结果并给出这个猜测的概率估计值. 朴素贝叶斯的特点: 优点:在数据较少的情况下依然有效,可以处理多类别问题: 缺点:对于输入数据的准备方式较为敏感: 适用数据类型:标称型数据 条件概率:在A条件下发生B结果的概率: P(B|A) = P(A&B)/P(A) 在A条件下发生B结果的概率等于A和B同时发生的概率除以A发生的概率 P(A&B) = P(A)*P(B|A) A和B同时发生的概率等于A发生的概率乘以A条件下B发生的概率 P(A&

机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类

原文链接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一.前言 上篇文章机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器讲解了朴素贝叶斯的基础知识.本篇文章将在此基础上进行扩展,你将看到以下内容: 拉普拉斯平滑 垃圾邮件过滤(Python3) 新浪新闻分类(sklearn) 二.朴素贝叶斯改进之拉普拉斯平滑 上篇文章提到过,算法存在一定的问题,需要进行改进.那么需要改进的地方在哪里呢?利用贝叶斯分类器对文档进行

【简单认识】机器学习常见分类算法——朴素贝叶斯

贝叶斯在1763年,<机会学说中一个问题的解>中提出了贝叶斯定理. 生活中不乏分类,比如我们经常通过一些人的衣着,来下意识的区别某些人是杀马特亦或是文艺青年.我们是如何做出这些判断或者说是分类的呢?这些判断大多来自我们的“经验之谈”,即,我们首先脑海中会先存有“某类人通常会如何着装打扮”的概念,然后当遇到这类显著特征之后,便会下意识的对其进行分类. 那么如何让机器进行这种类似的判断区分呢? 朴素贝叶斯分类法是一种相对简单易理解的机器分类方法.它的思想是首先对一些已知分类的样本进行采样(机器学习

机器学习基础——让你一文学会朴素贝叶斯模型

今天这篇文章和大家聊聊朴素贝叶斯模型,这是机器学习领域非常经典的模型之一,而且非常简单,适合初学者入门. 朴素贝叶斯模型,顾名思义和贝叶斯定理肯定高度相关.之前我们在三扇门游戏的文章当中介绍过贝叶斯定理,我们先来简单回顾一下贝叶斯公式: \[P(A|B)=\frac{P(A)P(B|A)}{P(B)}\] 我们把\(P(A)\)和\(P(B)\)当做先验概率,那么贝叶斯公式就是通过先验和条件概率推算后验概率的公式.也就是寻果溯因,我们根据已经发生的事件去探究导致事件发生的原因.而朴素贝叶斯模型正

Stanford大学机器学习公开课(六):朴素贝叶斯多项式模型、神经网络、SVM初步

(一)朴素贝叶斯多项式事件模型 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称 NB-MBEM).该模型有多种扩展,一种是在上一篇笔记中已经提到的每个分量的多值化,即将p(xi|y)由伯努利分布扩展到多项式分布:还有一种在上一篇笔记中也已经提到,即将连续变量值离散化.本文将要介绍一种与多元伯努利事件模型有较大区别的NB模型,即多项式事件模型(Multinomial Event Model,一下简称NB-M