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 12 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python实现分段线性插值
Dec 17 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Django--权限Permissions的例子
Aug 28 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
python logging通过json文件配置的步骤
Apr 27 Python
Python爬虫教程知识点总结
Oct 19 Python
python可视化大屏库big_screen示例详解
Nov 23 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
PHP闭包实例解析
2014/09/08 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
Python中list初始化方法示例
2016/09/18 Python
python实现聊天小程序
2018/03/13 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python文件及目录操作代码汇总
2020/07/08 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
会计学自我鉴定
2014/02/06 职场文书
眼镜促销方案
2014/03/15 职场文书
网站推广策划方案
2014/06/04 职场文书
检讨书格式
2015/05/07 职场文书
小学教学工作总结2015
2015/05/13 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书