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使用自定义user-agent抓取网页的方法
Apr 15 Python
Python做简单的字符串匹配详解
Mar 21 Python
python 动态加载的实现方法
Dec 22 Python
5款非常棒的Python工具
Jan 05 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
python实现图片插入文字
Nov 26 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
python属于软件吗
Jun 18 Python
Python如何给你的程序做性能测试
Jul 29 Python
在python3.9下如何安装scrapy的方法
Feb 03 Python
如何用python清洗文件中的数据
Jun 18 Python
python3操作redis实现List列表实例
Aug 04 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
PHP+ajax 无刷新删除数据
2010/02/20 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
Python如何telnet到网络设备
2021/02/18 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
思想专业自荐信范文
2013/12/25 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
六查六看剖析材料
2014/02/15 职场文书
消防宣传口号
2014/06/16 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
2014年教研室工作总结
2014/12/06 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers