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

目录

一、理论

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 = 0
  for 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 = 1
  for attr,value in test.items():
    # 属性是离散的
    tmp = calP_xiForI(attr,value,Dc)
    
    ans*= tmp

  return ans*Pc

2)连续属性:

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

import math
### 计算均值
def calmu_c_i(Dc,attr):
  mu = 0
  for 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 = 0
  mu = 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 = 1
  for attr,value in test.items():
    # 属性是离散的
    if Attrs[attr] == 'c':
      tmp = calP_xiForC(attr,Dc,test)
    else:
      tmp = calP_xiForI_v2(attr,value,Dc)
    # 属性是连续的
    ans*= tmp
  print(f"calPcx_v3:{ans*Pc}")
  return ans*Pc

3、实战结果

(复现西瓜书7.3的例题)

1、数据集展示

训练数据集:

e354ea21347841849f42ff43ede660dc.png

测试例:

d41edf8925064b76b24fb9147323e98e.png

2、相关信息打印

3c926145d3a44b388d41c1a4d45560a1.png

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

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

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

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源流程图表库(01):Mermaid.js生成流程图、时序图、甘特图等

一、Mermaid.js的特点 Mermaid.js是一个用于生成流程图、时序图、甘特图等各种图表的开源库。它使用简洁的文本语法来描述图表结构,并将其转换为可视化的图形。 Mermaid.js的主要特点包括: 简洁易用:Mermaid.js使用简单的文本语法来描述图表…

Introduction to Data Mining 数据挖掘

Why Data Mining? • The Explosive Growth of Data: from terabytes to petabytes — Data collection and data availability ◦ Automated data collection tools, database systems, Web, computerized society — Major sources of abundant data ◦ Business: Web, e-co…

RabbitMQ入门学习【附案例讲解】

文章目录 1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比: 2、安装RabbitMQ2.1、下载镜像2.2、单机部署2.3、集群部署 3、基本结构4、RabbitMQ消息模型5、代码示例5.1、导入Demo工程5.2、publisher实现5.3、consumer实现5.4、效果 6、总结 ​…

C++项目——集群聊天服务器项目(四)MySQL数据库

今天来介绍集群聊天器项目中MySQL数据库的相关表结构 集群聊天服务器项目需要进行好友、群组的增删操作以及好友离线状态的判断,需要在数据库中建立相关表进行增删改查操作,因此项目设计了如下五个表,大家可以自己动动小手,使用S…

vulhub中Apache Shiro 1.2.4反序列化漏洞复现(CVE-2016-4437)

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的…

【蓝桥杯入门记录】中断系统

一、中断概述 (1)处理器和外部设备的数据传输方式 无条件传输:处理器不比为了了解外部设备状态,直接进行数据传输,用于指示灯和蜂鸣器灯等简单设备查询方式:传输前,一方先查询另一方的状态&am…

CVPR 2024中有哪些值得关注的视频生成和视频编辑方向的论文?

Diffusion Models视频生成-博客汇总 前言:轰轰烈烈的CVPR 2024所有accept paper已经全部公开,随着Sora的爆火,视频生成和视频编辑是目前计算机视觉最火热的方向,受到了很多人的关注。这篇博客就整理盘点一下有哪些值得关注的视频生成和视频编辑方向的论文?值得做这个方向的…

Day56-LNMP架构扩展为集群模式实战精讲

Day56-LNMP架构扩展为集群模式实战精讲 1. 企业级标准部署知乎产品wecenter1.1 部署知乎软件Wecenter 2. 企业级迁移数据库到独立服务器2.1 为什么要进行数据库的拆分2.2 数据库拆分架构演变过程,如下图所示2.3 数据库拆分环境规划2.4 数据库拆分架构详细步骤2.4 we…

【计算机网络】启程

📝本文介绍 本文为计算机网路系列的开始篇,会介绍一下使用的书籍和自己做的思维导图。 👋作者简介:一个正在积极探索的本科生 📱联系方式:943641266(QQ) 🚪Github地址:https://githu…

对于组件通信的深刻理解

父组件传递数据给子组件 props传递数据 父组件在子组件的标签上写自定义的属性,属性值是自己的变量,当渲染到子组件时,执行props会找自定义属性,内存了变量的内存,可访问到,写props,会生成vue实例的时候,将props的变量赋给,值找变量内存存入变量.插值语句等可访问.父组件会变…

【ArcGIS微课1000例】0106:ArcGIS制作风向频率(风速)玫瑰图

文章目录 一、效果预览二、加载数据三、创建图表四、图表修饰五、保存图片一、效果预览 在ArcGIS制作的风向频率玫瑰图最终效果如下所示: 二、加载数据 加载配套实验数据包中0106.rar中的excel数据,然后右键→打开。 三、创建图表 1. 创建图表。右击打开属性表,选择表选项…

硅谷甄选项目笔记

硅谷甄选运营平台 此次教学课程为硅谷甄选运营平台项目,包含运营平台项目模板从0到1开发,以及数据大屏幕、权限等业务。 此次教学课程涉及到技术栈包含***:vue3TypeScriptvue-routerpiniaelement-plusaxiosecharts***等技术栈。 一、vue3组件通信方式 通信仓库地…

在 Windows 中安装配置并启动运行 Jenkins【图文详细教程】

安装 Jenkins 的系统要求: 最少 256MB 可用内存最少 1GB 可用磁盘空间JDK 8 / 11 /17(Jenkins 是用 Java 写的,打包成 war 包) 查看 JDK 的版本 Java JDK 在 Windows 中安装可以参考:https://www.yuque.com/u27599042/…

JVM快速入门(2)HotSpot和堆、新生区、永久区、堆内存调优、JProfiler工具分析OOM原因、GC(垃圾回收)、JVM经典面试笔试题整理

5.6 HotSpot和堆 5.6.1 Hotspot 三种JVM: Sun公司,HotspotBEA,JRockitIBM,J9 VM,号称是世界上最快的Java虚拟机 我们一般学习的是:HotSpot 5.6.2 堆 Heap,一个JVM只有一个堆内存&#xff0c…

Py之scikit-learn-extra:scikit-learn-extra的简介、安装、案例应用之详细攻略

Py之scikit-learn-extra:scikit-learn-extra的简介、安装、案例应用之详细攻略 目录 scikit-learn-extra的简介 scikit-learn-extra的安装 scikit-learn-extra的案例应用 1、使用 scikit-learn-extra 中的 IsolationForest 模型进行异常检测 scikit-learn-extra…

什么是LLM Agent它如何运作?

什么是LLM Agent它如何运作? 代理背后的主要直觉是一个模型,使用大型语言模型作为其中央计算引擎来推理问题、计划解决问题并使用一组工具来解决问题。 现实世界中的实际任务没有一步解决方案。它们通常需要多个相关和独立的步骤才能完成。对于“A 公司…

AI智能视频粗剪解决方案助力企业高效运营

面对海量的视频素材,如何快速、准确地检索和剪辑,成为摆在企业面前的一大难题。美摄科技凭借其在人工智能领域的深厚积累,推出了领先的AI智能视频粗剪解决方案,为企业提供了高效、智能的视频处理新选择。 美摄科技的AI智能视频粗…

Nginx 服务启停方式

1. 前言 nginx 安装后,接下来我们就要学习如何启动、停止、重启 nginx 的服务 对于 nginx 服务的启停控制,在 linux 系统中也有多种方式,比如:信号控制、命令行控制 信号控制:使用 nginx 服务的信号来控制&#xff0…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果: 这里,cat的第一个输入变量用()包绕&#xf…

Java研学-SpringBoot(二)

二 Spring Boot 介绍 1 简介 Spring Boot是由Pivotal团队提供的全新框架,主要目标是简化Spring应用程序的配置和部署过程,减少开发者在项目搭建和配置上的工作量,让开发者能够更专注于业务逻辑的实现。它使用特定的方式来进行配置&#xff0…