朴素贝叶斯分类算法原理与Python实现与使用方法案例


Posted in Python onJune 26, 2018

本文实例讲述了朴素贝叶斯分类算法原理与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实现与使用方法案例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python处理大数字的方法
May 27 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python字符串和常用数据结构知识总结
May 21 Python
Python安装与基本数据类型教程详解
May 29 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 Python
Flask缓存静态文件的具体方法
Aug 02 Python
python实现俄罗斯方块
Jun 26 #Python
解决python报错MemoryError的问题
Jun 26 #Python
pygame实现俄罗斯方块游戏
Jun 26 #Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 #Python
解决python读取几千万行的大表内存问题
Jun 26 #Python
详解Python3的TFTP文件传输
Jun 26 #Python
python3爬取数据至mysql的方法
Jun 26 #Python
You might like
php异常处理方法实例汇总
2015/06/24 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
python中list列表的高级函数
2016/05/17 Python
mac系统安装Python3初体验
2018/01/02 Python
Python中GIL的使用详解
2018/10/03 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python占用的内存优化教程
2019/07/28 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
高二化学教学反思
2014/01/30 职场文书
法人代表证明书
2014/09/18 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
大学生读书笔记大全
2015/07/01 职场文书
小学语文教学反思范文
2016/03/03 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书