Python 朴素贝叶斯(Naive Bayes)分类

2023-11-07

       Naïve Bayes 分类的核心是计算条件概率P(y|x),其中y为类别,x为特征向量。其意义是在x样本出现时,它被划分为y类的可能性(概率)。通过计算不同分类下的概率,进而把样本划分到概率最大的一类。

根据条件概率的计算公式可以得到:

P(y|x) = P(y)*P(x|y)/P(x)。

      由于在计算不同分类概率是等式右边的分母是相同的,所以只需比较分子的大小。并且,如果各个样本特征是独立分布的,那么p(x

|y)等于p(xi|y)相乘。

      下面以文本分类来介绍Naïve Bayes分类的应用。其思路如下:

(1)建立词库,即无重复的单词表。

(2)分别计算词库中类别标签出现的概率P(y)。

(3)分别计算各个类别标签下不同单词出现的概率P(xi|y)。

(4)在不同类别下,将待分类样本各个特征出现概率((xi|y)相乘,然后在乘以对应的P(y)。

(5)比较不同类别下(4)中结果,将待分类样本分到取值最大的类别。

下面是Naïve Bayes 文本分类的Python代码,其中为了方便计算,程序中借助log对数函数将乘法转化为了加法。

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 14 11:15:47 2016
Naive Bayes Clssification
"""

# -*- coding: utf-8 -*-
import numpy  as np

class NaiveBayes:
     def  __init__ ( self ):
         self._creteria  =  "NB"
        
     def _createVocabList ( self , dataList ):
         """
        创建一个词库向量
        """

        vocabSet  =  set ( [ ] )
         for line  in dataList:
             print  set (line )
            vocabSet  = vocabSet |  set (line )
         return  list (vocabSet )
        
     #文档词集模型
     def _setOfWords2Vec ( self , vocabList , inputSet ):
         """
        功能:根据给定的一行词,将每个词映射到此库向量中,出现则标记为1,不出现则为0
        """

        outputVec  =  [ 0 ] *  len (vocabList )
         for word  in inputSet:
             if word  in vocabList:
                outputVec [vocabList. index (word ) ]  =  1
             else:
                 print  "the word:%s is not in my vocabulary!" % word
         return outputVec
    
        
     # 修改 _setOfWordsVec  文档词袋模型
     def _bagOfWords2VecMN ( self , vocabList , inputSet ):
         """
        功能:对每行词使用第二种统计策略,统计单个词的个数,然后映射到此库中
        输出:一个n维向量,n为词库的长度,每个取值为单词出现的次数
        """

        returnVec  =  [ 0 ]* len (vocabList )
         for word  in inputSet:
             if word  in vocabList:
                returnVec [vocabList. index (word ) ] + =  1  # 更新此处代码
         return returnVec
    
    
     def _trainNB ( self , trainMatrix , trainLabel ):
         """
        输入:训练矩阵和类别标签,格式为numpy矩阵格式
        功能:计算条件概率和类标签概率
        """

        numTrainDocs  =  len (trainMatrix )  #统计样本个数
        numWords  =  len (trainMatrix [ 0 ] )   #统计特征个数,理论上是词库的长度
        pNeg  =  sum (trainLabel )/ float (numTrainDocs )  #计算负样本出现的概率
        
        p0Num  = np. ones (numWords )  #初始样本个数为1,防止条件概率为0,影响结果     
        p1Num  = np. ones (numWords )  #作用同上
       
        p0InAll  =  2.0  #词库中只有两类,所以此处初始化为2(use laplace)
        p1InAll  =  2.0 
        
         # 再单个文档和整个词库中更新正负样本数据
         for i  in  range (numTrainDocs ):
             if trainLabel [i ]  ==  1:
                p1Num + = trainMatrix [i ]
                p1InAll + =  sum (trainMatrix [i ] )
             else:
                p0Num + = trainMatrix [i ]
                p0InAll + =  sum (trainMatrix [i ] )
        
         print p1InAll
         #计算给定类别的条件下,词汇表中单词出现的概率
         #然后取log对数,解决条件概率乘积下溢
        p0Vect  = np. log (p0Num/p0InAll )  #计算类标签为0时的其它属性发生的条件概率
        p1Vect  = np. log (p1Num/p1InAll )   #log函数默认以e为底  #p(ci|w=0)
         return p0Vect , p1Vect , pNeg
        
     def _classifyNB ( self , vecSample , p0Vec , p1Vec , pNeg ):
         """
        使用朴素贝叶斯进行分类,返回结果为0/1
        """

        prob_y0  =  sum (vecSample * p0Vec ) + np. log ( 1-pNeg )
        prob_y1  =  sum (vecSample * p1Vec ) + np. log (pNeg )  #log是以e为底
         if prob_y0  < prob_y1:
             return  1
         else:
             return  0

    
     # 测试NB算法
     def testingNB ( self , testSample ):
        listOPosts , listClasses  = loadDataSet ( )
        myVocabList  =  self._createVocabList (listOPosts )
#        print myVocabList
        trainMat = [ ]
         for postinDoc  in listOPosts:
            trainMat. append ( self._bagOfWords2VecMN (myVocabList , postinDoc ) )
        p0V ,p1V ,pAb  =  self._trainNB (np. array (trainMat ) , np. array (listClasses ) )
         print trainMat
        thisSample  = np. array ( self._bagOfWords2VecMN (myVocabList , testSample ) )
        result  =  self._classifyNB (thisSample , p0V , p1V , pAb )
         print testSample , 'classified as: ' , result
         return result


###############################################################################
def loadDataSet ( ):
        wordsList = [ [ 'my' ,  'dog' ,  'has' ,  'flea' ,  'problems' ,  'help' ,  'please' ] ,
                    [ 'maybe' ,  'not' ,  'take' ,  'him' ,  'to' ,  'dog' ,  'park' ,  'stupid' ] ,
                    [ 'my' ,  'dalmation' ,  'is' ,  'so' ,  'cute' ,  ' and' ,  'I' ,  'love' ,  'him' ] ,
                    [ 'stop' ,  'posting' ,  'stupid' ,  'worthless' ,  'garbage' ] ,
                    [ 'mr' ,  'licks' , 'ate' , 'my' ,  'steak' ,  'how' ,  'to' ,  'stop' ,  'him' ] ,
                    [ 'quit' ,  'buying' ,  'worthless' ,  'dog' ,  'food' ,  'stupid' ] ]
        classLable  =  [ 0 , 1 , 0 , 1 , 0 , 1 ]  # 0:good; 1:bad
         return wordsList , classLable
        
if __name__ == "__main__":    
    clf  = NaiveBayes ( )
    testEntry  =  [ [ 'love' ,  'my' ,  'girl' ,  'friend' ] ,
                  [ 'stupid' ,  'garbage' ] ,
                  [ 'Haha' ,  'I' ,  'really' ,  "Love" ,  "You" ] ,
                  [ 'This' ,  'is' ,  "my" ,  "dog" ] ]
    clf. testingNB (testEntry [ 0 ] )
#    for item in testEntry:
#        clf.testingNB(item)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 朴素贝叶斯(Naive Bayes)分类 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 成功解决:RuntimeError: DataLoader worker (pid(s) XXX) exited unexpectedly

    num workers是用来指定开多进程的数量 默认值为0 表示不启用多进程 将num workers改为0即可 0是默认值
  • iTab浏览器插件安装教程

    iTab浏览器插件 iTab是一个好看好用的自定义卡片式浏览器新标签页扩展 安装iTab标签页扩展后 您将告别呆板无趣的原生标签页 享受iTab标签页为您带来的个性化新体验 离线资源下载 iTab资源 安装教程 IE 浏览器 1 打开浏览器
  • 百度文本内容审核

    百度提供了免费的文本内容审核 响应时间在1秒左右 第一步 在百度开发账号中创建应用 获取配置信息 百度图片审核配置信息 public class BaiduSensitiveConfig 1 app id public static fin
  • 关于BatchNorm,我们需要了解什么(一)

    一 前言 准备写一个系列的文章 关于BatchNorm 本文的主要内容是对BN技术做一个汇总 默认读者已经了解BN层的主要工作原理 理解BN算法中每个参数的含义以及在训练和推理过程中的算法原理 1 BN存在的问题以及在必须使用BN的时候 我
  • powerDesigner反向生成数据建模图

    添加sql脚本文件 The file has been successfully reverse engineered 保存dpm文件 生成报告 建议标准模式 html就行
  • php文件注入思路

    题目描述 打开题目给定url 发现有一个文件上传按钮 猜测可能是需要上传php文件对服务器进行查看 解题步骤 1 上传一个文档文档 提示无法上传 2 上传一张jpg图像 发现给定了图像存储的路径 3 于是使用浏览器权限绕过的方式 上传php
  • Android7.1.2修改以太网静态设置

    如何设置以太网有线网络静态配置 从源码看设置以太网配置调用的是EthernetManager的setConfiguration方法 所以我们就只需要创建IpConfiguration这个实例 他的构造方法传入值是 最终配置的参数就是Stat
  • 如何系统学习k8s?

    1 理解基本概念 Kubernetes 有很多复杂的概念 例如 Pod Deployment Service Ingress 等 了解这些基本概念是系统学习 k8s 的第一步 一些有用的资源包括 Kubernetes官方文档 k8s io网
  • Failed to deserialize payload. Is the byte array a result of corresponding serialization for Default

    这是java redis反序列化问题 Cannot deserialize nested exception is org springframework core serializer support SerializationFaile
  • 怎么注册自媒体账号?技巧分享

    自媒体行业的快速发展 相信大家都有耳闻 至于自媒体应该如何有效地运营 相信大家就纷纷摸不着头脑了那么新手如何做自媒体呢 我归纳分为这几个步骤 一 自媒体账号定位 在做自媒体之前 一定需要做好定位 比如我这个自媒体开通了要拿来做什么 比如给人
  • 强大的Source Insight查找操作和代码查看

    系列文章 一 Source Insight 简介 常用设置和常用的快捷键 二 Source Insight 工程操作 三 Source Insight 窗口介绍 四 强大的Source Insight查找操作和代码查看 五 Source I
  • Logcat 的常用命令说明

    个人认为有一下几个常用命令 adb logcat c 清除所有以前的日志 adb logcat d 这个命令是在时间上倒过来用的 就是你先操作 然后敲这个命令 打出来的log就是你刚操作那段时间的log 而且自动退出log模式 adb lo
  • Vue PostCss插件——autoprefixer,自动补全css浏览器前缀

    Autoprefixer是一款基于PostCSS插件 用于解析CSS并使用Can I Use中的值向CSS规则添加供应商前缀 它是 Google 推荐的 并在Twitter和阿里巴巴中使用 可以实现css3代码自动补全 也可以运用到sass
  • 实例:vmem_disk驱动-->vmem_disk驱动模块的加载与卸载(2)

    支持 制造请求 请求队列 static void setup device struct vmem disk dev dev int which memset dev 0 sizeof struct vmem disk dev dev gt
  • 达蒙DM数据库使用经验

    DM表 字段注释 注 dm数据库无法在建表的同时为字段名添加注释 为表添加注释 comment on table 库名 表名 is 表注释 为表字段添加注释 comment on column 库名 表名 列名 is 列注释 DM查询错误
  • 如何搭建一个CRM系统

    搭建一个客户关系管理系统 CRM 需要以下几个步骤 定义需求 明确您对 CRM 系统的要求 以便确定它应该具有哪些功能和特性 选择技术 根据您的需求 选择合适的技术平台 例如使用自主开发 购买现成软件或使用云 CRM 服务 数据收集 收集所
  • QT中如何在主窗口中添加子窗口

    1 方法 原理其实很简单 和在窗口上动态 代码的形式 添加控件的方法一样 但需要设置一下子窗口的属性 在子窗口构造函数中添加代码 setWindowFlags Qt FramelessWindowHint 作用 隐藏子窗口的标题栏和边框 如
  • 统计各专业学生人数

    题目描述 学生表 专业表 SELECT dept name ifnull z studen cou 0 AS 人数 FROM SELECT dept id COUNT AS cou FROM z studen GROUP BY dept i
  • 一种设置python函数执行超时时间

    问题来源 写该文章的缘由是因为最近回答CSDN用户一个关于函数超时的问题 当时用户提问 最近想用python实现如下的一个功能 即设置函数的超时时间 当超过这个时间后函数退回到父函数而不会引发异常或导致整个程序结束 当时用户还贴出了另一篇文
  • Python 朴素贝叶斯(Naive Bayes)分类

    Na ve Bayes 分类的核心是计算条件概率P y x 其中y为类别 x为特征向量 其意义是在x样本出现时 它被划分为y类的可能性 概率 通过计算不同分类下的概率 进而把样本划分到概率最大的一类 根据条件概率的计算公式可以得到 P y