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基础教程之自定义函数介绍
Aug 29 Python
python sort、sorted高级排序技巧
Nov 21 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python实现程序重启和系统重启方式
Apr 16 Python
Jupyter notebook如何修改平台字体
May 13 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
python实现人性化显示金额数字实例详解
Sep 25 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中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
php生成HTML文件的类方法
2019/10/11 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
xml转json的js代码
2012/08/28 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
Python中的Matplotlib模块入门教程
2015/04/15 Python
深入理解Python变量与常量
2016/06/02 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python3.7 sys模块的具体使用
2019/07/22 Python
python实现超市商品销售管理系统
2019/11/22 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
Python基于locals返回作用域字典
2020/10/17 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
优秀教师事迹简介
2014/02/02 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
新闻人物通讯稿
2014/10/09 职场文书
初中生物教学反思
2016/02/20 职场文书
Python基础知识之变量的详解
2021/04/14 Python
如何在Python项目中引入日志
2021/05/31 Python
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL