朴素贝叶斯(Naive Bayes),贝叶斯概率论在整个统计学习上都是泰山北斗一样的存在,《Pattern Recognization and Machine Learning》这一扛鼎之作全书的思想其实就是贝叶斯概率论,简单的说就是先验代替后验。
我们先来给朴素贝叶斯找一点理论支持
贝叶斯概率公式:P(A|B)=P(A)*p(B|A)/P(B) ,而根据要求,我们需要做的是得出P(C1|X,Y)和P(C2|X,Y)的概率,其中P(C1|X,Y)的意思是根据特征值X,Y得到是C1的概率,后面是得到C2的概率,因此,我们只需要比较这两者的大小就知道结果是归为哪一类了,但是问题是这个根本不好计算,这时候贝叶斯准则就可以派上用场了:
P(C1|X,Y)=P(C1)*P(X,Y|C1)/P(X,Y)
其中P(X,Y)是可以忽略的,因此P(C1|X,Y)约等于P(C1)*P(X,Y|C1),这个时候我们可以用经验概率来计算P(C1),但是计算P(X,Y|C1)仍然有难度,为了简单起见,朴素贝叶斯假设X,Y是独立的,所谓朴素也就指的是这个独立假设,也就是P(X,Y|C1)=P(X|C1)*P(Y|C1),这样就很容易计算该值了,可以得到:
P(C1|X,Y)=P(C1)*P(X|C1)*P(Y|C1),这样就容易计算了。
背景粗略交代完毕,现在回到具体问题:
邮件分类器:邮件分类垃圾邮件个正常邮件,根据已有的邮件训练样本,训练出邮件分类模型。
数据说明:25封垃圾邮件,25封正常邮件,在这50封邮件里面随机选取10篇作为测试数据,剩下40篇作为训练数据
算法说明:
- 根据所给的训练邮件,得到所有的不重复单词数组,记为wordlist
- 将训练数据和测试数据按照wordlist的顺序转换成词向量
- 根据词向量使用NaiveBayes训练模型
- 使用测试数据集测试结果
下面是具体代码:
# -*- coding: UTF8 -*- """ author:luchi date:16/2/18 desc: 朴素贝叶斯做邮件分类 """ """ 获取训练与测试文本,构建训练集与测试集 """ import re import random from numpy import * def splitWords(str): listTokens=re.split(r'\W*',str) return [token.lower() for token in listTokens if len(token)>2 ] def initDataset(): wordList=[] docList=[] labels=[] for i in range(1,26): fr=open('email/spam/%d.txt' % i) frStr=fr.read() l=splitWords(frStr) docList.append(l) labels.append(0) wordList.extend(l) fr=open('email/ham/%d.txt' % i) frStr=fr.read() l=splitWords(frStr) docList.append(l) labels.append(1) wordList.extend(l) # print wordList # print docList #随机选出10个组作为测试 length=len(docList) testList=[] testLabels=[] for i in range(10): randIndex=int(random.uniform(0,len(docList))) testList.append(docList[randIndex]) testLabels.append(labels[randIndex]) del(docList[randIndex]) del(labels[randIndex]) return wordList,docList,labels,testList,testLabels,length """ 创建训练和测试向量 """ def getVecDataset(wordList,trainList,testList): wordList=set(wordList) wordvec=[token for token in wordList] feature_num=len(wordvec) print len(wordvec) trainVec=zeros((len(trainList),feature_num)) testVec=zeros((len(testList),feature_num)) for i,l in enumerate(trainList): for word in l: if word in wordvec: trainVec[i][wordvec.index(word)]+=1 for i,l in enumerate(testList): for word in l: if word in wordvec: testVec[i][wordvec.index(word)]+=1 return trainVec,testVec def NaiveBayes(traingList,trainLabel): trainMat=array(traingList) labelMat=array(trainLabel) class0=ones(len(trainMat[0])) sumClass0=2.0 class1=ones(len(trainMat[0])) sumClass1=2.0 m=len(trainMat) pclass0=0 for i in range(m): if(trainLabel[i]==0): class0+=trainMat[i] sumClass0+=sum(trainMat[i]) pclass0+=1 elif trainLabel[i]==1: class1+=trainMat[i] sumClass1+=sum(trainMat[i]) # print class0 # print sumClass0 class0=class0/sumClass0 class1=class1/sumClass1 class0=log(class0) class1=log(class1) return class0,class1,pclass0 def testNaiveBayes(testVec,vec0,vec1,pclass0): p0=sum(testVec*vec0)+log(pclass0) p1=sum(testVec*vec1)+log(1-pclass0) if(p0>p1): return 0 else: return 1 def test(): wordList,trainList,trainLabels,testList,testLabels,doc_num=initDataset() trainVec,testVec=getVecDataset(wordList,trainList,testList) class0Vec,class1Vec,pclass0=NaiveBayes(trainVec,trainLabels) m=len(testVec) err=0 pclass0=float(pclass0)/len(trainVec) for i in range(m): vec=testVec[i] label=testLabels[i] result=testNaiveBayes(array(vec),class0Vec,class1Vec,pclass0) if result!=label: err+=1 print ("error rate is %f" % (float(err)/m)) if __name__=="__main__": test()
注意程序中使用的log方法不是math包里的log方法,而是numpy里面的log方法,所以不要引入math包即可
测试的结果是:
可以看到,在5次测试中,只有一次的错误率为10%,其他全是0
朴素贝叶斯在使用起来容易,操作简单,却往往在一些问题上有着惊人的高效,这也是其强大的原因,但是朴素贝叶斯并不是对所有问题都适用,其独立假设就已经表示对一些对特征值有着明显先后或者依赖关系的时候,朴素贝叶斯的独立假设是不成立的,所以使用朴素贝叶斯还是实现需要看下具体的问题
代码和数据见下面
相关推荐
标题《MLA Handbook 第8版,PDF》和描述“PDF格式适配KINDLE的版本”,以及标签“MLA 英语写作”明确指向了该文档的性质和内容,即这是关于MLA(现代语言协会)格式的使用手册的PDF版本,它适配于KINDLE阅读器。MLA...
matlab匹配滤波代码MLA2_Tracking 这是用于记录,跟踪和分析MLA2实验动物位置的代码。 要在新实验中使用此代码,请从Github存储库中派生或下载并从那里开始使用新数据。 工作流程大纲 盆景: Video_Acquisition....
乳胶-mla-模板 用于生成 mla 格式论文的基本模板。 先决条件 make 一些最新的 LaTeX 发行版(TeXLive、MacTeX、MiKTeX 等) 安装和使用 $ git clone https://github.com/trotod/latex-mla-template <project> $ cd...
MLA格式主要包括三个组成部分: 1. **文内引用**(Parenthetical References in the Body of the Paper):在文章正文中直接引用文献时使用的标注方式。 2. **所引文献列表**(Works-Cited List):位于文章末尾,...
MLA 格式参考文献示例 MLA 格式参考文献示例文档提供了一些常见的文献类型的引用格式,包括期刊文章、专著、编撰书籍等。下面是对这些文献类型的详细解释和示例。 期刊文章 在 MLA 格式中,期刊文章的引用格式...
MLA JIL 文本数据 该存储库包含从 MLA 工作信息列表中挖掘的文本数据语料库。 这是一个正在进行的项目,旨在提供 (1) 供其他学者分析的纯文本数据资源,以及 (2) 分析用于修辞和写作研究的 MLA JIL 数据。 该项目的...
MLA(Modern Language Association)格式是一种广泛应用于人文科学领域的引用规范,主要用于撰写文学论文。MLA格式要求在论文中正确引用他人的观点和内容,确保学术诚信。以下是关于MLA格式的一些关键要点: 1. **...
在这个主题中,我们将深入探讨P2到P7的过程审核元素以及MLA(制造过程能力)的解读,结合实际的审核表格和案例分析,以帮助理解和应用这些概念。 P2-P7是VDA 6.3过程审核的核心部分,它们分别代表: 1. P2 - 过程...
MLA(Modern Language Association)引用格式是人文科学领域内最常用的文献引用风格之一,适用于文学、语言学、文化研究等学科的研究论文。本指南将详细介绍MLA第七版的基本引用规则,涵盖常见的书籍、电子资源及...
"pa.mla.unit.addon:mla unit addon mod" 是一个针对特定游戏或模拟平台的扩展模组,主要由Python编程语言编写。这个模块可能是为了增强游戏中的单位(unit)功能,提供更多的自定义选项或者引入新的游戏机制。在...
首先,我们可以确定这份文件是关于MLA系列贴片电容的选型手册。MLA系列贴片电容是指特定型号的电容器,这类电容器通常被广泛应用于各种电子设备中,用以稳定电源电压、滤波、耦合和去耦等。选型手册的作用是在众多的...
MLA正文引用+参考文献.pdf 本文将详细介绍MLA格式的正文引用和参考文献的撰写要求。MLA格式是由美国现代语言学会(Modern Language Association)提出的,主要应用于人文学科、社会科学和自然科学等领域。 MLA格式...
- Charles Elkan教授(加州大学圣地亚哥分校),他使用了增强朴素贝叶斯算法(Boosted Naive Bayesian, BNB)。 - Silicon Graphics Inc. 使用了他们的软件MineSet。 - Urban Science Applications, Inc. 使用了他们...
《mla数据重建:Python库解析与应用》 在当今数据驱动的时代,高效的数据处理工具是科学研究和技术开发的重要支柱。本文将深入探讨“mla-data-reconstruction”这一Python库,它专为解析、重建和转换MLA(多光子...
在机器学习领域,贝叶斯学习被广泛应用于分类、回归等问题中,尤其是在处理不确定性和概率建模方面。 5. 学术资源与参考书目:文档中列举了多本人工智能和机器学习领域的经典教材和参考书目,这包括了: - Tom M. ...
在MLA格式中,论文的引用文献有三种形式:文注释、注解和参考文献。文注释是指在正文中引用别人的论述、词汇、材料、观点或思想时,使用圆括号表示的信息,例如(Samuel 88)。注解是指对正文中需要说明的问题的注解...
第十届中国机器学习及其应用研讨会 MLA'12 是一次聚焦于机器学习理论与实践的高端学术会议,该会议于2012年11月3日至4日在中国著名的高等学府——清华大学举行。这次研讨会汇聚了国内外在机器学习领域具有深厚造诣的...
MLA格式规范详解 MLA格式是Modern Language Association(现代语言学会)所制定的格式规范,广泛应用于人文学科、社会科学和自然科学等领域。MLA格式的主要特点是采用括号式注释,注释内容包括作者姓氏、作品名称、...