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之变量和参数
Oct 10 Python
Python构造函数及解构函数介绍
Feb 26 Python
用Python实现随机森林算法的示例
Aug 24 Python
opencv python 图像去噪的实现方法
Aug 31 Python
Python中pymysql 模块的使用详解
Aug 12 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
基于opencv实现简单画板功能
Aug 02 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
python源码剖析之PyObject详解
May 18 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/06/03 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP在线书签系统分享
2016/01/04 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
python中turtle库的简单使用教程
2020/11/11 Python
linux系统都有哪些运行级别
2016/03/26 面试题
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
外贸专业求职信
2014/03/09 职场文书
环保建议书400字
2014/05/14 职场文书
面试自我评价范文
2014/09/17 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
SQL Server中搜索特定的对象
2022/05/25 SQL Server