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中的偏函数
Apr 27 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
python生成二维码的实例详解
Oct 29 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 Python
Python整数对象实现原理详解
Jul 01 Python
python 实现return返回多个值
Nov 19 Python
Django Channel实时推送与聊天的示例代码
Apr 30 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
浅析Python迭代器的高级用法
Jul 16 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
什么是Python包的循环导入
Sep 08 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
MYSQL环境变量设置方法
2007/01/15 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
django使用LDAP验证的方法示例
2018/12/10 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
护理自我鉴定范文
2013/10/06 职场文书
车间调度岗位职责
2013/11/30 职场文书
英语感恩演讲稿
2014/01/14 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
运动会表扬稿
2015/01/16 职场文书
客房领班岗位职责
2015/02/11 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL