机器学习——贝叶斯分类器(基础理论+编程)

目录

一、理论

1、初步引入

2、做简化

3、拉普拉斯修正

二、实战

1、计算P(c)

2、计算P(x|c)

3、实战结果

1、数据集展示

2、相关信息打印


 

一、理论

1、初步引入

在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

个人通俗地理解:给一些这个西瓜的信息x(eg:纹理如何?色泽如何?),计算这个西瓜是好瓜的概率和是坏瓜的概率,比较大小,哪个概率较大,该西瓜就属于哪一类

理解转为公式:就是找 eq?%5Cmax_%7Bc_i%7D%20P%28c_i%7Cx%29

2、做简化

1)贝叶斯转换

由贝叶斯公式可以将eq?P%28c_i%7Cx%29 做如下转换:

                eq?P%28c_i%7Cx%29%20%3D%20%5Cfrac%7BP%28x%2Cc_i%29%7D%7BP%28x%29%7D%20%3D%20%5Cfrac%7BP%28x%7Cc_i%29P%28c_i%29%7D%7BP%28x%29%7D

2)针对目标简化:

我们最终是要确定使得eq?P%28c_i%7Cx%29最大的eq?c_i ,而eq?P%28x%29 对任何 eq?c_i 都一致,所以求

eq?%5Cmax_%7Bc_i%7D%20P%28c_i%7Cx%29 可以舍去分母,也即求 eq?%5Cmax%20P%28x%7Cc_i%29P%28c_i%29

对于 eq?P%28x%7Cc_i%29 和 eq?P%28c_i%29 采用估计

3)求P(c)

假定训练集数据容量足够且分布能够真实反应数据实际时,我们可以将频率估计为概率

即 eq?P%28c_i%29%20%3D%20%5Cfrac%7B%7CD_%7Bc_i%7D%7C%7D%7B%7CD%7C%7D

4)求P(x|c_i)

a)x是离散属性

eq?D_%7Bc%2Cxi%7D 表示eq?D_c中在第i个属性上取值为xi的样本组成的集合,则条件概率eq?P%28x%7Cc_i%29 可估计为

        eq?p%28x_i%7Cc%29%20%3D%20%5Cfrac%7B%7CD_%7Bc%2Cx_i%7D%7C%7D%7BD_c%7D

b)x是连续属性

通常对条件概率不能用频率估计,一般采用的方式:先假定其具有某种确定的概率分布形式,再基于训练样本对概率分布的参数进行估计。

假设eq?P%28x%7Cc_i%29 服从正态分布,

                        eq?p%28x_i%7Cc%29%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7B2%5Cpi%5Csigma_%7Bc%2Ci%7D%7D%7De%5E%7B%28-%5Cfrac%7B%28x-%5Cmu_%7Bc%2Ci%7D%29%5E2%7D%7B2%5Csigma%5E2_%7Bc%2Ci%7D%7D%29%7D

其中:

         eq?%5Cmu_%7Bc%2Ci%7D%20%3D%20%5Cfrac%7B1%7D%7B%7CD_%7Bc%2Ci%7D%7C%7D%5Csum_%7Bx_i%5Cepsilon%20D_c%7D%20x_i  

        eq?%5Csigma_%7Bc%2Ci%7D%5E2%20%3D%20%5Cfrac%7B1%7D%7B%7CD_%7Bc%2Ci%7D%7C%7D%20%5Csum_%7Bx_i%5Cepsilon%20D_%7Bc%2Ci%7D%7D%28x_i-%5Cmu%20_c%29%28x_i-%5Cmu%20_c%29%5ET

3、拉普拉斯修正

问题:若某个属性值在训练集中没有与某个类同时出现过,则直接将概率连乘,会导致“哪怕在其他属性上明显像好瓜,分类的结果都将是坏瓜”的情况。

为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”(smoothing),常用“拉普拉斯修正”(Laplacian correction)

具体做法是:

                eq?P%28c%29%20%3D%20%5Cfrac%7B%7CDc%7C+1%7D%7B%7CD%7C+N%7D

                eq?P%28c%2Ci%29%20%3D%20%5Cfrac%7B%7CD_%7Bc%2Ci%7D%7C+1%7D%7B%7CD_c%7C+N_i%7D

二、实战

1、主要流程介绍:

1)完整代码:

DrawPixel/Bayesian_decison.ipynb at main · ndsoi/DrawPixel (github.com)

2)实战分三个部分:

087e2288935847feb43f06c83d1bbe7e.png

详情可以见上述链接,博文只放关键代码

1、计算P(c)

1)先从数据集中找出类别为c的所有数据

def getDc(train_data,Class):Dc = []for melon in train_data:if melon['类别'] == Class:Dc.append(melon)return Dc

然后只需用以下计算Pc

Pc = len(Dc)/len(train_data)

收集好的Dc可以进一步用于计算 P(x|c)

2、计算P(x|c)

1)离散属性 

写出求 类别c中属性attr取值为value的样本概率

# 计算类别c中属性attr取值为value的样本概率
def calP_xiForI(attr,value,Dc):cnt = 0for melon in Dc:if melon[attr] == value:cnt+=1#print(f"P(({attr}={value})|{melon['类别']})={cnt/len(Dc)}")return cnt/len(Dc)

计算 对于给定的一个样本test('attr1':'value1','attr2':'value2',..,),已知它所有的属性,则它是类别Class的概率【这里仅考虑离散属性】

def calPcx(train_data,Class,test):# 找出类别为Class的数据Dc = getDc(train_data,Class)Pc = len(Dc)/len(train_data)# print(f"P({Class})={Pc}")ans = 1for attr,value in test.items():# 属性是离散的tmp = calP_xiForI(attr,value,Dc)ans*= tmpreturn ans*Pc

2)连续属性:

对于连续属性,要先计算均值和方差:

import math
### 计算均值
def calmu_c_i(Dc,attr):mu = 0for data in Dc:mu += float(data[attr])print(f"attr={attr},mu={mu/len(Dc)}")return mu/len(Dc)### 计算方差
def cal_sigma_c_i(Dc,attr):sigma = 0mu = calmu_c_i(Dc,attr)for data in Dc:sigma+=(float(data[attr])-mu)*(float(data[attr])-mu)print(f"方差attr={attr}.sigma={math.sqrt(sigma/len(Dc))}")return math.sqrt(sigma/len(Dc))

然后写出计算P(x|c)的函数

def calP_xiForC(attr,Dc,test):sigma = cal_sigma_c_i(Dc,attr)mu = calmu_c_i(Dc,attr)tmp = -(float(test[attr])-mu)*(float(test[attr])-mu)/(2*sigma*sigma)return 1/math.sqrt(2*math.pi*sigma)*math.exp(tmp)

计算样本x是Class类别的概率(既考虑离散又考虑连续属性)

def calPcx_v3(train_data,Class,test,Attrs):# 找出类别为Class的数据Dc = getDc(train_data,Class)Pc = len(Dc)/len(train_data)# print(f"P({Class})={Pc}")ans = 1for attr,value in test.items():# 属性是离散的if Attrs[attr] == 'c':tmp = calP_xiForC(attr,Dc,test)else:tmp = calP_xiForI_v2(attr,value,Dc)# 属性是连续的ans*= tmpprint(f"calPcx_v3:{ans*Pc}")return ans*Pc

3、实战结果

(复现西瓜书7.3的例题)

1、数据集展示

训练数据集:

e354ea21347841849f42ff43ede660dc.png

测试例:

d41edf8925064b76b24fb9147323e98e.png

2、相关信息打印

3c926145d3a44b388d41c1a4d45560a1.png

结果解析,最上方的红色和黄色框指的是好瓜中密度的均值、方差以及含糖率的密度和均值

蓝色和绿色框指的是坏瓜中密度的均值、方差以及含糖率的密度和均值

黑色是测试集的原始数据集和预测类别,看到对于测试例的预测是“好瓜”

 

 

 

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

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

相关文章

Jenkins升级中的小问题

文章目录 使用固定版本安装根据jenkins页面下载war包升级jenkins重启jenkins报错问题解决 K8s部署过程中的一些小问题 ##### Jenkins版本小插曲 ​ 在Jenkins环境进行插件安装时全部清一色飘红,发现是因为Jenkins版本过低导致,报错的位置可以找到更新je…

巨控GRM560工业物联网的升级后的功能

巨控GRM560:工业自动化领域的革命者 标签:#工业自动化 #PLC #远程控制 #OPCUA #MQTT 随着工业4.0时代的到来,智能制造已经成为了发展的大势所趋。在这样的背景下,自动化控制系统的核心——可编程逻辑控制器(PLC)的作用…

JS学习之旅第七天

今天是学习JS的第七天,今天学习了数组,话不多说开始今天的讲解。 一、认识数组 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。 1.1创…

shell脚本发布docker-nginx vue2 项目示例

docker、git、node.js安装略过。 使git pull或者git push不需要输入密码操作方法 nginx安装在docker容器里面,参见:https://blog.csdn.net/HSJ0170/article/details/128631155 姊妹篇(宿主机nginx,非docker-nginx)&am…

Vue计算属性computed深度解析,告别只会使用,迎来全面理解

一、基础示例 模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [Vue 2…

基于java+SpringBoot+Vue的数码论坛系统设计与实现

基于javaSpringBootVue的数码论坛系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含: 数码论坛系统是一个基于互联网的数码产品讨论和信息分享平台…

深度学习语义分割篇——DeepLabV2原理详解篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

小狐狸JSON-RPC:wallet_watchAsset(向钱包中新增资产代币)

wallet_watchAsset 请求用户在 MetaMask 中添加新的资产。返回一个布尔值,是否已成功添加。 var res await window.ethereum.request({ "method": "wallet_watchAsset","params": {"type": "ERC20","opti…

盘点库存怎么做账

库存的盘点是企业中非常重要的一步,也是仓管经常要做的工作,盘点通俗点说就是点一下实物与账面上的数据是否一至,来判断我们平时的货物管理是否与账面上的业务往来符合,盘点库存怎么做账? 按目前的情况来看&#xff0c…

什么是软件工程?如何应用软件工程原则?

什么是软件工程? 软件工程是应用工程原则来设计、开发、维护、测试和评估计算机软件的过程。它涵盖了软件开发的整个生命周期,包括需求收集和分析、系统设计、编码、集成和测试、部署以及维护和支持。软件工程的目的是为了确保软件系统的可靠性、效率、…

【数据结构】Java中Map和Set详解(含二叉搜索树和哈希表)

目录 Map和Set详解 1.二叉搜索树 2.Map常见方法 3.Set常见方法 4.哈希表 Map和Set详解 Map:一种键值对结构,hashMap中键和值均可以为空,hashTable中则不可以存放null值 Set:一种集合,不能存放重复元素&#xff0c…

SpringBoot使用Jedis步骤

基础连接方式 引入依赖 <!-- Jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>创建Jedis对象&#xff0c;建立连接 操作字符串 方法名与Rdeis命令一致 操作Hash类型 释放资源 测…

JavaScript PAT乙级题解 1048 数字加密

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A&#xff0c;对任一正整数 B&#xff0c;将其每 1 位数字与 A 的对应位置上的数字进行以下运算&#xff1a;对奇数位&#xff0c;对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12&#xff1…

【小米SU7实测发布】Python与人工智能的结合

小米在2023年底正式发布小米SU7,成为继华为之后第二个推出成品的的科技企业。不过此时小米需要做的不仅是打造一款产品力够高的车型,更是要以后发者的身份更快速地追上头部智驾车企。从昨天的发布会中可以发现,小米SU7采用双Orin-X芯片以及27个感知硬件组合,这套硬件组合在…

kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一)

Pod调度策略 一.标签1.什么是标签2.给Pod资源打标签3.给Node节点打标签4.查看标签资源 二.Node选择器1.nodeName(指定Pod调度到指定Node节点)2.nodeSelector(指定Pod调度到具有指定标签的Node节点) 三.亲和性1.Node亲和性-nodeAffinity2.Pod亲和性-pod-Affinity3.Pod反亲和性-p…

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

ETL工具-nifi干货系列 第五讲 处理器GenerateFlowFile

1、今天我们一起来学习处理器GenerateFlowFile。这个处理器创建带有随机数据或自定义内容的 FlowFiles。GenerateFlowFile 对于负载测试、配置和模拟非常有用。从工具栏拖动处理器到画布&#xff0c;然后选择GenerateFlowFile即可。 2、点击add按钮或者双击 GenerateFlowFile可…

C#WPF控件TextBlock、Label以及与TextBox的区别

本文讲解TextBlock、Label以及与TextBox之间的的区别。 目录 TextBlock和Label区别 TextBox和TextBlock控件区别 TextBlock和Label区别 TextBlock和Label都用于显示文本,但它们有一些区别: 继承:Label继承自ContentControl,而TextBlock直接继承自FrameworkElement。 …

【蓝桥杯省赛真题34】python积木搭建 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

python积木搭建 第十三届蓝桥杯青少年组python比赛省赛真题 一、题目要求 &#xff08;注&#xff1a;input&#xff08;&#xff09;输入函数的括号中不允许添加任何信息&#xff09; 1、编程实现 小蓝和小青在玩积木搭建游戏&#xff0c;具体玩法如下: 小蓝报一个数字N&…

vue多语言包i18n

1.安装 如果是vue2直接安装8.2.1版本&#xff0c;否则会出现版本不匹配的错误 npm install vue-i18n8.2.1 --save2.文件编辑 在src目录下创建文件 en.js export const h {system: "Background management system",loginOut:"LoginOut",LayoutSet:Layout …