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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
Python实现的简单排列组合算法示例
Jul 04 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
python tools实现视频的每一帧提取并保存
Mar 20 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Python各种扩展名区别点整理
Feb 27 Python
python定义类的简单用法
Jul 24 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
hadoop常见错误以及处理方法详解
2013/06/19 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
php获取excel文件数据
2017/04/21 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
深入解析Python中的上下文管理器
2016/06/28 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
python实现Flappy Bird源码
2018/12/24 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
JDO的含义
2012/11/17 面试题
名人演讲稿范文
2013/12/28 职场文书
机关保密承诺书
2014/06/03 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
Android自定义双向滑动控件
2022/04/19 Java/Android