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中无限元素列表的实现方法
Aug 18 Python
Python脚本实现网卡流量监控
Feb 14 Python
python去除文件中空格、Tab及回车的方法
Apr 12 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 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程序
2006/10/09 PHP
PHP 各种排序算法实现代码
2009/08/20 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
js Dialog 实践分享
2012/10/22 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
javascript的函数作用域
2014/11/12 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
python文件拆分与重组实例
2018/12/10 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
下载官网python并安装的步骤详解
2019/10/12 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
创联软件面试题笔试题
2012/10/07 面试题
读书活动实施方案
2014/03/10 职场文书
主题团日活动总结
2014/06/25 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书