朴素贝叶斯python小样本实例

朴素贝叶斯
优点:在数据较少的情况下仍然有效,可以处理多类别问题
缺点:对于输入数据的准备方式较为敏感
适用数据类型:标称型数据
朴素贝叶斯决策理论的核心思想:选择具有最高概率的决策
朴素贝叶斯的一般过程
(1)收集数据:可以使用任何方法。
(2)准备数据:需要数值型或者布尔型数据。
(3)分析数据:有大量特征时,回值特征作用不大,此时使用直方图效果更好
(4)训练算法:计算不同的独立也正的条件概率
(5)测试算法:计算错误率
(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定是文本

  1 from numpy import *
  2
  3 #创建一些实验样本。该函数返回的第一个变量是进行词条切分后的文档集合,
  4 #该函数返回的第二个变量是一个类别标签的集合
  5 def loadDataSet():
  6     postingList=[[‘my‘, ‘dog‘, ‘has‘, ‘flea‘, ‘problems‘, ‘help‘, ‘please‘],
  7                  [‘maybe‘, ‘not‘, ‘take‘, ‘him‘, ‘to‘, ‘dog‘, ‘park‘, ‘stupid‘],
  8                  [‘my‘, ‘dalmation‘, ‘is‘, ‘so‘, ‘cute‘, ‘I‘, ‘love‘, ‘him‘],
  9                  [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘],
 10                  [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘, ‘to‘, ‘stop‘, ‘him‘],
 11                  [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stupid‘]]
 12     classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
 13     return postingList,classVec
 14
 15 #创建一个包含所有文档中出现的不重复词的列表
 16 def createVocabList(dataSet):
 17     #创建一个空集
 18     vocabSet = set([])  #create empty set
 19     for document in dataSet:
 20         #创建两个集合的并集
 21         vocabSet = vocabSet | set(document) #union of the two sets
 22     return list(vocabSet)
 23
 24 #该函数的输入参数为词汇表及其某个文档,输出的是文档向量,向量的每一元素为1或0,
 25 # 分别表示词汇表中的单词在输入文档中是否出现。
 26 #函数首先创建一个和词汇表等长的向量,并将其元素都设置为0.接着,遍历文档中的所有单词,
 27 # 如果出现了词汇表中的单词,则将输出的文档向量中对应值设为1.一切顺利的话,就不需要
 28 # 检查某个词是否还在vocabList中,后边可能会用到这一操作
 29 def setOfWords2Vec(vocabList, inputSet):
 30     #创建一个维度都为0的向量
 31     returnVec = [0]*len(vocabList)
 32     for word in inputSet:
 33         if word in vocabList:
 34             returnVec[vocabList.index(word)] = 1
 35         else: print ("the word: %s is not in my Vocabulary!" % word)
 36     return returnVec
 37 ‘‘‘
 38 该函数的伪代码如下:
 39 计算每个类别中的文档数目
 40 对每篇训练文档:
 41     对每个类别:
 42         如果词条出现文档中则增加该词条的计数值
 43         增加所有词条的计数值
 44     对每个类别:
 45         对每个词条:
 46             将该词条的数目除以总词条数目得到条件概率
 47     返回每个类别的条件概率
 48 ‘‘‘
 49
 50 #
 51 def trainNB0(trainMatrix,trainCategory):
 52     numTrainDocs = len(trainMatrix)
 53     numWords = len(trainMatrix[0])
 54     #初始化概率
 55     pAbusive = sum(trainCategory)/float(numTrainDocs)
 56     p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones()
 57     p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
 58     for i in range(numTrainDocs):
 59         #向量相加
 60         if trainCategory[i] == 1:
 61             p1Num += trainMatrix[i]
 62             p1Denom += sum(trainMatrix[i])
 63         else:
 64             p0Num += trainMatrix[i]
 65             p0Denom += sum(trainMatrix[i])
 66             #对每个元素做除法
 67     p1Vect = log(p1Num/p1Denom)          #change to log()
 68     p0Vect = log(p0Num/p0Denom)          #change to log()
 69     return p0Vect,p1Vect,pAbusive
 70
 71 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
 72     p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
 73     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
 74     if p1 > p0:
 75         return 1
 76     else:
 77         return 0
 78
 79 def bagOfWords2VecMN(vocabList, inputSet):
 80     returnVec = [0]*len(vocabList)
 81     for word in inputSet:
 82         if word in vocabList:
 83             returnVec[vocabList.index(word)] += 1
 84     return returnVec
 85
 86 def testingNB():
 87     listOPosts,listClasses = loadDataSet()
 88     myVocabList = createVocabList(listOPosts)
 89     trainMat=[]
 90     for postinDoc in listOPosts:
 91         trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
 92     p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
 93     testEntry = [‘love‘, ‘my‘, ‘dalmation‘]
 94     thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
 95     print(testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb))
 96     testEntry = [‘stupid‘, ‘garbage‘]
 97     thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
 98     print (testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb))
 99 #如果一个词在文档中出现不止依次,这可能意味着包含该词是否出现的文档所不能表达的某种信息,
100 # 这种方法被称为词袋模型。
101 # #
102
103 mySent=‘This book is the best book on Python or M.L. I have ever laid eyes upon.‘
104 A=mySent.split()
105 print(A)

小结:

对于分类而言,使用概率有时要比使用硬规则更为有效。贝叶斯概率及贝叶斯准则提供了一种利用已知值来估计未知概率的有效方法。

可以通过特征之间的调教独立性假设,降低对数据量的需求。独立性假设是指一个词的出现概率并不依赖于文档中的其他词。当然我们也知道这个假设过于简单,这就是之所以称之为朴素贝叶斯的原因。尽管条件独立性假设并不正确,但是朴素贝叶斯仍然是一种有效的分类器。

原文地址:https://www.cnblogs.com/zhibei/p/9351497.html

时间: 2024-08-25 09:31:36

朴素贝叶斯python小样本实例的相关文章

朴素贝叶斯算法 & 应用实例

转载请注明出处:http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段就要把基础知识都带上. 机器学习在大数据浪潮中逐渐展示她的魅力,其实<概率论>.<微积分>.<线性代数>.<运筹学>.<信息论>等几门课程算是前置课程,当然要转化为工程应用的话,编程技能也是需要的,而作为信息管理专业的同学,对于信息的理解.数据的敏感都是很好

朴素贝叶斯python实现

概率论是很多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是因为整个形式化过程中只做最原始.简单的假设.(这个假设:问题中有很多特征,我们简单假设一个个特征是独立的,该假设称做条件独立性,其实往往实际问题中不是完全独立的,这时需要用到另外一种方法叫做贝叶斯网络),后面利用朴素贝叶斯方法,我们应用在垃圾邮件过滤问题当中去. 贝叶斯决策理论的分类方法: 优点:数据较少仍然有效,可以处理多类别问题. 缺点:对于输入数据的准备方式较为敏感,我理解就是开始要准备每个已经分类好的样本集 数据类型:标称型

机器学习算法-朴素贝叶斯Python实现

引文:前面提到的K最近邻算法和决策树算法,数据实例最终被明确的划分到某个分类中,下面介绍一种不能完全确定数据实例应该划分到哪个类别,或者说只能给数据实例属于给定分类的概率. 基于贝叶斯决策理论的分类方法之朴素贝叶斯 优点:在数据较少的情况下仍然有效,可以处理多类别问题 缺点:对于输入数据的准备方式较为敏感 适用数据类型:标称型数据. 朴素贝叶斯的一般过程 收集数据:可以使用任何方式 准备数据:需要数据型或是布尔型数据 分类数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好 训练算法:计

朴素贝叶斯算法的实例

贝叶斯的应用 过滤垃圾邮件 贝叶斯分类器的著名的应用就是垃圾邮件过滤了,这方面推荐想详细了解的可以去看看<黑客与画家>或是<数学之美>中对应的章节,贝叶斯的基础实现看这里 数据集 两个文件夹,分别是正常邮件和垃圾邮件,其中各有25封邮件 测试方法 从50封邮件中随机选取10封做为测试数据 实现细节 1.首先我们需要将文本转成我们需要的向量的样子,这里需要使用一点正则表达式2.由于采取交叉验证的方式,随机过程会导致每次的结果不尽相同 1 #coding=utf-8 2 from nu

朴素贝叶斯基础概念-实例

假设一个镇里有60%男性和40%女性.女性穿裤子的人数和穿裙子的人数一样,所有男性都穿裤子(正常男性都穿裙子).一个人在远处随机看到了一个穿裤子的人,预测这个人是男生还是女生?为什么? A:数女性事件,B:是穿的是裤子的事件 P(A)是看到是女性的概率,在这里是40% P(A~)是看到是男性的概率,在这里是60% P(B|A)是女性穿裤子的概率,在这里是50% P(B|A~)是男性穿裤子的概率,在这里是100% P(B)是穿裤子的概率,P(B) = P(B|A)P(A) + P(B|A~)P(A

Stanford机器学习[第六讲]-朴素贝叶斯算法

引文:由于之前讲过了朴素贝叶斯的理论Stanford机器学习[第五讲]-生成学习算法第四部分,同时朴素贝叶斯的算法实现也讲过了,见机器学习算法-朴素贝叶斯Python实现.那么这节课打算讲解一下朴素贝叶斯算法的具体计算流程,通过一个具体的实例来讲解. PS:为了专注于某一个细节,本章节只抽取了视频的一部分来讲解,只讲解一个贝叶斯算法的计算流程,关于视频里面的具体内容请参考下面的视频链接. 讲解的实例是一个文本分类的例子,区分一句话是粗鲁的还是文明的,类别标签只有Yes或No,表示是粗鲁的和不是粗

统计学习四:1.朴素贝叶斯

全文引用自<统计学习方法>(李航) 朴素贝叶斯(naive Bayes)法 是以贝叶斯定理为基础的一中分类方法,它的前提条件是假设特征条件相互独立.对于给定的训练集,它首先基于特征条件假设的前提条件,去学习输入与输出的条件概率分布,然后根据此分布模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y. 1.朴素贝叶斯的学习与分类 1.1 基本方法 假设输入空间\(X \subseteq R^n\)为n维向量的集合,输入空间为类标记集合\(Y=\{c_1,c_2,\cdots,c_K\}\

4.朴素贝叶斯法

朴素贝叶斯(naive Bayes) 法是基于贝叶斯定理与特征条件独立假设的分类方法.对于给定的训练数据集, 首先基于特征条件独立假设学习输入/输出的联合概率分布: 然后基于此模型, 对给定的输入x, 利用贝叶斯定理求出后验概率最大的输出y. 朴素贝叶斯法实现简单, 学习与预测的效率都很高, 是一种常用的方法. 1. 朴素贝叶斯法的学习与分类基本方法训练数据集: 由X和Y的联合概率分布P(X,Y)独立同分布产生朴素贝叶斯通过训练数据集学习联合概率分布P(X,Y) ,      即先验概率分布:

【黎明传数==&gt;机器学习速成宝典】模型篇05——朴素贝叶斯【Naive Bayes】(附python代码)

目录 先验概率与后验概率 什么是朴素贝叶斯 模型的三个基本要素 构造kd树 kd树的最近邻搜索 kd树的k近邻搜索 Python代码(sklearn库) 先验概率与后验概率 什么K近邻算法(k-Nearest Neighbor,kNN) 引例 有一个训练集包含100个实例,属性是皮肤颜色(黑.白.黄),标记是地区(亚洲.非洲.北美洲人).在训练集中有30个非洲人(28个黑人),有50个亚洲人(1个黑人),有20个北美洲人(5个黑人).请训练一个贝叶斯模型. 当一个训练集外的黑人来报道,我们该如何