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生成密码库功能示例
May 23 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
Django处理多用户类型的方法介绍
May 18 Python
python制作简单五子棋游戏
Jun 18 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
python3.6使用SMTP协议发送邮件
May 20 Python
python如何停止递归
Sep 09 Python
Python爬虫实战之爬取携程评论
Jun 02 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
详解Python中的正则表达式的用法
2015/04/09 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python列表对象实现原理详解
2019/07/01 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
彻底解决Python包下载慢问题
2020/11/15 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
香港通票:Hong Kong Pass
2019/02/26 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
临时用工协议书范本
2014/10/29 职场文书
高三语文复习计划
2015/01/19 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python
基于angular实现树形二级表格
2021/10/16 Javascript