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)分类 的相关文章

  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 如何返回 cost, grad 作为 scipy 的 fmin_cg 函数的元组

    我怎样才能使 scipy 的fmin cg使用一个返回的函数cost and gradient作为元组 问题是有f对于成本和fprime对于梯度 我可能必须执行两次操作 非常昂贵 grad and cost被计算 此外 在它们之间共享变量可
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • Plotly:如何检查基本图形结构(版本 4)

    对于旧版本的plotly 例如在 Jupyterlab 中 您可以简单地运行figure像这样检查你的图形的基础知识 Ouput data marker color red size 10 symbol 104 mode markers l
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 使用 Python 将连续日期分组在一起

    Given dates datetime 2014 10 11 datetime 2014 10 1 datetime 2014 10 2 datetime 2014 10 3 datetime 2014 10 5 datetime 201
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • 成功解决: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