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 14 Python
Python自动登录126邮箱的方法
Jul 10 Python
tornado 多进程模式解析
Jan 15 Python
django 开发忘记密码通过邮箱找回功能示例
Apr 17 Python
python实现字符串和字典的转换
Sep 29 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python tkinter组件使用详解
Sep 16 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 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
php5.2.0内存管理改进
2007/01/22 PHP
PHP令牌 Token改进版
2008/07/18 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python File(文件) 方法整理
2019/02/18 Python
Python OS模块实例详解
2019/04/15 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android