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 相关文章推荐
以windows service方式运行Python程序的方法
Jun 03 Python
python GUI实例学习
Nov 21 Python
python如何在列表、字典中筛选数据
Mar 19 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
Mar 29 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
python实现大学人员管理系统
Oct 25 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
python开发前景如何
Jun 11 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python加速程序运行的方法
Jul 29 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
windows xp下安装pear
2006/12/02 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
ionic3 懒加载
2017/08/16 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python使用zip将list转为json的方法
2018/12/31 Python
python图像处理入门(一)
2019/04/04 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Python中请不要再用re.compile了
2019/06/30 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
什么是Assembly(程序集)
2014/09/14 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
人力资源管理求职信
2014/08/07 职场文书
员工安全责任协议书
2016/03/22 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang