ML | 4.朴素贝叶斯

news2024/11/19 0:42:51

基于概率论的分类方法:朴素贝叶斯

文章目录

  • 基于概率论的分类方法:朴素贝叶斯
    • 概述
    • 条件概率
      • 贝叶斯公式
    • 朴素贝叶斯分类器
      • 2个假设
      • Example:文本分类
      • 欢迎关注公众号【三戒纪元】

概述

朴素贝叶斯可以处理多类别问题在数据较少的情况下仍然有效,但对于输入数据的准备方式较为敏感。

朴素贝叶斯是贝叶斯决策理论的一部分。

核心思想:选择高概率对应的类别,即选择具有最高概率的决策。

例如,当我们识别了一个障碍物,根据其特征,判断它是汽车的概率为60%,判定是卡车的概率为45%,判定是自行车的概率为30%,判定是行人的概率是5%,则最终我们会选择相信,该障碍物极有可能是一辆汽车,因为它是汽车的概率最大。

条件概率

设A、B是两个事件,且P(A) > 0,则称 P ( B ∣ A ) = P ( A B ) p ( A ) P(B|A) = \frac{P(AB)}{p(A)} P(BA)=p(A)P(AB)为事件A发生的条件下事件B的条件概率
{ P ( A B ) = P ( A ) P ( B ∣ A ) , P(A) > 0 P ( A B ) = P ( B ) P ( A ∣ B ) , P(B) > 0 \begin{cases} P(AB) = P(A) P(B|A), & \text{P(A) > 0} \\ P(AB) = P(B) P(A|B), & \text{P(B) > 0} \\ \end{cases} {P(AB)=P(A)P(BA),P(AB)=P(B)P(AB),P(A) > 0P(B) > 0

贝叶斯公式

A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1,A2,...,An 是完备事件组,且 P ( A i ) > 0 ( i = 1 , 2 , . . . , n ) P(A_i) > 0(i = 1,2,...,n) P(Ai)>0(i=1,2,...,n),B为任意事件, P ( B ) > 0 P(B) > 0 P(B)>0,则
P ( A k ∣ B ) = P ( A k ) P ( B ∣ A k ) P ( B ) = P ( A k ) P ( B ∣ A k ) ∑ i = 1 N ( P ( A i ) P ( B ∣ A i ) ) P(A_k|B) = \frac{P(A_k)P(B|A_k)}{P(B)}=\frac{P(A_k)P(B|A_k)}{\sum_{i=1}^N (P(A_i)P(B|A_i))} P(AkB)=P(B)P(Ak)P(BAk)=i=1N(P(Ai)P(BAi))P(Ak)P(BAk)

朴素贝叶斯分类器

2个假设

  • 特征之间相互独立
  • 每个特征同等重要

Example:文本分类

构建快速过滤器,屏蔽社区侮辱性言论。

  • 首先从文本中构建词向量,将句子转化为向量

  • 基于这些向量计算条件概率

  • 构建分类器

创建一个名为 bayes.py的文件

from numpy import *

# 1. 词表到向量的转换函数
## 创建实验样本
def loadDataSet():
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
    return postingList,classVec
 
 ## 创建一个包含在所有文档中出现的不重复词的列表
def createVocabList(dataSet):
    vocabSet = set([])  #create empty set
    for document in dataSet:
        vocabSet = vocabSet | set(document) #union of the two sets
    return list(vocabSet)

## 词汇表中的单词是否在输入文档中出现
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

# 2.朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() 
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

# 3. 朴素贝叶斯分类函数
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0
    
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec

def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
    testEntry = ['love', 'my', 'dalmation']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry = ['stupid', 'garbage']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

def textParse(bigString):    #input is big string, #output is word list
    import re
    listOfTokens = re.split(r'\W*', bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] 

测试代码如下:

from bayes import *

def test_randy():
    print("******* 测试词表到向量的转换函数 createVocabList setOfWords2Vec ******* ")
    listOPosts, listClasses = loadDataSet()
    randyVocabList = createVocabList(listOPosts)
    print("============> randyVocabList \n", randyVocabList)
    print("============> cute existed? \n", setOfWords2Vec(randyVocabList, listOPosts[0]))
    print("============> garbage existed? \n", setOfWords2Vec(randyVocabList, listOPosts[3]))

    print("******* 测试朴素贝叶斯分类器训练函数 trainNB0 ******* ")
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(randyVocabList, postinDoc))
    p0V, p1V, pAB = trainNB0(trainMat, listClasses)
    print("============> p0V \n", p0V)
    print("============> p1V \n", p1V)
    print("============> pAB \n", pAB)

    print("******* 测试朴素贝叶斯分类函数 testingNB ******* ")
    testingNB()

if __name__ == "main":
    test_randy

结果为:

******* 测试词表到向量的转换函数 createVocabList setOfWords2Vec ******* 
============> randyVocabList 
 ['maybe', 'so', 'not', 'stop', 'ate', 'cute', 'my', 'dog', 'to', 'park', 'worthless', 'how', 'posting', 'has', 'flea', 'help', 'him', 'love', 'buying', 'is', 'licks', 'food', 'garbage', 'problems', 'dalmation', 'I', 'steak', 'take', 'please', 'stupid', 'quit', 'mr']
============> cute existed? 
 [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0]
============> garbage existed? 
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0]
 
******* 测试朴素贝叶斯分类器训练函数 trainNB0 ******* 
============> p0V 
 [-3.25809654 -2.56494936 -3.25809654 -2.56494936 -2.56494936 -2.56494936
 -1.87180218 -2.56494936 -2.56494936 -3.25809654 -3.25809654 -2.56494936
 -3.25809654 -2.56494936 -2.56494936 -2.56494936 -2.15948425 -2.56494936
 -3.25809654 -2.56494936 -2.56494936 -3.25809654 -3.25809654 -2.56494936
 -2.56494936 -2.56494936 -2.56494936 -3.25809654 -2.56494936 -3.25809654
 -3.25809654 -2.56494936]
============> p1V 
 [-2.35137526 -3.04452244 -2.35137526 -2.35137526 -3.04452244 -3.04452244
 -3.04452244 -1.94591015 -2.35137526 -2.35137526 -1.94591015 -3.04452244
 -2.35137526 -3.04452244 -3.04452244 -3.04452244 -2.35137526 -3.04452244
 -2.35137526 -3.04452244 -3.04452244 -2.35137526 -2.35137526 -3.04452244
 -3.04452244 -3.04452244 -3.04452244 -2.35137526 -3.04452244 -1.65822808
 -2.35137526 -3.04452244]
============> pAB 
 0.5
 
******* 测试朴素贝叶斯分类函数 testingNB ******* 
['love', 'my', 'dalmation'] classified as:  0
['stupid', 'garbage'] classified as:  1
['love', 'my', 'dalmation'] classified as:  0
['stupid', 'garbage'] classified as:  1

欢迎关注公众号【三戒纪元】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加速度传感器的量程估算

在测震动和噪声的场合,现有的加速度传感器,需要客户提供加速度值的大致区间。这个值该怎么计算呢?它几乎完全与被测信号的频率有关。因为所有的信号,按照频域展开的视角,都会简化为一个个正弦波。对于正弦波有这样的属…

亚马逊云科技新增功能:在一个位置设置您的亚马逊云科技通知

5月5日,亚马逊云科技发布AWS User Notifications,这是在亚马逊云科技管理控制台中设置和查看多个亚马逊云科技账户、区域和服务的亚马逊云科技通知的单一位置。 可以以一致、人性化的格式集中设置和查看来自100多项亚马逊云科技服务的通知,…

什么是语音识别的智能客服?

前言 随着人工智能技术的不断发展,语音识别技术越来越成熟,语音技术的应用也越来越广泛。智能客服是其中一个应用领域,它通过语音识别技术,将用户的语音输入转换为文本,并通过自然语言处理技术,解决用户的…

数据库的恢复技术

更好的阅读体验 存储器结构 分类 1、易失性存储器:内存、高速缓冲存储器 2、非易失性存储器:磁盘、磁带 3、稳定存储器:理想的存储器,其中信息永不丢失 稳定存储器的实现 要实现稳定存储器,就要在多个非易失性存储…

32从零开始学Java之方法传参到底是值传递还是引用传递?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家讲解了方法的定义、调用和返回值,但方法的内容还有…

如何避免在Facebook群组中过度营销?

在社交媒体时代,Facebook群组已经成为了企业宣传的热门渠道之一。然而,很多企业在使用Facebook群组进行宣传时,都会犯一个很容易被忽视的错误——过度营销。 过度营销不仅会让Facebook群组的成员感到反感,甚至还会让管理员将你的帖…

如何进行TCP抓包调试?

网络调试工具——Wireshark Wireshark 是世界上应用最广泛的网络协议分析器,它让我们在微观层面上看到整个网络正在发生的事情。 Wireshark 本身是一个开源项目,所以也得到了很多志愿者的支持。同时,Wireshark 具有丰富的功能集,…

基于短时傅里叶变换的同步压缩变换原理和Matlab代码

基于短时傅里叶变换的同步压缩变换原理 新的短时傅里叶变换(STFT)被定义为 考虑一个单分量信号 对相位 φ ( t ) \varphi (t) φ(t)进行泰勒展开,并丢弃二阶以及高阶项。 将上式带入STFT后,可得 关于上式对时间 t t t求导,得到关于瞬时频…

Transformer 估算 101

本文主要介绍用于估算 transformer 类模型计算量需求和内存需求的相关数学方法。 引言 其实,很多有关 transformer 语言模型的一些基本且重要的信息都可以用很简单的方法估算出来。不幸的是,这些公式在 NLP 社区中鲜为人知。本文的目的是总结这些公式&am…

20230518 美国知乎 Quora 旗下 Poe.com 上可以免费Claude试用 7 天。

🚀 美国知乎 Quora 旗下 Poe.com 上可以免费Claude试用 7 天。 最强竞品 Claude 最近实现了史诗升级,支持十万 token 上下文,并且可以处理英文书籍,但申请使用需要付费。 而在美国知乎 Quora 旗下 Poe.com 上可以免费试用 7 天。…

【密码产品篇】金融数据密码机密钥体系结构(对称密码体制)

【密码产品篇】金融数据密码机密钥体系结构(对称密码体制) 金融数据密码机采用基于"对称密码体制"的三层密钥体系结构;分别为"主密钥、次主密钥和数据密钥"三层。金融数据密码机中的密钥采用"自上而下逐层保护&quo…

520要来了,CSS3模拟3D旋转节日表白动画特效

一年一度的520要来了,做为一名CSS3爱好者,怎么能不为大家的技术型表白做出一点贡献呢,这不,用CSS3模拟3D旋转的表白特效来了,快快拿去表白 目录 实现思路 单层3D可见 HTML源代码 CSS3源代码 实现思路 本文通过添…

C++ 中的继承和多态

C 中的继承和多态 一、继承二、函数重载、隐藏、覆盖、重写1.函数重载(Function Overload)2.函数隐藏(Function Hiding)3.函数重写与函数覆盖(Function Override) 三、多态四、纯虚函数和抽象类五、多重继承…

【Linux高级 I/O(1)】如何使用阻塞 I/O 与非阻塞 I/O?

本系列再次回到文件 I/O 相关话题的讨论,将会介绍文件 I/O 当中的一些高级用法,以应对不同应用场合的需求,主要包括:非阻塞 I/O、I/O 多路复用、异步 I/O、存储映射 I/O 以及文件锁。 非阻塞 I/O 关于“阻塞”一词前面已经给大家…

使用大语言模型集成工具 LangChain 创建自己的论文汇总和查询工具

Langchain可以帮助开发人员构建由大型语言模型(llm)支持的应用程序。它提供一个框架将LLM与其他数据源(如互联网或个人文件)连接起来。这允许开发人员将多个命令链接在一起,以创建更复杂的应用程序。包括最近比较火爆的AutoGPT等都是使用了Langchain框架进行开发的。…

【框架源码】Spring源码底层IOC容器加入对象的方式

1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean&#xff0c;通过ClassPathXmlApplicationContext等容器来加载并初始化Bean。 使用注解 使用Spring提供的注解&#xff0c;例如Component、Service、Controller、Repository等注…

一篇带你看懂什么是DesignOps(设计运营管理)

“好设计就是好生意”(Good design is good business) ----IBM创始人Thomas J. Watson早在20世纪50年代&#xff0c;IBM就开始关注好设计。IBM创始人Thomas J. Watson认为好的设计能很大程度提高产品的质量、功能和美观度&#xff0c;吸引更多的消费者和客户&#xff0c;增加销…

工程监测无线中继采集仪的寄存器(参数)汇总详解

工程监测无线中继采集仪的寄存器&#xff08;参数&#xff09;汇总详解 一、 寄存器&#xff08;参数&#xff09;汇总 无线中继采集发送仪有很多参数&#xff08;寄存器&#xff09;&#xff0c;对于一些简单的应用&#xff0c;用户无需关心这些参数&#xff0c;使用默认参数值…

【GPT-4理论篇-1】GPT-4核心技术探秘 | 京东云技术团队

前言 GPT-4已经发布有一段时间了&#xff0c;但是出于安全性等各种原因&#xff0c;OpenAI并没有公布GPT-4的技术细节和代码&#xff0c;而是仅仅给出了一个长达100页的技术报告[1]。 这个技术报告着重介绍了GPT-4的强大之处&#xff0c;仅仅给出了几个技术方向的概括&#x…

《汇编语言》- 读书笔记 - 实验

《汇编语言》- 读书笔记 - 实验 实验 1 查看 CPU 和内存&#xff0c;用机器指令和汇编指令编程1. 预备知识: Debug 的使用r 修改或显示寄存器的值d 查看内存数据e 编辑内存中指定地址的内容u 显示代码t 单步执行一条指令a 写入汇编指令g 执行到指定位置n 指定文件名L 加载文件W…