机器学习:朴素贝叶斯分类器

贝叶斯决策论是概率框架下实施决策的基本方法,对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

贝叶斯定理是贝叶斯决策论的基础,描述了如何根据新的证据更新先验概率,贝叶斯定理
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac {P(B|A) P(A)} {P(B)} P(AB)=P(B)P(BA)P(A)

后验概率P(A|B)在观测B的条件下A的概率指在观测到数据之后,对某个假设的概率估计。它是通过贝叶斯定理计算得到的,结合了先验概率和似然概率。(事情已经发生,求这件事情发生的原因是由某个因素引起的可能性的大小。
似然概率P(B|A)在A发生的条件下B的概率指在某个假设下,观测数据的概率。它描述了在某个假设下,数据出现的可能性
先验概率P(A)没有观测到B的条件下A的概率指在没有观测到任何数据之前,对某个事件的概率估计。它通常基于先验知识或经验。(根据以往经验或经过数据统计得到的概率。
边际概率P(B)B的总概率

贝叶斯决策论通过结合先验知识和观测数据,使用贝叶斯定理计算后验概率,从而做出最优决策。即:
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) P(c|x) = \frac {P(c) P(x|c)} {P(x)} P(cx)=P(x)P(c)P(xc)
P©是样本空间中各类样本所占的比例,根据大数定理,当训练集包含充足的独立同分布样本时,P©可以通过各类样本所占的比例来进行估计。

但是对于类条件概率P(x|c)来说,涉及了关于x所有属性的联合概率,因此很难进行估计。

例如:每个样本具有d个属性,每个属性都有10个属性值,那么样本空间将有 1 0 d 10^d 10d种可能值,导致组合爆炸

朴素贝叶斯对条件概率分布做了条件独立性假设

即,现在有 10 × d 10 \times d 10×d种可能值。

P ( x ∣ c ) = ∏ j = 1 n P ( x j ∣ c ) P(x|c) = \prod_{j=1}^{n}P(x^j|c) P(xc)=j=1nP(xjc)

先验概率:
P ( c k ) = ∑ i N I ( y i = c k ) N P(c_k) = \frac {\sum_i^NI(y_i = c_k)} {N} P(ck)=NiNI(yi=ck)
属性值是离散情况下,条件概率为:
P ( x j = a j l ∣ y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) P(x^j = a_{jl}|y = c_k) = \frac {\sum_{i=1}^NI(x_i^{(j)} = a_{jl}, y_i=c_k)} {\sum_{i=1}^{N}I(y_i=c_k)} P(xj=ajly=ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)
属性值是连续情况下,条件概率为:

假设概率密度P(x|c)服从正太分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2),通过极大似然估计得到的正态分布均值就是样本均值,方差就是 ( x − μ c ^ ) ( x − μ c ^ ) T (x - \hat{\mu_c})(x - \hat{\mu_c})^T (xμc^)(xμc^)T

这样假设使其问题变得简单,但是估计准确性严重依赖所假设的概率分布形式是否符合潜在的真实数据分布。不过准确性却较高。

例如:

在这里插入图片描述

代码示例:

数据处理:将DataFrame转为numpy.array类型,并自定义分出训练集和测试集用来检验正确性。

import pandas as pd
import numpy as np
from io import StringIOdata = '编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜\n\
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是\n\
2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是\n\
3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是\n\
4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是\n\
5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是\n\
6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是\n\
7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是\n\
8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是\n\
9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否\n\
10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否\n\
11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否\n\
12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否\n\
13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否\n\
14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否\n\
15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否\n\
16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否\n\
17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否'df = pd.read_csv(StringIO(data))
# print(df.info())def obj_to_int(series: pd.Series):return pd.Categorical(series).codesdef label_encoder(df: pd.DataFrame):for col in df.columns:if df[col].dtype == 'object':df[col] = obj_to_int(df[col])return df# 已完成:2025年2月9日 14点27分
# # 保存处理后的数据
# df = label_encoder(df)
# df.to_csv('data.csv', index=False)# # 已完成:2025年2月9日 14点30分
# # 随机选择三行作为测试集
# test_set = df.sample(n=3, random_state=42)
# # 获取剩余的行作为训练集
# train_set = df.drop(test_set.index)
# # 保存训练集和测试集
# train_set.to_csv('train.csv', index=False)
# test_set.to_csv('test.csv', index=False)def get_train_data():df = pd.read_csv('train.csv')return np.array(df.iloc[:, :])def get_test_data():# 2025年2月9日 16点19分df = pd.read_csv('test.csv')return np.array(df.iloc[0:, :])# 随机选择一半的数据作为训练集# df = pd.read_csv('data.csv')# bool_array = np.random.choice([True, False], size=len(df), p=[0.5, 0.5])# return np.array(df[bool_array].iloc[:, :])
# print(get_train_data())
# print(get_test_data())

朴素贝叶斯

  • 计算先验概率

    def get_prior_prob(train_data: np.array):# 先验概率prior_prob = {}# 计算先验概率for i in range(len(train_data)):if train_data[i][-1] not in prior_prob:prior_prob[int(train_data[i][-1])] = 1else:prior_prob[int(train_data[i][-1])] += 1for key in prior_prob:prior_prob[key] /= len(train_data)return prior_prob
    
  • 计算条件概率

    • 离散值

      n = len(train_data[0]) - 1cond_prob = [ {} for i in range(n) ]# 计算条件概率# (特征值, 类别) -> 出现次数fea_res_cnt = [[0,0] for i in range(n)]for i in range(len(train_data)):for j in range(1, n):if int(train_data[i][-1]) == 0:fea_res_cnt[j][0] += 1else:  fea_res_cnt[j][1] += 1for i in range(len(train_data)):# 仅计算特征值为离散值的条件概率for j in range(1, n - 2):fea = int(train_data[i][j])res = int(train_data[i][-1])if (fea, res) not in cond_prob[j]:cond_prob[j][(fea, res)] = 1else:cond_prob[j][(fea, res)] += 1
      
    • 连续值:使用极大似然法球的均值、标准差,进行正太分布

      # 计算特征值为连续值的条件概率reslist = [ [ [] for i in range(2)] for j in range(2)]for i in range(len(train_data)):for j in range(n - 2, n):res = int(train_data[i][-1])reslist[j - n + 2][res].append(float(train_data[i][j]))for i in range(2):for j in range(2):mean,std = np.mean(reslist[i][j]),np.std(reslist[i][j])cond_prob[i + n - 2][(j, mean, std)] = 0

    总的这个函数代码:

    def get_cond_prob(train_data: np.array):n = len(train_data[0]) - 1cond_prob = [ {} for i in range(n) ]# 计算条件概率# (特征值, 类别) -> 出现次数fea_res_cnt = [[0,0] for i in range(n)]for i in range(len(train_data)):for j in range(1, n):if int(train_data[i][-1]) == 0:fea_res_cnt[j][0] += 1else:  fea_res_cnt[j][1] += 1for i in range(len(train_data)):# 仅计算特征值为离散值的条件概率for j in range(1, n - 2):fea = int(train_data[i][j])res = int(train_data[i][-1])if (fea, res) not in cond_prob[j]:cond_prob[j][(fea, res)] = 1else:cond_prob[j][(fea, res)] += 1# 计算特征值为连续值的条件概率reslist = [ [ [] for i in range(2)] for j in range(2)]for i in range(len(train_data)):for j in range(n - 2, n):res = int(train_data[i][-1])reslist[j - n + 2][res].append(float(train_data[i][j]))for i in range(2):for j in range(2):mean,std = np.mean(reslist[i][j]),np.std(reslist[i][j])cond_prob[i + n - 2][(j, mean, std)] = 0# 计算条件概率for i in range(1, n - 2):for key in cond_prob[i]:cond_prob[i][key] /= fea_res_cnt[i][key[1]]return cond_prob

在这里插入图片描述

  • 进行测试

    # 正太分布密度概率
    def probability_density_function(mean:float, std:float, var:float) -> float:return (1/(std * np.sqrt(2 * np.pi))) * np.
exp(-0.5 * ((var - mean)/std)**2)def test():cond_prob = get_cond_prob(get_train_data())prior_prob = get_prior_prob(get_train_data())test_data = get_test_data()# 预测right_cnt = 0for i in range(len(test_data)):good = bad = 1good = prior_prob[1]bad = prior_prob[0]for j in range(len(cond_prob)):for key in cond_prob[j]:if len(key) == 2:if key[1] == 0:bad *= cond_prob[j][(int(test_data[i][j]), key[1])]else:good *= cond_prob[j].get((int(test_data[i][j]), key[1]), 0) # 有可能出现未知的特征值elif len(key) == 3:if key[0] == 0:bad *= probability_density_function(key[1], key[2], float(test_data[i][j]))else:good *= probability_density_function(key[1], key[2], float(test_data[i][j]))if good > bad:print('good')if int(test_data[i][-1]) == 1:print('right')right_cnt += 1else:print('bad')if int(test_data[i][-1]) == 0:print('right')right_cnt += 1print(f'accuracy: {right_cnt / len(test_data)}')

在这里插入图片描述

朴素贝叶斯(Naive Bayes)算法理论与实践 - 简书 (jianshu.com)

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

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

相关文章

差速驱动机器人MPC算法实现-C++

差速驱动机器人,其运动学模型需要考虑线速度和角速度。MPC(模型预测控制)需要建立预测模型,并在每个控制周期内求解优化问题。 差速驱动机器人的运动学方程通常包括位置(x, y)和航向角θ,线速度…

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…

mysql8 从C++源码角度看sql生成抽象语法树

在 MySQL 8 的 C 源码中,SQL 语句的解析过程涉及多个步骤,包括词法分析、语法分析和抽象语法树(AST)的生成。以下是详细的解析过程和相关组件的描述: 1. 词法分析器(Lexer) MySQL 使用一个称为…

excel合并表格

上一章说到excel拆分表格,可以按一列的不重复数据自动拆分成多个表格。这个功能主要适用于有多个下级机构的部门分发表格使用。表格分发完成,下级单位修改后,上传到我们这里。我们还得把这些表格合并成一个表。如果利用复制粘性,工…

区块链100问之加密算法

区块链100问之加密算法 文章目录 区块链100问之加密算法哈希算法是什么?有什么特征?哈希碰撞是什么?雪崩效应呢?如何解决?哈希算法的作用?对称加密和非对称加密有什么区别?为什么会引入非对称加密&#xf…

模型压缩中的四大核心技术 —— 量化、剪枝、知识蒸馏和二值化

一、量化 (Quantization) 量化的目标在于将原始以 32 位浮点数表示的模型参数和中间激活,转换为低精度(如 FP16、INT8、甚至更低位宽)的数值表示,从而在减少模型存储占用和内存带宽的同时,加速推理运算,特别适用于移动、嵌入式和边缘计算场景。 1.1 概念与目标 基本思想…

【LLM】o1/R1系列LLM数据篇

关于思维链推理的10开源数据集: 目前开源的数据主要有如下: 1、Magpie-Reasoning-V2数据集,其中包含DeepSeek-R1生成的250K思路链推理样本,这些示例涵盖了数学推理、编码和一般问题解决等各种任务。https://huggingface.co/datas…

elasticsearch实战应用从入门到高效使用java集成es快速上手

Elasticsearch 因其出色的性能、可扩展性和易用性,成为了处理大规模数据和构建搜索引擎的首选工具。本文将通过一个实际案例,详细讲解如何在 Spring Boot 项目中集成 Elasticsearch,进行数据索引、搜索、聚合分析等操作。 一、Elasticsearch 简介 Elasticsearch 是一个基于…

Centos Stream 10 根目录下的文件夹结构

/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…

旋转位置编码(RoPE)讲解和代码实现

旋转位置编码(Rotary Position Embedding:RoPE)讲解和代码实现 1. 什么是位置编码? 在 Transformer 模型中,位置编码的作用是为模型提供序列中每个 token 的位置信息。因为 Transformer 本身没有像 RNN 那样的顺序结构,所以需要通过位置编码来告诉模型 token 的顺序。 …

绘制中国平安股价的交互式 K 线图

在本文中,探索如何使用 Python 的强大库进行股市数据分析与可视化。我们将以中国平安(股票代码:sh601318)为例,展示如何获取其股票数据,并绘制一张交互式 K 线图。 K 线图是股市分析中不可或缺的工具,它能够直观地显示股票的波动情况,包括开盘价、收盘价、最高价和最低…

HTML应用指南:利用GET请求获取全国盒马门店位置信息

随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马…

(原创,可用)SSH实现内外网安全穿透(安全不怕防火墙)

目前有A、B终端和一台服务器,A、B机器不能直接访问,服务器不能直接访问A、B终端但是A、B终端可以访问服务器,这个场景很像我们有一台电脑在单位内网,外机器想访问内网系统,可能大家目前想到的就是frp之类穿透工具&…

运维_Mac环境单体服务Docker部署实战手册

Docker部署 本小节,讲解如何将前端 后端项目,使用 Docker 容器,部署到 dev 开发环境下的一台 Mac 电脑上。 1 环境准备 需要安装如下环境: Docker:容器MySQL:数据库Redis:缓存Nginx&#x…

keil5显示[NO J-link found]解决办法——【J-LINK】驱动下载安装教程

打开电脑的设备管理器,检查通用串行总线控制器 看这里发现没有J-link driver,于是开始安装下驱动。 一、下载 打开J-link下载官网链接: SEGGER - The Embedded Experts - Downloads 点击左下角下载按钮 二、安装 等待下载完成以后双击下载…

Maven的dependencyManagements锁定版本依赖

Pom工程的父项目定义的依赖 <dependencyManagement><dependencies><!--springcloud 2023.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version&g…

基于 Nginx 的 CDN 基础实现

概览 本文是对基于Nginx的CDN网络的学习笔记&#xff0c;阅读的代码为&#xff1a;https://github.com/leandromoreira/cdn-up-and-running 其中&#xff0c;先确定CDN中的一些基础概念&#xff1a; Balancer&#xff1a;负载均衡&#xff0c;即请求数据的流量最开始打到Bal…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

user、assistant、system三大角色在大语言模型中的作用(通俗解释)

1 概述 在大语言模型中&#xff0c;通常涉及到三种角色&#xff1a;用户&#xff08;user&#xff09;、助手&#xff08;assistant&#xff09;和系统&#xff08;system&#xff09;。简单来说&#xff0c;和大模型对话其实是三个人的电影。 2 角色定义 2.1 系统&#xf…

【文献讲解】《Non-local Neural Networks》

一、引言 传统的深度学习方法(如卷积神经网络CNN和循环神经网络RNN)在捕捉长距离依赖关系时存在局限性。CNN主要关注局部邻域的特征,而RNN则依赖于序列的递归计算,无法直接捕捉全局信息。为了解决这一问题,本文提出了一种非局部神经网络(Non-local Neural Networks),通…