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 相关文章推荐
在Django框架中编写Contact表单的教程
Jul 17 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Python如何生成树形图案
Jan 03 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
python计算无向图节点度的实例代码
Nov 22 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
pytorch中的weight-initilzation用法
Jun 24 Python
python中加背景音乐如何操作
Jul 19 Python
Python实现自动整理文件的脚本
Dec 17 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 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
JavaScript插入动态样式实现代码
2012/02/22 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Node.js学习入门
2017/01/03 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Django中间件基础用法详解
2019/07/18 Python
python写程序统计词频的方法
2019/07/29 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
师范应届生教师求职信
2013/11/05 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
房产授权委托书范本
2014/09/22 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang