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多线程编程(一):threading模块综述
Apr 05 Python
Python修改MP3文件的方法
Jun 15 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
Python进阶_关于命名空间与作用域(详解)
May 29 Python
Python实现购物车购物小程序
Apr 18 Python
python实现自动发送邮件
Jun 20 Python
python实现猜数字小游戏
Mar 24 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
Python ATM功能实现代码实例
Mar 19 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
python实现监听键盘
Apr 26 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
PHP学习之PHP变量
2006/10/09 PHP
php下将XML转换为数组
2010/01/01 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
js document.write()使用介绍
2014/02/21 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python爬虫实现(伪)球迷速成
2018/06/10 Python
python基于SMTP协议发送邮件
2019/05/31 Python
基本款天堂:Everlane
2017/05/13 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
德国网上花店:Valentins
2018/08/15 全球购物
护士进修自我鉴定
2014/02/07 职场文书
金融与证券专业求职信
2014/06/22 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2014年底个人工作总结
2015/03/10 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
清明扫墓感想
2015/08/11 职场文书
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS