贝叶斯分类器(Bayes Classifier)

article/2025/10/5 13:33:51

一、贝叶斯定理

1、背景:

贝叶斯定理也称贝叶斯推理,早在18世纪,英国学者贝叶斯(1702~1763)曾提出
引用:百度百科

  • 贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。
  • 贝叶斯定理计算条件概率的公式用来解决如下一类问题:
	假设:H[1],H[2],H[n]互斥且构成一个完全事件已知它们的概率P(H[i]),i=1,2,,n,现观察到某事件A与H[1],H[2],H[n]相伴随机出现且已知条件概率P(A|H[i]),求P(H[i]|A)

1.2、贝叶斯公式:
在这里插入图片描述

  • 公式描述中:P(Bi)为事件Bi发生的概率,事件Bi在已经发生的条件下A的概率为P(A|B),事件A发生条件下事件Bi的概率为P(Bi|A)

1.2、贝叶斯概率的定义与贝叶斯公式:

假设,A和B是两个事件公式如下:

  • A发生的概率记作:P(A)
  • B发生的概率记作:P(B)
  • A和B同时发生的概率记作:P(AB)
  • 条件概率P(B|A)为:
    在这里插入图片描述
  • 由上图公式可得:P(AB)=P(B|A)P(A)
    在这里插入图片描述

1.3、贝叶斯公式的应用:

  • 1.3.1,双色球盒问题:

     假设有5个盒子,其中各自装了两个球,球总共有两种颜色,具体如下已知样本空间Ω={(红、红),(红、白),(白、红),(白、白),(白、白)}问题:事件A为{盒子中至少有一个红球}事件B为{盒子中至少有一个白球}盒子中至少有一个红求的条件下,至少有一个白球的概率解:P(A)={(红、红),(红、白),(白、红)}P(B)={(白、白),(红、白),(白、红),(白、白)}	可盒子中至少有一个红求的条件下,至少有一个白球的概率=P(B|A)求得概率为2/3,如下图
    

    在这里插入图片描述

     实验中样本点的总数为n,事件A所包含的样本点数为m(m>0)AB所包含的样本点数为k,则可推出:
    

    在这里插入图片描述

1.4、朴素贝叶斯分类的应用:

  • 1.4.2,优缺点:
    (1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化即可!)
    (2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)

  • 1.4.2,bayes分类一个好公司问题,数据集如下:
    数据集:统计求职者选则公司的特征

  • 1.4.3,构建数学模型(数学处理过程):

    ①问题:
    A公司满足Ω={福利少、加班少、工资中、压力小、发展前景好、氛围好、位置近、环境好}求,该公司是否是好公司?
    解:
    公式A如下
    在这里插入图片描述在这里插入图片描述
    公式B如下
    在这里插入图片描述
    在这里插入图片描述

    ②拉普拉斯平滑系数:
    根据公式p(工资中|坏公司)=0,肯定不符合真实情况,所以需要“拉普拉斯平滑系数”:当我们在使用朴素贝叶斯算法去解决分类问题时,在训练集上进行训练时我们可以发现有可能出现某些特征的概率P为0的情况,无论是在全文检索中某个字出现的概率,还是在垃圾邮件分类中,这种情况明显是不太合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0,拉普拉斯的理论支撑而拉布拉斯平滑处理正是处理这种情况下应运而生的。
    ③拉普拉斯平滑系数化:
    在这里插入图片描述
    在这里插入图片描述

1.4.4,代码实现Naive Bayes 分类:

# -*- coding: utf-8 -*-
from numpy import *
from functools import reduceadClass = 1def loadDataSet():"""加载数据集合及其对应的分类"""# 福利	加班	工资	工作压力	发展前景	公司氛围	公司位置	环境wordsList = [['福利少', '加班多', '工资少', '压力大', '发展前景差', '氛围中', '位置中', '环境差'],['福利好', '加班少', '工资多', '压力小', '发展前景好', '氛围好', '位置近', '环境好'],['福利好', '加班中', '工资中', '压力中', '发展前景好', '氛围好', '位置近', '环境好'],['福利中', '加班少', '工资少', '压力小', '发展前景中', '氛围好', '位置近', '环境好'],['福利少', '加班中', '工资少', '压力中', '发展前景差', '氛围中', '位置远', '环境中'],['福利中', '加班多', '工资多', '压力大', '发展前景中', '氛围好', '位置远', '环境中'],['福利少', '加班多', '工资中', '压力大', '发展前景差', '氛围中', '位置中', '环境差'],['福利中', '加班少', '工资少', '压力小', '发展前景好', '氛围中', '位置近', '环境好'],['福利中', '加班多', '工资多', '压力大', '发展前景中', '氛围好', '位置远', '环境中'],['福利少', '加班少', '工资多', '压力小', '发展前景好', '氛围中', '位置中', '环境好'],['福利少', '加班少', '工资少', '压力小', '发展前景好', '氛围差', '位置近', '环境好'],['福利少', '加班少', '工资少', '压力大', '发展前景好', '氛围差', '位置中', '环境差'],]# 1 是, 0 否classVec = [0,1, 1, 0,0, 1, 1, 0, 1, 1,1,0]return wordsList, classVec# python中的& | 是位运算符   and or是逻辑运算符 当and的运算结果为true时候返回的并不是true而是运算结果最后一位变量的值
# 当and返回的结果是false时候,如果A AND B 返回的是第一个false的值,如果a为false 则返回a,如果a不是false,那么返回b
# 如果a or b 为true时候,返回的是第一个真的变量的值,如果a,b都为真时候那么返回a 如果a为假b为真那么返回b
# a & b a和b为两个set,返回结果取a和b的交集  a|b a和b为两个set,返回结果为两个集合的不重复并集def doc2VecList(docList):# 从第一个和第二个集合开始进行并集操作,最后返回一个不重复的并集# a = list(reduce(lambda x, y: set(x) | set(y), docList))a =['环境好', '氛围中', '压力大', '压力小', '工资少', '氛围好', '加班多', '福利少', '发展前景差', '福利好', '环境差', '加班少', '加班中', '位置远', '工资中', '位置中', '氛围差', '环境中', '压力中', '发展前景中', '工资多', '位置近', '福利中', '发展前景好']return adef words2Vec(vecList, inputWords):"""把单子转化为词向量"""# 转化成以一维数组resultVec = [0] * len(vecList)for word in inputWords:if word in vecList:# 在单词出现的位置上的计数加1resultVec[vecList.index(word)] += 1else:print('没有发现此单词')return array(resultVec)#trainMat, classVec
def trainNB(trainMatrix, trainClass):"""计算,生成每个词对于类别上的概率"""# 类别行数numTrainClass = len(trainClass)# 列数numWords = len(trainMatrix[0])# 全部都初始化为1, 防止出现概率为0的情况出现# 见于韩家炜的数据挖掘概念与技术上的讲解,避免出现概率为0的状况,影响计算,因为在数量很大的情况下,在分子和分母同时+1的情况不会# 影响主要的数据p0Num = ones(numWords)p1Num = ones(numWords)# 相应的单词初始化为1# 为了分子分母同时都加上某个数λp0Words = 1.0p1Words = 1.0# 统计每个分类的词的总数# 训练数据集的行数作为遍历的条件,从1开始# 如果当前类别为1,那么p1Num会加上当前单词矩阵行数据,依次遍历# 如果当前类别为0,那么p0Num会加上当前单词矩阵行数据,依次遍历# 同时统计当前类别下单词的个数和p1Words和p0Wordsfor i in range(numTrainClass):if trainClass[i] == 1:# 数组在对应的位置上相加p1Num += trainMatrix[i]p1Words += sum(trainMatrix[i])# print("i=",i,",p1Words=",p1Words,",trainMatrix[i]=",trainMatrix[i])else:p0Num += trainMatrix[i]p0Words += sum(trainMatrix[i])# print("i=",i,",p1Num=",p1Num,",trainMatrix[i]=",trainMatrix[i])print("i=",i,',p0Num=',p0Num,",p0Words=",p0Words,",trainMatrix[i]=",trainMatrix[i])# 计算每种类型里面, 每个单词出现的概率# 朴素贝叶斯分类中,y=x是单调递增函数,y=ln(x)也是单调的递增的# 如果x1>x2 那么ln(x1)>ln(x2)# 在计算过程中,由于概率的值较小,所以我们就取对数进行比较,根据对数的特性# ln(MN) = ln(M)+ln(N)# ln(M/N) = ln(M)-ln(N)# ln(M**n)= nln(M)# 注:其中ln可替换为log的任意对数底print("p0Num==",p0Num)print("p0Num / p0Words===",p0Num / p0Words)p0Vec = log(p0Num / p0Words)p1Vec = log(p1Num / p1Words)# 计算在类别中1出现的概率,0出现的概率可通过1-p得到pClass1 = sum(trainClass) / float(numTrainClass)return p0Vec, p1Vec, pClass1def classifyNB(testVec, p0Vec, p1Vec, pClass1):# 朴素贝叶斯分类, max(p0, p1)作为推断的分类# y=x 是单调递增的, y=ln(x)也是单调递增的。 , 如果x1 > x2, 那么ln(x1) > ln(x2)# 因为概率的值太小了,所以我们可以取ln, 根据对数特性ln(ab) = lna + lnb, 可以简化计算# sum是numpy的函数,testVec是一个数组向量,p1Vec是一个1的概率向量,通过矩阵之间的乘机# 获得p(X1|Yj)*p(X2|Yj)*...*p(Xn|Yj)*p(Yj)# 其中pClass1即为p(Yj)# 此处计算出的p1是用对数表示,按照上面所说的,对数也是单调的,而贝叶斯分类主要是通过比较概率# 出现的大小,不需要确切的概率数据,因此下述表述完全正确# p1 = sum(testVec * p1Vec) + log(pClass1)# p0 = sum(testVec * p0Vec) + log(1 - pClass1)p1 = sum(testVec * p1Vec) + log(pClass1)p0 = sum(testVec * p0Vec) + log(1 - pClass1)print("p1=", p1, ",p0=", p1)if p0 > p1:return 0return 1def printClass(words, testClass):if testClass == adClass:print(words, '推测为:好公司')else:print(words, '推测为:坏公司')def tNB():# 从训练数据集中提取出属性矩阵和分类数据docList, classVec = loadDataSet()allWordsVec = doc2VecList(docList) #去重print("allWordsVec=",allWordsVec)# 构建词向量矩阵# 计算docList数据集中每一行每个单词出现的次数,其中返回的trainMat是一个数组的数组print("docList:", docList)trainMat = list(map(lambda x: words2Vec(allWordsVec, x), docList))print("trainMat:",trainMat)# 训练计算每个词在分类上的概率, p0V:每个单词在非分类出现的概率, p1V:每个单词在是分类出现的概率# 其中概率是以ln进行计算的# pClass1为类别中是1的概率p0V, p1V, pClass1 = trainNB(trainMat, classVec)# 测试数据集print("p0V:", p0V)print("p1V:", p1V)print("pClass1:", pClass1)#福利	加班	工资	工作压力	发展前景	公司氛围	公司位置	环境# testWords = ['福利少', '加班多', '工资多', '压力大', '发展前景差', '氛围中', '位置中', '环境差']testWords = ['福利少', '加班多', '工资多', '压力大', '发展前景差', '氛围中', '位置中', '环境差']# testWords = ['公司', '聚餐', '讨论', '贝叶斯']# 转换成单词向量,32个单词构成的数组,如果此单词在数组中,数组的项值置1testVec = words2Vec(allWordsVec, testWords)print("testWords=",testWords,",testVec=",testVec)# 通过将单词向量testVec代入,根据贝叶斯公式,比较各个类别的后验概率,判断当前数据的分类情况testClass = classifyNB(testVec, p0V, p1V, pClass1)# 打印出测试结果printClass(testWords, testClass)# 福利	加班	工资	工作压力	发展前景	公司氛围	公司位置	环境# testWords = ['福利少', '加班少', '工资多', '压力小', '发展前景好', '氛围好', '位置近', '环境好']testWords = ['福利少', '加班少', '工资中', '压力小', '发展前景好', '氛围好', '位置近', '环境好']# 转换成单词向量,32个单词构成的数组,如果此单词在数组中,数组的项值置1testVec = words2Vec(allWordsVec, testWords)# 通过将单词向量testVec代入,根据贝叶斯公式,比较各个类别的后验概率,判断当前数据的分类情况testClass = classifyNB(testVec, p0V, p1V, pClass1)# 打印出测试结果printClass(testWords, testClass)if __name__ == '__main__':tNB()# x# print(len(a))# print(log(4,2))# print(words2Vec(['高', '差', '少', '中', '好', '近', '小', '远', '多'],['少', '多', '少', '高', '差', '中', '中', '差']))
‘’‘输出结果’‘’
['福利少', '加班多', '工资多', '压力大', '发展前景差', '氛围中', '位置中', '环境差'] 推测为:坏公司
['福利少', '加班少', '工资中', '压力小', '发展前景好', '氛围好', '位置近', '环境好'] 推测为:好公司

http://chatgpt.dhexx.cn/article/gWLZUR1G.shtml

相关文章

实验五 贝叶斯分类器(模式识别与机器学习)

目录 实验一 离散型数据的朴素贝叶斯分类 实验步骤: NBtrain.m NBtest.m main.m 实验二 连续型数据的朴素贝叶斯分类 实验步骤: naiveBayestrain.m navieBayestest.m main.m 实验一 离散型数据的朴素贝叶斯分类 data数据集中含有625个样本,每个样…

贝叶斯分类器详解

文章目录 一、贝叶斯简介二、贝叶斯决策论三、极大似然估计例题解析 四、朴素贝叶斯分类器例题解析 五、半朴素贝叶斯分类器 一、贝叶斯简介 简介:贝叶斯分类器是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类器。而…

机器学习(六)——贝叶斯分类器

贝叶斯分类器是一类分类算法的总称,均以贝叶斯定理为理论基础 一、预备知识—贝叶斯决策论 1.公式 \qquad 贝叶斯决策论是概率框架下的实施决策的基本方法。对于分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于概率…

机器学习——贝叶斯分类器

这里写目录标题 1.贝叶斯分类器属于生成式模型2.贝叶斯定理3.朴素贝叶斯分类器3.1朴素贝叶斯分类器中的数学模型3.2分类器的分类准则 1.贝叶斯分类器属于生成式模型 对于数据的判别分类有两种策略模型:判别式模型和生成式模型 判别式模型 : 逻辑回归、决策树、支持…

贝叶斯分类器原理——学习笔记

贝叶斯分类器原理 简介一、逆概率推理与贝叶斯公式1、确定性推理与概率推理2、贝叶斯公式 二、贝叶斯分类的原理三、概率估计1、先验概率的估计2、类条件概率的估计 四、贝叶斯分类的错误率五、常用贝叶斯分类器1、最小错误率贝叶斯分类器2、最小风险贝叶斯分类器3、朴素贝叶斯…

机器学习-贝叶斯分类器(附Python代码)

1. 贝叶斯原理 Naive Bayes 官方网址: https://scikit-learn.org/stable/modules/naive_bayes.html GitHub地址:https://github.com/gao7025/naive_bayes.git 贝叶斯分类是以贝叶斯定理为基础的一种分类算法,其主要思想为:先验…

chrome插件开发入门实战——CSDN免登陆拷贝、免关注查看

官方资料 docextensions官方chrome-extensions-samples 实战CSDN插件(V3) 功能 CSDN: 复制代码免登陆;CSDN: 免关注博主看文章;CSDN: 替换CSDN代码拷贝按钮,登陆也不用CSDN复制按…

Github实用浏览器插件推荐

文章目录 1. github树形目录插件-octotree(有付费功能)2. 快速下载github项目——GitHub加速3. 下载github中指定文件——GitZip for github4. github代码定义跳转浏览插件-Sourcegraph 某天看直播课程的时候看到这样一个界面: 然后就搜了一下…

IDEA必备插件

一、插件入口 二、IDEA必备插件 插件安装目录:C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2021.3\plugins 1.Alibaba Java Coding Guidelines 推荐指数:★★★ 介绍:阿里巴巴Java编码指南 安装之后右键菜单会多出两个选项&a…

Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版

Visual Studio 2017,CMFC免注册调用大漠插件图文教程,详细版 前言 提示:这里可以添加本文要记录的大概内容: 有很多人都在问CMFC怎么免注册调用?其实这些都有参考但是对于新手来说,编译器对新手的不友好&#xff0c…

PHPstorm必备插件推荐

1、.env files support 对.env 文件的支持 2、 .ignore 对.ignore 文件的支持 3、 Ideolog 对 .log 文件的支持 4、 Chinese (Simplified) Language Pack / 中文语言包 官方版中文语言包 | 汉化语言包 5、 Git 对Git的支持 6、 GitToolBox 支持在文件中展示当前代码最后的…

【BurpSuite】插件之自用插件

自用burpsuite插件汇总 前言 自用的一些burpsute插件,有的是自己改着写的,有的是用别人写的,备份记录为主要目的。万一哪天环境崩了也能快速记起来要用什么插件。 重写右键执行 自己重写的一些代码,核心点是处理http请求&…

插件的使用

1、插件写法:插件通常会为 Vue 添加全局功能,添加全局方法或者属性; 添加全局资源:指令/过滤器/过渡等;通过全局 mixin 方法添加一些组件选项; 添加 Vue 实例方法,通过把它们添加到 Vue.proto…

TypechoCMS通用发布插件-【免登录版本】

Typecho是一个操作简单快速的轻量博客平台。 轻量高效:不足 400KB 的代码,就实现了完整的插件与模板机制。超低的 CPU 和内存使用率,足以发挥主机的最高性能。 先进稳定:支持 BAE/GAE/SAE 等各类云主机,即使面对突如…

【Unity插件】最多的插件合集

一、前言 ? 最近整理了一下文章,发现我分享了很多的插件,但是如果要查找某一款插件,还需要去搜索才能找到,很不方面,就想要将写过的所有的插件分享也好,教程也好,做一个汇总,然后这…

AS常用插件

1.​​adb-idea​​ 支持直接在AS面板中进行ADB操作 2.Android Code Generator 根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。 http://plugins.jetbrains.com/files/7595/screenshot_14834.png 3.CodeGlance 右边实现代…

油猴插件免费下载

安利一个黑科技,名叫"油猴子"。点击下载 Tampermonkey中文名俗称油猴,是一款免费的浏览器插件,目前最为流行的用户脚本管理器,用户可以通过油猴添加和使用脚本,而脚本是一种可以修改网页JavaScript的程序。…

超实用的浏览器插件:CSDN全站去广告

文章目录 1先下载安装为快2功能分析评测1浏览界面清爽便捷2永久免费去站内广告3神奇的C键搜索功能4 json格式化 3改进建议 最近CSDN官方出了一个插件,一起来see see有啥好玩的地方 hello,我是北京某不知名211大学计算机专业的一名大三学生(哈…

超实用的浏览器插件永久免费!!!

能让工作效率翻N倍 ,是不是心动了主要功能 个性化标签、自动换肤、自定义常用网站,同时可选择多种搜索引擎 永久免费去站内广告 一键万能框搜索 实用快捷工具(日期格式化、时间戳自动转换、在线翻译) 新增一键json转换 占内存…

【Chrome必备插件,一键提升10倍效率】新用户永久免广告,好用!

CSDN 官方出品的浏览器插件–CSDN开发者助手 终于正式更新啦!更多好玩功能等你发现,现在登录⭕️官网即可下载 CSDN浏览器助手,风格简约清爽,体积不到1M,一键极简操作万能工具,让你在工作、学习和技术开发场…