朴素贝叶斯分类算法原理与Python实现与使用方法案例
作者:ahu-lichang 发布时间:2022-03-11 10:59:04
本文实例讲述了朴素贝叶斯分类算法原理与Python实现与使用方法。分享给大家供大家参考,具体如下:
朴素贝叶斯分类算法
1、朴素贝叶斯分类算法原理
1.1、概述
贝叶斯分类算法是一大类分类算法的总称
贝叶斯分类算法以样本可能属于某类的概率来作为分类依据
朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种
注:朴素的意思是条件概率独立性
P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立
P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z)
1.2、算法思想
朴素贝叶斯的思想是这样的:
如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A
通俗来说比如,你在街上看到一个黑人,我让你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?
在你的脑海中,有这么一个判断流程:
①、这个人的肤色是黑色 <特征>
②、黑色人种是非洲人的概率最高 <条件概率:黑色条件下是非洲人的概率>
③、没有其他辅助信息的情况下,最好的判断就是非洲人
这就是朴素贝叶斯的思想基础。
再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里?
提取特征:
肤色: 黑
语言: 英语
黑色人种来自非洲的概率: 80%
黑色人种来自于美国的概率:20%
讲英语的人来自于非洲的概率:10%
讲英语的人来自于美国的概率:90%
在我们的自然思维方式中,就会这样判断:
这个人来自非洲的概率:80% * 10% = 0.08
这个人来自美国的概率:20% * 90% =0.18
我们的判断结果就是:此人来自美国!
其蕴含的数学原理如下:
p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)* p(xy)/p(xy)=p(A|x)p(A|y)
P(类别 | 特征)=P(特征 | 类别)*P(类别) / P(特征)
1.3、算法步骤
①、分解各类先验样本数据中的特征
②、计算各类数据中,各特征的条件概率
(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......)
③、分解待分类数据中的特征(特征1、特征2、特征3、特征4......)
④、计算各特征的各条件概率的乘积,如下所示:
判断为A类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4).....
判断为B类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4).....
判断为C类的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4).....
......
⑤、结果中的最大值就是该样本所属的类别
1.4、算法应用举例
大众点评、淘宝等电商上都会有大量的用户评论,比如:
1、衣服质量太差了!!!!颜色根本不纯!!! | 0 |
2、我有一有种上当受骗的感觉!!!! | 0 |
3、质量太差,衣服拿到手感觉像旧货!!! | 0 |
4、上身漂亮,合身,很帅,给卖家点赞 | 1 |
5、穿上衣服帅呆了,给点一万个赞 | 1 |
6、我在他家买了三件衣服!!!!质量都很差! | 0 |
其中1/2/3/6是差评,4/5是好评
现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:
a、这么差的衣服以后再也不买了
b、帅,有逼格
……
1.5、算法应用流程
①、分解出先验数据中的各特征
(即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”……)
②、计算各类别(好评、差评)中,各特征的条件概率
(比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评) 、p(“差”|差评)……)
③、分解出待分类样本的各特征
(比如分解a: “差” “衣服” ……)
④、计算类别概率
P(好评) = p(好评|“差”) *p(好评|“衣服”)*……
P(差评) = p(差评|“差”) *p(差评|“衣服”)*……
⑤、显然P(差评)的结果值更大,因此a被判别为“差评”
1.6、朴素贝叶斯分类算法案例
大体计算方法:
P(好评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 好评) * P(好评) / P(单词1,单词2,单词3)
因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 好评) P(好评)
每个单词之间都是相互独立的---->P(单词1 | 好评)P(单词2 | 好评)P(单词3 | 好评)*P(好评)
P(单词1 | 好评) = 单词1在样本好评中出现的总次数/样本好评句子中总的单词数
P(好评) = 样本好评的条数/样本的总条数
同理:
P(差评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 差评) * P(差评) / P(单词1,单词2,单词3)
因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 差评) P(差评)
每个单词之间都是相互独立的---->P(单词1 | 差评)P(单词2 | 差评)P(单词3 | 差评)*P(差评)
2、 Python案例
#!/usr/bin/python
# coding=utf-8
from numpy import *
# 过滤网站的恶意留言 侮辱性: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]
return postingList, classVec
# 创建一个包含在所有文档中出现的不重复词的列表
def createVocabList(dataSet):
vocabSet = set([]) # 创建一个空集
for document in dataSet:
vocabSet = vocabSet | set(document) # 创建两个集合的并集
return list(vocabSet)
# 将文档词条转换成词向量
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0]*len(vocabList) # 创建一个其中所含元素都为0的向量
for word in inputSet:
if word in vocabList:
# returnVec[vocabList.index(word)] = 1 # index函数在字符串里找到字符第一次出现的位置 词集模型
returnVec[vocabList.index(word)] += 1 # 文档的词袋模型 每个单词可以出现多次
else: print "the word: %s is not in my Vocabulary!" % word
return returnVec
# 朴素贝叶斯分类器训练函数 从词向量计算概率
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
# p0Num = zeros(numWords); p1Num = zeros(numWords)
# p0Denom = 0.0; p1Denom = 0.0
p0Num = ones(numWords); # 避免一个概率值为0,最后的乘积也为0
p1Num = ones(numWords); # 用来统计两类数据中,各词的词频
p0Denom = 2.0; # 用于统计0类中的总数
p1Denom = 2.0 # 用于统计1类中的总数
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 = p1Num / p1Denom
# p0Vect = p0Num / p0Denom
p1Vect = log(p1Num / p1Denom) # 在类1中,每个次的发生概率
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.0-pClass1)
if p1 > p0:
return 1
else:
return 0
def testingNB():
listOPosts, listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
trainMat = []
for postinDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
testEntry = ['love','my','dalmation']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
testEntry = ['stupid','garbage']
thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
# 调用测试方法----------------------------------------------------------------------
testingNB()
运行结果:
希望本文所述对大家Python程序设计有所帮助。
来源:https://www.cnblogs.com/ahu-lichang/p/7157855.html


猜你喜欢
- 在html 5增加了新元素header、footer,测试过发现IE不能解析html 5新增的元素。代码如下:<!DOCTYPE&nb
- xhtml+css页面制作过程中问题的解决方案,说是解决方案应该有点过了,充其量只不过是给刚刚开始学标准页面制作的朋友们的一些小建议,如果讲
- 导语昨天看到有留言竟然说我是月更博主,我明明更新地这么勤快(心虚.jpg)。看吧,昨天刚更新过,今天又来更新了。今天还是带大家写个小游戏吧,
- 1. 目的每次新配置 Ubuntu 系统,免不了配置 apt 源。尽管可以通过 GUI 界面进行选择,但自动化程度不够,不同桌面(Unity
- 1.Cuda的下载安装及配置 首先我们要确定本机是否有独立显卡。在计算机-管理-设备管
- 大家好,今天就来说说requests的基础用法。1.准备工作首先呢,我们要确保我们已经之前安装requests库,如果没有安装,可以自行搜索
- 根据不同配置文件调用不同的验证函数检查输入。可以根据需求更改验证函数的逻辑。def VerifyData(func):  
- --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000
- 一、mysql中实现指定排序需求一般情况下,我们排序都是直接利用 order by 字段 asc/desc;但是如果要排序的字段数据格式并不
- 本文实例讲述了JavaScript实现模仿桌面窗口的方法。分享给大家供大家参考。具体如下:这里使用JS模仿了桌面窗口的移动、八个方向的缩放、
- 项目场景:在做目标检测时,重新进行标注会耗费大量的时间,如果能够批量对xml中的信息进行修改,那么将会节省大量的时间,接下来将详细介绍如何修
- 前言 在tensorflow的官方文档中得卷积神经网络一章,有一个使用cifar-10图片数据集的实验,搭建卷积神经网络倒不难,但是那个ci
- Flask是一个用Python编写的Web应用程序框架,Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发
- 用Python生成一个简单的密码本,一般是有数字、字母和符号组成,这里用到的思路主要是穷举法。通过使用pywifi 模块,根据密码本暴力破解
- 表格中我们经常需要动态加载数据, 如果有多个页面都需要用到表格, 那我希望可以有个组件, 只传数据过去显示, 不用每个页面都去写这么一段内容
- 1.反变换法设需产生分布函数为F(x)的连续随机数X。若已有[0,1]区间均匀分布随机数R,则产生X的反变换公式为:F(x)=r, 即x=F
- 上一篇:微软建议的ASP性能优化28条守则(7)技巧 22:尽可能使用 Server.Transfer 代替 Response.Redire
- 通过使用turtle绘画象棋棋盘,供大家参考,具体内容如下# 绘制象棋棋盘import turtlet = turtle.Pen()t.wi
- 本文实例讲述了Python字典生成式、集合生成式、生成器用法。分享给大家供大家参考,具体如下:字典生成式:跟列表生成式一样,字典生成式用来快
- 如果使用注释的方法得当的话,为你的CSS文件添加注释可以在开发过程中给予你和其他人很大的帮助。最常见的是为CSS样式规则添加提示信息,不过使