朴素贝叶斯分类算法原理与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连接sql server乱码的解决方法
Jan 28 Python
Python中的进程分支fork和exec详解
Apr 11 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
Django在win10下的安装并创建工程
Nov 20 Python
python采集微信公众号文章
Dec 20 Python
详解python读取和输出到txt
Mar 29 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python读文件的步骤
Oct 08 Python
python基于gevent实现并发下载器代码实例
Nov 01 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
pandas取dataframe特定行列的实现方法
May 24 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php中常用编辑器推荐
2007/01/02 PHP
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
JavaScript字符串对象
2017/01/14 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
python实现ip查询示例
2014/03/26 Python
python Django模板的使用方法
2016/01/14 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
python 制作磁力搜索工具
2021/03/04 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
爱国卫生月活动总结范文
2014/04/25 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android