python实现朴素贝叶斯分类器


Posted in Python onMarch 28, 2018

本文用的是sciki-learn库的iris数据集进行测试。用的模型也是最简单的,就是用贝叶斯定理P(A|B) = P(B|A)*P(A)/P(B),计算每个类别在样本中概率(代码中是pLabel变量)

以及每个类下每个特征的概率(代码中是pNum变量)。

写得比较粗糙,对于某个类下没有此特征的情况采用p=1/样本数量。

有什么错误有人发现麻烦提出,谢谢。

[python] view plain copy
# -*- coding:utf-8 -*- 
from numpy import * 
from sklearn import datasets 
import numpy as np 
 
class NaiveBayesClassifier(object): 
 
  def __init__(self): 
    self.dataMat = list() 
    self.labelMat = list() 
    self.pLabel = {} 
    self.pNum = {} 
 
  def loadDataSet(self): 
    iris = datasets.load_iris() 
    self.dataMat = iris.data 
    self.labelMat = iris.target 
    labelSet = set(iris.target) 
    labelList = [i for i in labelSet] 
    labelNum = len(labelList) 
    for i in range(labelNum): 
      self.pLabel.setdefault(labelList[i]) 
      self.pLabel[labelList[i]] = np.sum(self.labelMat==labelList[i])/float(len(self.labelMat)) 
 
  def seperateByClass(self): 
    seperated = {} 
    for i in range(len(self.dataMat)): 
      vector = self.dataMat[i] 
      if self.labelMat[i] not in seperated: 
        seperated[self.labelMat[i]] = [] 
      seperated[self.labelMat[i]].append(vector) 
    return seperated 
 
  # 通过numpy array二维数组来获取每一维每种数的概率 
  def getProbByArray(self, data): 
    prob = {} 
    for i in range(len(data[0])): 
      if i not in prob: 
        prob[i] = {} 
      dataSetList = list(set(data[:, i])) 
      for j in dataSetList: 
        if j not in prob[i]: 
          prob[i][j] = 0 
        prob[i][j] = np.sum(data[:, i] == j) / float(len(data[:, i])) 
    prob[0] = [1 / float(len(data[:,0]))] # 防止feature不存在的情况 
    return prob 
 
  def train(self): 
    featureNum = len(self.dataMat[0]) 
    seperated = self.seperateByClass() 
    t_pNum = {} # 存储每个类别下每个特征每种情况出现的概率 
    for label, data in seperated.iteritems(): 
      if label not in t_pNum: 
        t_pNum[label] = {} 
      t_pNum[label] = self.getProbByArray(np.array(data)) 
    self.pNum = t_pNum 
 
  def classify(self, data): 
    label = 0 
    pTest = np.ones(3) 
    for i in self.pLabel: 
      for j in self.pNum[i]: 
        if data[j] not in self.pNum[i][j]: 
          pTest[i] *= self.pNum[i][0][0] 
        else: 
          pTest[i] *= self.pNum[i][j][data[j]] 
    pMax = np.max(pTest) 
    ind = np.where(pTest == pMax) 
    return ind[0][0] 
 
  def test(self): 
    self.loadDataSet() 
    self.train() 
    pred = [] 
    right = 0 
    for d in self.dataMat: 
      pred.append(self.classify(d)) 
    for i in range(len(self.labelMat)): 
      if pred[i] == self.labelMat[i]: 
        right += 1 
    print right / float(len(self.labelMat)) 
 
if __name__ == '__main__': 
  NB = NaiveBayesClassifier() 
  NB.test()

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

Python 相关文章推荐
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
python求最大连续子数组的和
Jul 07 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Django中自定义查询对象的具体使用
Oct 13 Python
python zip()函数使用方法解析
Oct 31 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
Python解析微信dat文件的方法
Nov 30 Python
使用Python封装excel操作指南
Jan 29 Python
详解Python中where()函数的用法
Mar 27 #Python
Django基于ORM操作数据库的方法详解
Mar 27 #Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 #Python
Django学习笔记之ORM基础教程
Mar 27 #Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 #Python
Python安装图文教程 Pycharm安装教程
Mar 27 #Python
python 接口返回的json字符串实例
Mar 27 #Python
You might like
PHP安全配置
2006/12/06 PHP
php 魔术方法使用说明
2009/10/20 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
node.js基础知识汇总
2020/08/25 Javascript
简单谈谈python中的Queue与多进程
2016/08/25 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
2014年保管员工作总结
2014/11/18 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技