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处理文本文件中控制字符的方法
Feb 07 Python
深入理解Python对Json的解析
Feb 14 Python
python实现数据图表
Jul 29 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
python多次执行绘制条形图
Apr 20 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
关于文本留言本的分页代码
2006/10/09 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php旋转图片90度的方法
2013/11/07 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
PHP中list方法用法示例
2016/12/01 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
js实现一键复制功能
2017/03/16 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
python通过smpt发送邮件的方法
2015/04/30 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
人力资源行政经理自我评价
2013/10/23 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
工会换届选举方案
2014/05/21 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
教你部署vue项目到docker
2022/04/05 Vue.js
解决Oracle数据库用户密码过期
2022/05/11 Oracle