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获取Linux系统的各种信息
Jul 10 Python
Python入门篇之函数
Oct 20 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
查看Django和flask版本的方法
May 14 Python
Windows下安装Scrapy
Oct 17 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
Python grpc超时机制代码示例
Sep 14 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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自动识别字符集并完成转码详解
2013/08/02 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
基于jquery & json的省市区联动代码
2012/06/26 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
python算法学习之基数排序实例
2013/12/18 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Keras实现DenseNet结构操作
2020/07/06 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
挖掘机司机岗位职责
2014/02/12 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
公务员年终个人总结
2015/02/12 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL
golang为什么要统一错误处理
2022/04/03 Golang