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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python实现子类调用父类的方法
Nov 10 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
Django如何使用redis作为缓存
May 21 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 Python
使用python创建股票的时间序列可视化分析
Mar 03 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
python追加元素到列表的方法
2015/07/28 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python dataframe NaN处理方式
2019/12/26 Python
python异常处理try except过程解析
2020/02/03 Python
django model object序列化实例
2020/03/13 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
python搜索算法原理及实例讲解
2020/11/18 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
购买一个高级域名:BuyDomains
2018/03/11 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
乔迁宴答谢词
2014/01/21 职场文书
幼儿教师培训感言
2014/03/08 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android