python实现朴素贝叶斯分类器
作者:shelmi 发布时间:2022-12-05 03:35:50
标签:python,朴素贝叶斯
本文用的是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()
来源:https://blog.csdn.net/Incy_1218/article/details/52891209


猜你喜欢
- rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[
- 一、绘制成品二、绘制代码实现本文效果的整体思路是:加载库—选择背景音乐—绘制心的外轮廓&md
- 一、当我们用Python matplot时作图时,一些数据需要以百分比显示,以更方便地对比模型的性能提升百分比。二、借助matplotlib
- 1 引言如果你想对图像进行校准,那么透视变换是非常有效的变换手段。透视变换的定义为将图像投影到一个新的视平面,通常也被称之为投影映射。2 公
- PHP输出JSON格式数据常用框架封装好的方法来输出JSON数据,但是手动去书写的时候却遇到了问题,因为输出的数据类型为字符串类型,导致不能
- 目录urllib库urllib.request模块Request对象1 . 请求头添加2. 操作cookie3. 设置代理urllib.pa
- HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpq
- 新手在配置pytorch过程中总会或多或少遇到些问题,同时网上关于pytorch的环境配置琳琅满目,不知道应该按照哪个配置,这里笔者记录一下
- 本文实例介绍了javascript实现九宫格相加数值相等的对应方法,分享给大家供大家参考,具体内容如下实现思路:1、每个格子输入的数值必须为
- 概述从今天开始, 小白我将带领大家一起来补充一下 数据库的知识.MySQL 安装下载地址:https://dev.mysql.com/dow
- 通过APIView进入找到Request的源码可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性继续看__
- 从一段指定的字符串中,取得期望的数据,正常人都会想到正则表达式吧?写过正则表达式的人都知道,正则表达式入门不难,写起来也容易。但是正则表达式
- 在操作DataFrame时,肯定会经常用到loc,iloc,at等函数,各个函数看起来差不多,但是还是有很多区别的,我们一起来看下吧。首先,
- 在上一节《Django是什么》中,我们对 Django 的诞生以及 Web 框架的概念有了基本的了解,本节我们介绍 Django 的设计模式
- 前言在前一篇文章中分享了编译器优化的变量捕获部分,本文分享编译器优化的另一个内容—函数内联。函数内联是指将将较小的函数内
- 1.什么是JWTJWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,
- 参考官方案例:https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.htmlim
- 初学者可以看看。在的img标签有两个属性分别为alt和title,对于很多初学者而言对这两个属性的正确使用都还抱有迷惑,当然这其中一部分原因
- Python版本 实现了比之前的xxftp更多更完善的功能1、继续支持多用户2、继续支持虚拟目录3、增加支持用户根目录以及映射虚拟目录的权限
- 具体代码如下所述:__author__ = 'Yue Qingxuan'# -*- coding: utf-8 -*-#求质