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中的并发编程实例
Jul 07 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
Python 常用的安装Module方式汇总
May 06 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
python3实现windows下同名进程监控
Jun 21 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
python如何实现视频转代码视频
Jun 17 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
Python执行时间的几种计算方法
Jul 31 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 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应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP获取文件行数的方法
2015/06/10 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
python针对excel的操作技巧
2018/03/13 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python解析xml简单示例
2019/06/21 Python
python读取mysql数据绘制条形图
2020/03/25 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
行政专员工作职责
2013/12/22 职场文书
计算机求职信
2014/07/02 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers