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使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
Python中encode()方法的使用简介
May 18 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
Python分支语句与循环语句应用实例分析
May 07 Python
使用django实现一个代码发布系统
Jul 18 Python
python多线程使用方法实例详解
Dec 30 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
django models里数据表插入数据id自增操作
Jul 15 Python
基于Django集成CAS实现流程详解
Nov 28 Python
python如何进行基准测试
Apr 26 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
python 性能提升的几种方法
2016/07/15 Python
Python实现基本线性数据结构
2016/08/22 Python
Python 专题四 文件基础知识
2017/03/20 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
python样条插值的实现代码
2018/12/17 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python 操作 MySQL数据库
2020/09/18 Python
毕业研究生的自我鉴定
2013/11/30 职场文书
机关保密承诺书
2014/06/03 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
办公用房租赁协议书
2014/11/29 职场文书
音乐教师求职信范文
2015/03/20 职场文书
初中班主任教育随笔
2015/08/15 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
Pytorch 实现变量类型转换
2021/05/17 Python