朴素贝叶斯(naive Bayes)原理与应用
**
说明
**:
本文系转载,原作者博客:
http://blog.csdn.net/tanhongguang1/article/details/45016421
我稍微做了一些补充: naive Bayes实际上就是要求一组后验概率,有多少个呢?
咱们假设样本共有K个类别,样本的特征维度是M,每个维度上取值(离散)有Ci个,则总共要计算的厚颜概率有这么多个:
本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述。实例部分总结了《machine learning in action》一书中展示的一个该方法用于句子感情色彩分类的程序。1
- 方法概述
- 学习(参数估计)
- 实现:朴素贝叶斯下的文本分类
模型概述
- 朴素贝叶斯方法,是指
- 朴素:特征条件独立
根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是
在每一类的条件概率就可以了。类别y的先验概率可以通过训练集算出,同样通过训练集上的统计,可以得出对应每一类上的,条件独立的特征对应的条件概率向量。
如何统计,就是下一部分——学习——所关心的内容。
学习(参数估计)
下面介绍如何从数据中,学习得到朴素贝叶斯分类模型。概述分类方法,并提出一个值得注意的问题。
学习
- 训练集TrainingSet={(x1,y1),(x2,y2),...,(xN,yN)}为指示函数,若括号内成立,则计1,否则为0。
学习 2.接下来计算分子中的条件概率,设M
经过上述步骤,我们就得到了模型的基本概率,也就完成了学习的任务。
分类
-
通过学到的概率,给定未分类新实例X
于是我们得到了新实例的分类结果
拉普拉斯平滑
- 到这里好像方法已经介绍完了,实则有一个小问题需要注意,在公式(3)(4)中,如果从样本中算出的概率值为0该怎么办呢?下面介绍一种简单方法,给学习步骤中的两个概率计算公式,分子和分母都分别加上一个常数,就可以避免这个问题。更新过后的公式如下:
-
p(y=ck)=∑Ni=1I(yi=ck)+λN+Kλ。。。。(7)
维特征的最大取值
可以证明,改进以后的(7)(8)仍然是概率。平滑因子λ=0则避免了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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
训练:
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#返回各类对应特征的条件概率向量#和各类的先验概率
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
分类:
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(setOfWords2Vec(myVocabList,postinDoc))p0V,p1V,pAb = trainNB0(trainMat,listClasses)#训练#测试testEntry = ['love','my','dalmation']thisDoc = setOfWords2Vec(myVocabList,testEntry)print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
注意:上述代码中标有注意的地方,是公式中概率连乘变成了对数概率相加。此举可以在数学上证明不会影响分类结果,且在实际计算中,避免了因概率因子远小于1而连乘造成的下溢出。
- 模型概述
- 学习参数估计
- 学习
- 分类
- 拉普拉斯平滑
- 实现朴素贝叶斯下的文本分类
- 算法思想和流程
- 代码
- 参考:
李航. (2012). 统计学习方法.
Harrington, P. (2013). 机器学习实战. 人民邮电出版社, 北京 ↩
朴素贝叶斯(naive Bayes)原理与应用相关推荐
- 朴素贝叶斯(naive bayes)
朴素贝叶斯(naive bayes) 标签: Python 机器学习 主要參考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征 ...
- 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测
目录 一.简介和环境准备 简介: 环境: 二.实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入.分析 ...
- 机器学习一:朴素贝叶斯(Naive Bayes)
朴素贝叶斯 Naive Bayes 1. Introduction 1.1 离散属性 1.2 连续属性 1.2.1 Gaussian Naive Bayes 1.2.2 Multinomial Nai ...
- 【手写算法实现】 之 朴素贝叶斯 Naive Bayes 篇
[手写算法实现] 之 朴素贝叶斯 Naive Bayes 篇 朴素贝叶斯模型(naive bayes)属于分类模型,也是最为简单的概率图模型,对于之后理解HMM.CRF等模型,大有裨益.这里手写算法介 ...
- 机器学习笔记——朴素贝叶斯(Naive Bayes)
1贝叶斯算法简介 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算 ...
- 朴素贝叶斯(Naive Bayes),“Naive”在何处?
加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes). Naive的发音是"乃一污",意思是"朴素的"."幼稚的".&q ...
- 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes
文章目录 0. 前言 1. 朴素贝叶斯算法 2. 半朴素贝叶斯算法 2.1. ODE 2.2. SPODE 2.3. TAN 2.4. AODE 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔 ...
- 机器学习算法: 朴素贝叶斯(Naive Bayes)
朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一.它是基于贝叶斯定义和特征条件独立假设的分类器方法.由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数 ...
- 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法
贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...
- spark mllib 朴素贝叶斯 naive bayes
为什么80%的码农都做不了架构师?>>> 数据源说明 第一列每行的标签,其他列为特征 运行代码如下 package spark.logisticRegressionimport ...
最新文章
- UVa 10055 - Hashmat the Brave Warrior
- Linux下配置Node.js环境
- linux 下的Memcached安装和配置
- vue使用query传参页面刷新数据丢失问题
- 【嵌入式】C语言高级编程-长度为0的数组(05)
- Undefined index: submit in的错误处理
- Nginx虚拟主机别名的配置
- 主流路由器固件dd-wrt,tomato,open…
- win10应用商店linux_解决win10应用商店“由于公司策略 此应用已被阻止”的方法...
- 电脑基础:键盘F1~F12你会用吗?天天都看到,但会用的真没几个!
- Xilinx FPGA资源解析与使用系列——Transceiver(十)PRBS、RX Equalizer、CDR
- iOS 录制视频MOV格式转MP4
- 2021年G3锅炉水处理考试内容及G3锅炉水处理试题及解析
- 数学建模——一元线性回归
- 华为企业园区网络建设技术方案建议书
- ESXI6.7升级到ESXI7.0
- springMVC helloword示例
- 让火狐等浏览器也能使用HTC(HTML component)的方法
- 机器学习的划分:监督学习、非监督学习、强化学习、进化学习 概述 (二)
- Revitalizing CNN Attentions via Transformers in Self-Supervised Visual Representation Learning
热门文章
- 将远程数据库中的某表数据复制到本数据库(ORACLE)
- Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题
- hdu 1251(字典树)
- 时间操作(Java版)—获取给定时间与当前系统时间的差值(以毫秒为单位)
- Intent 与 IntentFilter 详解
- SQL Server数据库查询sql去掉小数后点后末尾的0
- Protobuf C++类中成员函数GetCachedSize()与ByteSize()的区别
- C++11 右值引用与移动语义
- (一)CentOS Docker 安装
- springboot MVC拓展配置