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抓取京东商城手机列表url实例代码
Dec 18 Python
Python线程中对join方法的运用的教程
Apr 09 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python变量和字符串详解
Apr 29 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Django开发中的日志输出的方法
Jul 02 Python
python编程使用协程并发的优缺点
Sep 20 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
Python中super函数用法实例分析
Mar 18 Python
Python文件操作方法详解
Feb 09 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
PHP将进程作为守护进程的方法
2015/03/19 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
vue实现简单图片上传
2020/06/30 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
培训演讲稿范文
2014/01/12 职场文书
新员工辞职信范文
2015/05/12 职场文书
信用卡收入证明范本
2015/06/12 职场文书
毕业班工作总结
2015/08/10 职场文书