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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python实现的朴素贝叶斯分类器示例
  • python编写朴素贝叶斯用于文本分类
  • Python编程之基于概率论的分类方法:朴素贝叶斯
  • python中如何使用朴素贝叶斯算法
  • 用Python制作简单的朴素基数估计器的教程
  • 朴素贝叶斯算法的python实现方法
(0)

相关推荐

  • Python实现的朴素贝叶斯分类器示例

    本文实例讲述了Python实现的朴素贝叶斯分类器.分享给大家供大家参考,具体如下: 因工作中需要,自己写了一个朴素贝叶斯分类器. 对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现. 朴素贝叶斯的基本原理网上很容易查到,这里不再叙述,直接附上代码 因工作中需要,自己写了一个朴素贝叶斯分类器.对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现. class NBClassify(object): def _

  • python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实现算法而去研究一堆公式是很痛苦的事情. 再次,除非他人提供的算法满足不了自己的需求,否则没必要"重复造轮子". 下面言归正传,不了解贝叶斯算法的可以去查一下相关资料,这里只是简单介绍一下: 1.贝叶斯公式: P(A|B)=P(AB)/P(B) 2.贝叶斯推断: P(A|B)=P(A)×P(

  • 朴素贝叶斯算法的python实现方法

    本文实例讲述了朴素贝叶斯算法的python实现方法.分享给大家供大家参考.具体实现方法如下: 朴素贝叶斯算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 比如我们想判断一个邮件是不是垃圾邮件,那么我们知道的是这个邮件中的词的分布,那么我们还要知道:垃圾邮件中某些词的出现是多少,就可以利用贝叶斯定理得到. 朴素贝叶斯分类器中的一个假设是:每个特征同等重要 函数 loadDataSet() 创建数据集,这里的数据集

  • python编写朴素贝叶斯用于文本分类

    朴素贝叶斯估计 朴素贝叶斯是基于贝叶斯定理与特征条件独立分布假设的分类方法.首先根据特征条件独立的假设学习输入/输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y. 具体的,根据训练数据集,学习先验概率的极大似然估计分布 以及条件概率为 Xl表示第l个特征,由于特征条件独立的假设,可得 条件概率的极大似然估计为 根据贝叶斯定理 则由上式可以得到条件概率P(Y=ck|X=x). 贝叶斯估计 用极大似然估计可能会出现所估计的概率为0的情况.后影响到后验概率结果

  • Python编程之基于概率论的分类方法:朴素贝叶斯

    概率论啊概率论,差不多忘完了. 基于概率论的分类方法:朴素贝叶斯 1. 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们通过实例来讨论贝叶斯分类的中最简单的一种: 朴素贝叶斯分类. 2. 贝叶斯理论 & 条件概率 2.1 贝叶斯理论 我们现在有一个数据集,它由两类数据组成,数据分布如下图所示: 我们现在用 p1(x,y) 表示数据点 (x,y) 属于类别 1(图中用圆点表示的类别)的概率,用 p2(

  • 用Python制作简单的朴素基数估计器的教程

    假设你有一个很大的数据集,非常非常大,以至于不能全部存入内存.这个数据集中有重复的数据,你想找出有多少重复的数据,但数据并没有排序,由于数据量太大所以排序是不切实际的.你如何来估计数据集中含有多少无重复的数据呢?这在许多应用中是很有用的,比如数据库中的计划查询:最好的查询计划不仅仅取决于总共有多少数据,它也取决于它含有多少无重复的数据. 在你继续读下去之前,我会引导你思考很多,因为今天我们要讨论的算法虽然很简单,但极具创意,它不是这么容易就能想出来的. 一个简单的朴素基数估计器 让我们从一个简单

  • 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 * fr

  • python机器学习朴素贝叶斯算法及模型的选择和调优详解

    目录 一.概率知识基础 1.概率 2.联合概率 3.条件概率 二.朴素贝叶斯 1.朴素贝叶斯计算方式 2.拉普拉斯平滑 3.朴素贝叶斯API 三.朴素贝叶斯算法案例 1.案例概述 2.数据获取 3.数据处理 4.算法流程 5.注意事项 四.分类模型的评估 1.混淆矩阵 2.评估模型API 3.模型选择与调优 ①交叉验证 ②网格搜索 五.以knn为例的模型调优使用方法 1.对超参数进行构造 2.进行网格搜索 3.结果查看 一.概率知识基础 1.概率 概率就是某件事情发生的可能性. 2.联合概率 包

  • Python通过朴素贝叶斯和LSTM分别实现新闻文本分类

    目录 一.项目背景 二.数据处理与分析 三.基于机器学习的文本分类–朴素贝叶斯 1. 模型介绍 2. 代码结构 3. 结果分析 四.基于深度学习的文本分类–LSTM 1. 模型介绍 2. 代码结构 3. 结果分析 五.小结 一.项目背景 本项目来源于天池⼤赛,利⽤机器学习和深度学习等知识,对新闻⽂本进⾏分类.⼀共有14个分类类别:财经.彩票.房产.股票.家居.教育.科技.社会.时尚.时政.体育.星座.游戏.娱乐. 最终将测试集的预测结果上传⾄⼤赛官⽹,可查看排名.评价标准为类别f1_score的

  • python 实现朴素贝叶斯算法的示例

    特点 这是分类算法贝叶斯算法的较为简单的一种,整个贝叶斯分类算法的核心就是在求解贝叶斯方程P(y|x)=[P(x|y)P(y)]/P(x) 而朴素贝叶斯算法就是在牺牲一定准确率的情况下强制特征x满足独立条件,求解P(x|y)就更为方便了 但基本上现实生活中,没有任何关系的两个特征几乎是不存在的,故朴素贝叶斯不适合那些关系密切的特征 from collections import defaultdict import numpy as np from sklearn.datasets import

  • python实现朴素贝叶斯算法

    本代码实现了朴素贝叶斯分类器(假设了条件独立的版本),常用于垃圾邮件分类,进行了拉普拉斯平滑. 关于朴素贝叶斯算法原理可以参考博客中原理部分的博文. #!/usr/bin/python # -*- coding: utf-8 -*- from math import log from numpy import* import operator import matplotlib import matplotlib.pyplot as plt from os import listdir def

  • Python实现朴素贝叶斯的学习与分类过程解析

    概念简介: 朴素贝叶斯基于贝叶斯定理,它假设输入随机变量的特征值是条件独立的,故称之为"朴素".简单介绍贝叶斯定理: 乍看起来似乎是要求一个概率,还要先得到额外三个概率,有用么?其实这个简单的公式非常贴切人类推理的逻辑,即通过可以观测的数据,推测不可观测的数据.举个例子,也许你在办公室内不知道外面天气是晴天雨天,但是你观测到有同事带了雨伞,那么可以推断外面八成在下雨. 若X 是要输入的随机变量,则Y 是要输出的目标类别.对X 进行分类,即使求的使P(Y|X) 最大的Y值.若X 为n 维

  • python 机器学习之实现朴素贝叶斯算法的示例

    特点 这是分类算法贝叶斯算法的较为简单的一种,整个贝叶斯分类算法的核心就是在求解贝叶斯方程P(y|x)=[P(x|y)P(y)]/P(x) 而朴素贝叶斯算法就是在牺牲一定准确率的情况下强制特征x满足独立条件,求解P(x|y)就更为方便了 但基本上现实生活中,没有任何关系的两个特征几乎是不存在的,故朴素贝叶斯不适合那些关系密切的特征 from collections import defaultdict import numpy as np from sklearn.datasets import

  • Python实现的朴素贝叶斯算法经典示例【测试可用】

    本文实例讲述了Python实现的朴素贝叶斯算法.分享给大家供大家参考,具体如下: 代码主要参考机器学习实战那本书,发现最近老外的书确实比中国人写的好,由浅入深,代码通俗易懂,不多说上代码: #encoding:utf-8 ''''' Created on 2015年9月6日 @author: ZHOUMEIXU204 朴素贝叶斯实现过程 ''' #在该算法中类标签为1和0,如果是多标签稍微改动代码既可 import numpy as np path=u"D:\\Users\\zhoumeixu2

随机推荐