python机器学习之贝叶斯分类


Posted in Python onMarch 26, 2018

一、贝叶斯分类介绍

贝叶斯分类器是一个统计分类器。它们能够预测类别所属的概率,如:一个数据对象属于某个类别的概率。贝叶斯分类器是基于贝叶斯定理而构造出来的。对分类方法进行比较的有关研究结果表明:简单贝叶斯分类器(称为基本贝叶斯分类器)在分类性能上与决策树和神经网络都是可比的。在处理大规模数据库时,贝叶斯分类器已表现出较高的分类准确性和运算性能。基本贝叶斯分类器假设一个指定类别中各属性的取值是相互独立的。这一假设也被称为:类别条件独立,它可以帮助有效减少在构造贝叶斯分类器时所需要进行的计算。

二、贝叶斯定理

p(A|B) 条件概率 表示在B发生的前提下,A发生的概率;

 python机器学习之贝叶斯分类

基本贝叶斯分类器通常都假设各类别是相互独立的,即各属性的取值是相互独立的。对于特定的类别且其各属性相互独立,就会有:

 P(AB|C) = P(A|C)*P(B|C)

三、贝叶斯分类案例

1.分类属性是离散

假设有样本数为6个的训练集数字如下:

python机器学习之贝叶斯分类

现在假设来又来了一个人是症状为咳嗽的教师,那这位教师是患上感冒、发烧、鼻炎的概率分别是多少呢?这个问题可以用贝叶斯分类来解决,最后三个疾病哪个概率高,就把这个咳嗽的教师划为哪个类,实质就是分别求p(感冒|咳嗽*教师)和P(发烧 | 咳嗽 * 教师)

P(鼻炎 | 咳嗽 * 教师) 的概率;

假设各个类别相互独立:

python机器学习之贝叶斯分类

python机器学习之贝叶斯分类

 python机器学习之贝叶斯分类

 P(感冒)=3/6    P(发烧)=1/6     P(鼻炎)=2/6

 p(咳嗽) = 3/6   P(教师)= 2/6

 p(咳嗽 | 感冒) = 2/3   P(教师 | 感冒) = 1/3

python机器学习之贝叶斯分类

按以上方法可分别求  P(发烧 | 咳嗽 × 教师) 和P(鼻炎 |咳嗽 × 教师 )的概率;

2.分类属性连续

如果按上面的样本上加一个年龄的属性;因为年龄是连续,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算;这时,可以假设感冒、发烧、鼻炎分类的年龄都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数;

python机器学习之贝叶斯分类

下面就以求P(年龄=15|感冒)下的概率为例说明:

   第一:求在感冒类下的年龄平均值  u=(15+48+12)/3=25

   第二:求在感冒类下年龄的方差 代入下面公司可求:方差=266

python机器学习之贝叶斯分类

   第三:把年龄=15 代入正太分布公式如下:参数代进去既可以求的P(age=15|感冒)的概率

python机器学习之贝叶斯分类

其他属性按离散方法可求;

四、概率值为0处理

假设有这种情况出现,在训练集上感冒的元祖有10个,有0个是孩子,有6个是学生,有4个教师;当分别求

      P(孩子|感冒) =0; P(学生|感冒)=6/10 ; P(教师|感冒)=4/10  ;出现了概率为0的现象,为了避免这个现象,在假设训练元祖数量大量的前提下,可以使用拉普拉斯估计法,把每个类型加1这样可求的分别概率是

      P(孩子|感冒) = 1/13  ; P(学生|感冒) = 7/13   ; P(教师|感冒)=4/13

 五、垃圾邮件贝叶斯分类案例

1.准备训练集数据

假设postingList为一个六个邮件内容,classVec=[0,1,0,1,0,1]为邮件类型,设1位垃圾邮件

def loadDataSet(): 
 postingList =[['my','dog','has',' flea','problems','help','please'], 
     ['mybe','not','take','him','to','dog','park','stupid'], 
     ['my','dalmation','is','so','cute','i','love','hime'], 
     ['stop','posting','stupid','worthless','garbage'], 
     ['mr','licks','ate','my','steak','how','to','stop','hime'], 
     ['quit','buying','worthless','dog','food','stupid','quit']] 
 classVec =[0,1,0,1,0,1] 
 return postingList,classVec

2.根据所有的邮件内容创建一个所有单词集合

def createVocabList(dataSet): 
 vocabSet =set([]) 
 for document in dataSet: 
  vocabSet = vocabSet | set(document) 
 return list(vocabSet)

测试后获取所有不重复单词的集合见下一共:

python机器学习之贝叶斯分类

3.根据2部所有不重复的单词集合对每个邮件内容向量化 

def bagOfWords2VecMN(vocabList,inputSet): 
 returnVec =[0]*len(vocabList) 
 for word in inputSet: 
  returnVec[vocabList.index(word)] +=1 
 return returnVec

测试后可得如下,打印内容为向量化的六个邮件内容

python机器学习之贝叶斯分类

4.训练模型,此时就是分别求p(垃圾|文档) = p(垃圾)*p(文档|垃圾)/p(文档)

def trainNBO(trainMatrix,trainCategory): 
  numTrainDocs = len(trainMatrix) 
  numWords =len(trainMatrix[0]) 
  #计算p(垃圾)的概率 
  pAbusive = sum(trainCategory)/float(numTrainDocs) 
  #为了防止一个概率为0,假设都有一个 
  p0Num =ones(numWords); 
  p1Num = ones(numWords) 
  p0Denom =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 = np.log((p1Num/p1Denom)) 
  p0Vect = np.log(p0Num/p0Denom) 
  return p0Vect,p1Vect,pAbusive

对训练模型进行测试结果如下:

python机器学习之贝叶斯分类

5.定义分类方法

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): 
  p1 =sum(vec2Classify * p1Vec) +math.log(pClass1) 
  p0 = sum(vec2Classify * p0Vec)+math.log(1.0-pClass1) 
  if p1>p0: 
    return 1 
  else: 
    return 0

6.以上分类完成,下面就对其进行测试,测试方法如下:

def testingNB(): 
  listOPosts,ListClasses = loadDataSet(); 
  myVocabList = createVocabList(listOPosts) 
  trainMat=[] 
  for postinDoc in listOPosts: 
    trainMat.append(bagOfWords2VecMN(myVocabList,postinDoc)) 
  p0V,p1V,pAb =trainNBO(trainMat,ListClasses) 
  testEntry =['stupid','my','dalmation'] 
  thisDoc = array(bagOfWords2VecMN(myVocabList,testEntry)) 
  print testEntry,'classified as',classifyNB(thisDoc,p0V,p1V,pAb)

结果如下:

python机器学习之贝叶斯分类

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
python将txt文件读入为np.array的方法
Oct 30 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python logging通过json文件配置的步骤
Apr 27 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
Python日志模块logging用法
Jun 05 Python
利用python实现微信头像加红色数字功能
Mar 26 #Python
Python扩展内置类型详解
Mar 26 #Python
python函数式编程学习之yield表达式形式详解
Mar 25 #Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 #Python
python实现隐马尔科夫模型HMM
Mar 25 #Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 #Python
Python实现修改文件内容的方法分析
Mar 25 #Python
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python程序设计入门(4)模块和包
2014/06/16 Python
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
分分钟入门python语言
2018/03/20 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python3 log10()函数简单用法
2019/02/19 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
python属于解释语言吗
2020/06/11 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
《记承天寺夜游》教学反思
2014/02/16 职场文书
公司募捐倡议书
2014/05/14 职场文书
高考学习决心书
2015/02/04 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
招商银行工作证明
2015/06/17 职场文书
Python Pandas 删除列操作
2022/03/16 Python
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server