朴素贝叶斯分类算法原理与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实现网站文件的全备份和差异备份
Nov 30 Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
Python 转义字符详细介绍
Mar 21 Python
Python有序字典简单实现方法示例
Sep 28 Python
Python中pymysql 模块的使用详解
Aug 12 Python
python提取xml里面的链接源码详解
Oct 15 Python
python 多进程队列数据处理详解
Dec 23 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
在python中使用nohup命令说明
Apr 16 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
Python中对象的比较操作==和is区别详析
Feb 12 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
ajax php 实现写入数据库
2009/09/02 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python多线程编程简单介绍
2015/04/13 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
关于python中的xpath解析定位
2020/03/06 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
2014国培学习感言
2014/03/05 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
2014年防汛工作总结
2014/12/08 职场文书
小学运动会报道稿
2015/07/22 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
15个值得收藏的JavaScript函数
2021/09/15 Javascript
24年收藏2000多部退役军用电台
2022/02/18 无线电