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 相关文章推荐
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
Python新手如何理解循环加载模块
May 29 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
Python实现自动签到脚本功能
Aug 20 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 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项目的方法
2006/10/09 PHP
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
js实现图片实时时钟
2020/01/15 Javascript
详解React 条件渲染
2020/07/08 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现井字棋游戏
2020/03/30 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
美国第一香水网站:Perfume.com
2017/01/23 全球购物
行政部工作岗位职责范本
2014/03/05 职场文书
民生工程实施方案
2014/03/22 职场文书
消防安全宣传口号
2014/06/10 职场文书
法语专业求职信
2014/07/20 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
2016年会开场白台词
2015/06/01 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL