模型概述

朴素贝叶斯方法,是指
朴素:特征条件独立
贝叶斯:基于贝叶斯定理

根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是

p(y|x)=p(x|y)p(y)p(x)。。。。。。(1)

在这里,x是一个特征向量,将设x维度为M。因为朴素的假设,即特征条件独立,根据全概率公式展开,公式(1)可以表达为

p(y=ck|x)=∏Mi=1p(xi|y=ck)p(y=ck)∑kp(y=ck)∏Mi=1P(xi|y=ck)。。。。(2)

这里,只要分别估计出,特征 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)原理和实现相关推荐

  1. 朴素贝叶斯(naive bayes)原理小结

    朴素贝叶斯(naive bayes)原理小结 1. 朴素贝叶斯的学习 1.1 基本假设:条件独立性 1.2 朴素贝叶斯分类器 1.3 后验概率的含义 2. 参数估计 2.1 极大似然估计 2.2 贝叶 ...

  2. 朴素贝叶斯(Naive Bayes)(原理+Python实现)

    朴素贝叶斯(Naive Bayes)(原理+Python实现) 创作背景 算法分类 生成类算法 判别类算法 区别 知识补充 朴素贝叶斯算法 举个栗子 求解思路 求解过程(数学计算) 代码实现 自己实现 ...

  3. 朴素贝叶斯方法在旋转机械故障诊断中的应用

    目录 前言 1 贝叶斯和朴素贝叶斯 1.1 贝叶斯定理 1.2 朴素贝叶斯 2 分类 3 朴素贝叶斯分类 3.1 准备阶段 3.2 训练阶段 3.3 应用阶段 4 旋转机械故障诊断案例 4.1 灵活朴 ...

  4. 朴素贝叶斯(naive bayes)分类

    1. 概念回顾 1.1 条件概率公式 条件概率是指在事件B发生的条件下,事件A发生的概率.条件概率表示为P(A∣B)P(A|B)P(A∣B),读作"A在B发生的条件下发生的概率". ...

  5. 机器学习之朴素贝叶斯(Naive Bayes)

    1 朴素贝叶斯算法介绍 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实 ...

  6. 朴素贝叶斯(Naive Bayes)分类和Gaussian naive Bayes

    朴素贝叶斯(Naive Bayes)   参考资料:https://www.cnblogs.com/pinard/p/6069267.html   朴素贝叶斯最关键的就是 (强制认为每种指标都是独立的 ...

  7. 【机器学习sklearn】高斯朴素贝叶斯 Gaussian naive bayes

    贝叶斯Bayes - Thomas Bayes 前言 一.贝叶斯决策论(Bayesian decision theory) 二.实例:高斯朴素贝叶斯 Gaussian Naive Bayes (Gau ...

  8. 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)

    贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 其实 ...

  9. 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(二)

    前言 在上一篇博客中,我们介绍了朴素贝叶斯方法以及详细推导.在这篇博客中,我们将介绍朴素贝叶斯的python3实现代码. 这里,我们将算法复述如下: 输入:数据集 T={(x1,y1),(x2,y2) ...

  10. 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(一)

    前言 朴素贝叶斯方法通过构造数据生成分布来预测未知数据的类型,属于生成模型.这里之所以称为"朴素",是因为我们假设数据特征之间具有互相独立的假设. 在这篇博客里,我们将介绍朴素贝叶 ...

最新文章

  1. 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体
  2. 也谈谈程序员职业规划的几个问题——我的一些故事
  3. goto VS longjmp setjmp
  4. Sql Server查询语句的一些小技巧
  5. Spring抽取jdbc配置文件
  6. 在Go语言程序中使用gojson来解析JSON格式文件
  7. netstat 相关命令解析
  8. centos7部署nodejs新版
  9. 正则表达式2-测试代码
  10. Windows Server 2016上具有Docker容器SQL Server
  11. paip.输入法编程---词频调整--单字优先编码发音一致优先的问题跟调整
  12. 任何辨别你的计算机中了威金病毒
  13. 铃木敏文《零售的哲学》品读之对产品经理和程序员的现实意义 下篇
  14. 32位计算机的字长是多少个字节,32位计算机中,一个字长等于多少个字节
  15. 量化交易10-backtrader回测乌云盖顶K线形态图
  16. Java+SSM二手交易商城微信小程序源码【包调试运行】
  17. 推荐一个免费下matlab代码的网站
  18. 如何分辨IP地址的类型
  19. 如何在非简体中文版XP下面玩魔兽争霸
  20. 云波社区 l Mecha Morphing(变形机甲)游戏介绍

热门文章

  1. python 列表比较不同物质的吸热能力_飘着雪花的冬天
  2. mysql数据库sql语句中使用变量_mysql数据库sql语句中使用变量
  3. linux笔记之 搭建本地yum源,网卡的基本操作
  4. 服务器端使用sendRedirect跳转到客户端异常
  5. 在Web中如何运用JavaScript实现打印功能
  6. js代码计算济南出租车打车费用
  7. java 命令读取参数_如何读取/处理命令行参数?
  8. linux环境没有bzip2,Linux系统中安装使用Bzip2来压缩文件的方法讲解
  9. mysql数据库比较语句,六条比较有用的MySQL数据库操作的SQL语句小结
  10. 单片机定时器精准定时_PIC单片机的定时器精准计时的计算