侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现朴素贝叶斯分类器

Python  /  管理员 发布于 7年前   237

本文用的是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中where()函数的用法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客