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之坑爹的字符编码
Sep 28 Python
Python 内置函数complex详解
Oct 23 Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
老生常谈python中的重载
Nov 11 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
python nmap实现端口扫描器教程
May 28 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
python中用ctypes模拟点击的实例讲解
Nov 26 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
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
低碳环保倡议书
2014/04/14 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android