Python实现朴素贝叶斯的学习与分类过程解析


Posted in Python onAugust 24, 2019

 概念简介:

朴素贝叶斯基于贝叶斯定理,它假设输入随机变量的特征值是条件独立的,故称之为“朴素”。简单介绍贝叶斯定理:

Python实现朴素贝叶斯的学习与分类过程解析

乍看起来似乎是要求一个概率,还要先得到额外三个概率,有用么?其实这个简单的公式非常贴切人类推理的逻辑,即通过可以观测的数据,推测不可观测的数据。举个例子,也许你在办公室内不知道外面天气是晴天雨天,但是你观测到有同事带了雨伞,那么可以推断外面八成在下雨。

若X 是要输入的随机变量,则Y 是要输出的目标类别。对X 进行分类,即使求的使P(Y|X) 最大的Y值。若X 为n 维特征变量 X = {A1, A2, …..An} ,若输出类别集合为Y = {C1, C2, …. Cm} 。

X 所属最有可能类别 y = argmax P(Y|X), 进行如下推导:

Python实现朴素贝叶斯的学习与分类过程解析

朴素贝叶斯的学习

有公式可知,欲求分类结果,须知如下变量:

各个类别的条件概率,

Python实现朴素贝叶斯的学习与分类过程解析

输入随机变量的特质值的条件概率

Python实现朴素贝叶斯的学习与分类过程解析

示例代码:

import copy

class native_bayes_t:
  
  def __init__(self, character_vec_, class_vec_):
    """
    构造的时候需要传入特征向量的值,以数组方式传入
    参数1 character_vec_ 格式为 [("character_name",["","",""])]
    参数2 为包含所有类别的数组 格式为["class_X", "class_Y"]
    """
    self.class_set = {}
    # 记录该类别下各个特征值的条件概率
    character_condition_per = {}
    for character_name in character_vec_:
      character_condition_per[character_name[0]] = {}
      for character_value in character_name[1]:
        character_condition_per[character_name[0]][character_value] = {
          'num'      : 0, # 记录该类别下该特征值在训练样本中的数量,
          'condition_per' : 0.0 # 记录该类别下各个特征值的条件概率
        }
    for class_name in class_vec:
      self.class_set[class_name] = {
        'num'           : 0, # 记录该类别在训练样本中的数量,
        'class_per'        : 0.0, # 记录该类别在训练样本中的先验概率,
        'character_condition_per' : copy.deepcopy(character_condition_per),
      }

    #print("init", character_vec_, self.class_set) #for debug

  def learn(self, sample_):
    """
    learn 参数为训练的样本,格式为
    [
      {
        'character' : {'character_A':'A1'}, #特征向量
        'class_name' : 'class_X'       #类别名称
      }
    ]
    """
    for each_sample in sample:
      character_vec = each_sample['character']
      class_name   = each_sample['class_name']

      data_for_class = self.class_set[class_name]
      data_for_class['num'] += 1

      # 各个特质值数量加1
      for character_name in character_vec:
        character_value = character_vec[character_name]
        data_for_character = data_for_class['character_condition_per'][character_name][character_value]

        data_for_character['num'] += 1

    # 数量计算完毕, 计算最终的概率值
    sample_num = len(sample)
    for each_sample in sample:
      character_vec = each_sample['character']
      class_name  = each_sample['class_name']

      data_for_class = self.class_set[class_name]
      # 计算类别的先验概率
      data_for_class['class_per'] = float(data_for_class['num']) / sample_num

      # 各个特质值的条件概率
      for character_name in character_vec:
        character_value = character_vec[character_name]
        
        data_for_character = data_for_class['character_condition_per'][character_name][character_value]

        data_for_character['condition_per'] = float(data_for_character['num']) / data_for_class['num']

    from pprint import pprint
    pprint(self.class_set) #for debug

  def classify(self, input_):
    """
      对输入进行分类,输入input的格式为
    {
      "character_A":"A1",
      "character_B":"B3",
    }
    """
    best_class = ''
    max_per  = 0.0
    for class_name in self.class_set:
      class_data = self.class_set[class_name]
      per = class_data['class_per']
      # 计算各个特征值条件概率的乘积
      for character_name in input_:
        character_per_data = class_data['character_condition_per'][character_name]
        per = per * character_per_data[input_[character_name]]['condition_per']
      print(class_name, per)
      if per >= max_per:
        best_class = class_name

    return best_class

character_vec = [("character_A",["A1","A2","A3"]), ("character_B",["B1","B2","B3"])]
class_vec   = ["class_X", "class_Y"]
bayes = native_bayes_t(character_vec, class_vec)


sample = [
      {
        'character' : {'character_A':'A1', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_X'       #类别名称
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_X'       #类别名称
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_X'       #类别名称
      },
      {
        'character' : {'character_A':'A2', 'character_B':'B2'}, #特征向量
        'class_name' : 'class_X'       #类别名称
      },
      {
        'character' : {'character_A':'A2', 'character_B':'B2'}, #特征向量
        'class_name' : 'class_Y'       #类别名称
      },
      {
        'character' : {'character_A':'A3', 'character_B':'B1'}, #特征向量
        'class_name' : 'class_Y'       #类别名称
      },
      {
        'character' : {'character_A':'A1', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_Y'       #类别名称
      },
      {
        'character' : {'character_A':'A1', 'character_B':'B3'}, #特征向量
        'class_name' : 'class_Y'       #类别名称
      },
      
    ]

input_data ={
  "character_A":"A1",
  "character_B":"B3",
}

bayes.learn(sample)
print(bayes.classify(input_data))

总结:

朴素贝叶斯分类实现简单,预测的效率较高

朴素贝叶斯成立的假设是个特征向量各个属性条件独立,建模的时候需要特别注意

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

Python 相关文章推荐
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
python的re正则表达式实例代码
Jan 24 Python
Python get获取页面cookie代码实例
Sep 12 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
Python 列表反转显示的四种方法
Nov 16 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 Python
FFrpc python客户端lib使用解析
Aug 24 #Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 #Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 #Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 #Python
python解释器spython使用及原理解析
Aug 24 #Python
python爬虫之爬取百度音乐的实现方法
Aug 24 #Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 #Python
You might like
从wamp到xampp的升级之路
2015/04/08 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
js new Date()实例测试
2019/10/31 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python自动zip压缩目录的方法
2015/06/28 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
Ajax和javascript的区别
2013/07/20 面试题
护士检查书
2014/01/17 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
实习生岗位职责
2014/04/12 职场文书
大学生村官演讲稿
2014/04/25 职场文书
电台编导求职信
2014/05/06 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
计算机专业自荐信
2015/03/05 职场文书
论语读书笔记
2015/06/26 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电