朴素贝叶斯方法(Naive Bayes)原理和实现
模型概述
- 朴素贝叶斯方法,是指
- 朴素:特征条件独立
- 贝叶斯:基于贝叶斯定理
根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是
在这里,x是一个特征向量,将设x维度为M。因为朴素的假设,即特征条件独立,根据全概率公式展开,公式(1)可以表达为
这里,只要分别估计出,特征 xi在每一类的条件概率就可以了。类别y的先验概率可以通过训练集算出,同样通过训练集上的统计,可以得出对应每一类上的,条件独立的特征对应的条件概率向量。
如何统计,就是下一部分——学习——所关心的内容。
学习(参数估计)
下面介绍如何从数据中,学习得到朴素贝叶斯分类模型。概述分类方法,并提出一个值得注意的问题。
学习
- 训练集TrainingSet={(x1,y1),(x2,y2),...,(xN,yN)} 包含N条训练数据,其中 xi=(x(1)i,x(2)i,...,x(M)i)T是M维向量,yi∈{c1,c2,...cK}属于K类中的一类。
-
学习 1.首先,我们来计算公式(2)中的p(y=ck)
p(y=ck)=∑Ni=1I(yi=ck)N。。。。(3)其中I(x)为指示函数,若括号内成立,则计1,否则为0。
-
学习 2.接下来计算分子中的条件概率,设M维特征的第j维有L个取值,则某维特征的某个取值ajl,在给定某分类ck下的条件概率为:
p(xj=ajl|y=ck)=∑Ni=1I(xji=ajl,yi=ck)∑Ni=1I(yi=ck)。。。(4)
经过上述步骤,我们就得到了模型的基本概率,也就完成了学习的任务。
分类
- 通过学到的概率,给定未分类新实例X,就可以通过上述概率进行计算,得到该实例属于各类的后验概率p(y=ck|X),因为对所有的类来说,公式(2)中分母的值都相同,所以只计算分子部分即可,具体步骤如下:
-
分类 1.计算该实例属于y=ck类的概率
p(y=ck|X)=p(y=ck)∏j=1np(X(j)=x(j)|y=ck)。。。(5)分类 2.确定该实例所属的分类y
y=argmaxckp(y=ck|X)。。。。(6)于是我们得到了新实例的分类结果
拉普拉斯平滑
- 到这里好像方法已经介绍完了,实则有一个小问题需要注意,在公式(3)(4)中,如果从样本中算出的概率值为0该怎么办呢?下面介绍一种简单方法,给学习步骤中的两个概率计算公式,分子和分母都分别加上一个常数,就可以避免这个问题。更新过后的公式如下:
-
p(y=ck)=∑Ni=1I(yi=ck)+λN+Kλ。。。。(7)
K是类的个数
p(xj=ajl|y=ck)=∑Ni=1I(xji=ajl,yi=ck)+λ∑Ni=1I(yi=ck)+Ljλ。。。(8)Lj是第j维特征的最大取值
可以证明,改进以后的(7)(8)仍然是概率。平滑因子λ=0即为(3)(4)实现的最大似然估计,这时会出现在本节开始时提到的0概率问题;而λ=1则避免了0概率问题,这种方法被称为拉普拉斯平滑。
实现:朴素贝叶斯下的文本分类
根据上面的算法流程,在这里实现一个句子极性划分的例子。所谓句子极性是指,句子所表达的情感色彩,例如积极/消极,这里(书里)使用的是侮辱性/非侮辱性。其实是什么类别不重要,只要给定有标签的训练数据,就可以得到分类模型。
下面简述实现思想和流程,给出代码。
算法思想和流程
- 给定的训练集是标定了 侮辱性/非侮辱性 的句子(因为是英语句子,所以基本视分词为已经解决的问题,如果是汉语,则要先进行分词),我们认为特征就是句子中的单个词语。单个词语有极性表征,整个句子所包含的单词的极性表征就是句子的极性。由以上的基础,应用朴素贝叶斯分类,就变成了这样的问题
-
初始化步,构建可以表征句子的特征向量(词汇表)。并根据这个特征向量,把训练集表征出来。从训练集中分离部分数据作为测试集。
-
学习步,计算类的先验概率和特征向量对应每一类的条件概率向量
-
分类步, 计算测试集中待分类句子在每一类的分类后验概率,取最大值作为其分类,并与给定标签比较,得到误分类率。
代码
初始化:
def loadDataSet():#数据格式postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]classVec = [0,1,0,1,0,1]#1 侮辱性文字 , 0 代表正常言论return postingList,classVecdef createVocabList(dataSet):#创建词汇表vocabSet = set([])for document in dataSet:vocabSet = vocabSet | set(document) #创建并集return list(vocabSet)def bagOfWord2VecMN(vocabList,inputSet):#根据词汇表,讲句子转化为向量returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] += 1return returnVec
训练:
def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory)/float(numTrainDocs)p0Num = ones(numWords);p1Num = ones(numWords)#计算频数初始化为1p0Denom = 2.0;p1Denom = 2.0 #即拉普拉斯平滑for i in range(numTrainDocs):if trainCategory[i]==1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = log(p1Num/p1Denom)#注意p0Vect = log(p0Num/p0Denom)#注意return p0Vect,p1Vect,pAbusive#返回各类对应特征的条件概率向量#和各类的先验概率
分类:
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):p1 = sum(vec2Classify * p1Vec) + log(pClass1)#注意p0 = sum(vec2Classify * p0Vec) + log(1-pClass1)#注意if p1 > p0:return 1else:return 0def testingNB():#流程展示listOPosts,listClasses = loadDataSet()#加载数据myVocabList = createVocabList(listOPosts)#建立词汇表trainMat = []for postinDoc in listOPosts:trainMat.append(bagOfWord2VecMN(myVocabList,postinDoc))p0V,p1V,pAb = trainNB0(trainMat,listClasses)#训练#测试testEntry = ['love','my','dalmation']thisDoc = bagOfWord2VecMN(myVocabList,testEntry)print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
注意:上述代码中标有注意的地方,是公式中概率连乘变成了对数概率相加。此举可以在数学上证明不会影响分类结果,且在实际计算中,避免了因概率因子远小于1而连乘造成的下溢出。
朴素贝叶斯方法(Naive Bayes)原理和实现相关推荐
- 朴素贝叶斯(naive bayes)原理小结
朴素贝叶斯(naive bayes)原理小结 1. 朴素贝叶斯的学习 1.1 基本假设:条件独立性 1.2 朴素贝叶斯分类器 1.3 后验概率的含义 2. 参数估计 2.1 极大似然估计 2.2 贝叶 ...
- 朴素贝叶斯(Naive Bayes)(原理+Python实现)
朴素贝叶斯(Naive Bayes)(原理+Python实现) 创作背景 算法分类 生成类算法 判别类算法 区别 知识补充 朴素贝叶斯算法 举个栗子 求解思路 求解过程(数学计算) 代码实现 自己实现 ...
- 朴素贝叶斯方法在旋转机械故障诊断中的应用
目录 前言 1 贝叶斯和朴素贝叶斯 1.1 贝叶斯定理 1.2 朴素贝叶斯 2 分类 3 朴素贝叶斯分类 3.1 准备阶段 3.2 训练阶段 3.3 应用阶段 4 旋转机械故障诊断案例 4.1 灵活朴 ...
- 朴素贝叶斯(naive bayes)分类
1. 概念回顾 1.1 条件概率公式 条件概率是指在事件B发生的条件下,事件A发生的概率.条件概率表示为P(A∣B)P(A|B)P(A∣B),读作"A在B发生的条件下发生的概率". ...
- 机器学习之朴素贝叶斯(Naive Bayes)
1 朴素贝叶斯算法介绍 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实 ...
- 朴素贝叶斯(Naive Bayes)分类和Gaussian naive Bayes
朴素贝叶斯(Naive Bayes) 参考资料:https://www.cnblogs.com/pinard/p/6069267.html 朴素贝叶斯最关键的就是 (强制认为每种指标都是独立的 ...
- 【机器学习sklearn】高斯朴素贝叶斯 Gaussian naive bayes
贝叶斯Bayes - Thomas Bayes 前言 一.贝叶斯决策论(Bayesian decision theory) 二.实例:高斯朴素贝叶斯 Gaussian Naive Bayes (Gau ...
- 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)
贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 其实 ...
- 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(二)
前言 在上一篇博客中,我们介绍了朴素贝叶斯方法以及详细推导.在这篇博客中,我们将介绍朴素贝叶斯的python3实现代码. 这里,我们将算法复述如下: 输入:数据集 T={(x1,y1),(x2,y2) ...
- 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(一)
前言 朴素贝叶斯方法通过构造数据生成分布来预测未知数据的类型,属于生成模型.这里之所以称为"朴素",是因为我们假设数据特征之间具有互相独立的假设. 在这篇博客里,我们将介绍朴素贝叶 ...
最新文章
- 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体
- 也谈谈程序员职业规划的几个问题——我的一些故事
- goto VS longjmp setjmp
- Sql Server查询语句的一些小技巧
- Spring抽取jdbc配置文件
- 在Go语言程序中使用gojson来解析JSON格式文件
- netstat 相关命令解析
- centos7部署nodejs新版
- 正则表达式2-测试代码
- Windows Server 2016上具有Docker容器SQL Server
- paip.输入法编程---词频调整--单字优先编码发音一致优先的问题跟调整
- 任何辨别你的计算机中了威金病毒
- 铃木敏文《零售的哲学》品读之对产品经理和程序员的现实意义 下篇
- 32位计算机的字长是多少个字节,32位计算机中,一个字长等于多少个字节
- 量化交易10-backtrader回测乌云盖顶K线形态图
- Java+SSM二手交易商城微信小程序源码【包调试运行】
- 推荐一个免费下matlab代码的网站
- 如何分辨IP地址的类型
- 如何在非简体中文版XP下面玩魔兽争霸
- 云波社区 l Mecha Morphing(变形机甲)游戏介绍
热门文章
- python 列表比较不同物质的吸热能力_飘着雪花的冬天
- mysql数据库sql语句中使用变量_mysql数据库sql语句中使用变量
- linux笔记之 搭建本地yum源,网卡的基本操作
- 服务器端使用sendRedirect跳转到客户端异常
- 在Web中如何运用JavaScript实现打印功能
- js代码计算济南出租车打车费用
- java 命令读取参数_如何读取/处理命令行参数?
- linux环境没有bzip2,Linux系统中安装使用Bzip2来压缩文件的方法讲解
- mysql数据库比较语句,六条比较有用的MySQL数据库操作的SQL语句小结
- 单片机定时器精准定时_PIC单片机的定时器精准计时的计算