机器学习知识总结 —— 20.使用朴素贝叶斯进行数据分类

news2024/12/18 18:42:19

文章目录

  • 准备基础数据
  • 计算先验概率
  • 计算条件概率
  • 预测分布
  • 验证结果

作为一种监督学习分类方法,在上一章中我们已经介绍过它的数理原理。现在我们开始来实现一个简单的朴素贝叶斯分类的算法,这样我们能更好的理解它是怎么运作的。

准备基础数据

首先还是有请我们的好朋友 numpy,让它给我们生成一些数据 。

# 生成三类数据,每类数据有100个样本
np.random.seed(42)
class1 = np.random.randn(100, 2) * 0.5 + np.array([1, 1])
class2 = np.random.randn(100, 2) * 0.5 + np.array([-1, -1])
class3 = np.random.randn(100, 2) * 0.5 + np.array([1, -1])

# 将数据集分为训练集和测试集
X_train = np.concatenate([class1[:70], class2[:70], class3[:70]])
y_train = np.concatenate([np.zeros(70), np.ones(70), 2 * np.ones(70)])
X_test = np.concatenate([class1[70:], class2[70:], class3[70:]])
y_test = np.concatenate([np.zeros(30), np.ones(30), 2 * np.ones(30)])

这样我们的数据可以分为测试集和训练集两部分,这里我们给了全部的样本分别以标签1,2,3进行分类。

计算先验概率

在朴素贝叶斯分类器中,我们需要计算每个类别的先验概率。先验概率指的是在考虑任何特征的情况下,一个样本属于某个类别的概率。

先验概率的计算公式为: P ( Y = c k ) P(Y=c_k) P(Y=ck),其中 Y Y Y表示类别变量, c k c_k ck表示第 k k k个类别。因为我们假设每个类别的样本数相等,所以可以用每个类别的样本数除以总样本数来估计先验概率。

具体到代码,计算先验概率的逻辑如下:

  1. 首先创建一个大小为3的全零向量prior_probs,用于存储每个类别的先验概率;
  2. 针对每个类别,使用Numpy的sum函数计算出训练集y_train中等于该类别的样本数量,并将其除以y_train的长度得到该类别的先验概率;
  3. 将该类别的先验概率存储在prior_probs向量的相应位置上。
    最终prior_probs向量中存储了每个类别的先验概率。

于是,我们可以得到下面这样的代码:

prior_probs = np.zeros(3)
for i in range(3):
    prior_probs[i] = np.sum(y_train == i) / y_train.shape[0]

计算条件概率

条件概率指的是在已知一个样本属于某个类别的情况下,该样本的某个特征取某个值的概率。

具体到高斯朴素贝叶斯分类器中,我们假设每个特征在每个类别中的条件概率都是高斯分布。因此,我们需要计算每个类别中每个特征的均值和标准差,从而得到该特征在该类别下的高斯分布。这样,在预测时,我们就可以使用每个特征在每个类别下的高斯分布来计算该样本在该类别下的概率。

具体到代码,计算每个特征在每个类别中的条件概率的逻辑如下:

  1. 首先创建两个大小为(3,特征数)的全零矩阵mean_vectors和std_vectors,用于存储每个类别中每个特征的均值和标准差;
  2. 针对每个类别,使用Numpy的mean函数计算出训练集X_train中该类别下每个特征的均值,同时使用Numpy的std函数计算出该类别下每个特征的标准差;
  3. 将该类别下每个特征的均值和标准差存储在mean_vectors和std_vectors矩阵的相应位置上。

最终,mean_vectors和std_vectors矩阵中存储了每个类别中每个特征的均值和标准差,用于计算条件概率。在预测时,我们将测试集中的每个样本输入到高斯分布中,计算出该样本在每个类别下的概率,并选择概率最大的类别作为预测结果。

# 计算每个特征在每个类别中的条件概率
mean_vectors = np.zeros((3, X_train.shape[1]))
std_vectors = np.zeros((3, X_train.shape[1]))
for i in range(3):
    mean_vectors[i] = np.mean(X_train[y_train == i], axis=0)
    std_vectors[i] = np.std(X_train[y_train == i], axis=0)

预测分布

对于测试集中的每个样本,我们需要计算它在每个类别下的概率,从而得到该样本最可能属于哪个类别。在高斯朴素贝叶斯分类器中,我们假设每个特征在每个类别中的条件概率都是高斯分布,因此可以使用高斯分布的概率密度函数来计算每个特征值在每个类别中的条件概率。具体地,我们可以利用每个特征在每个类别下的均值和标准差,将该特征值输入到高斯分布的概率密度函数中,从而得到该特征值在该类别下的概率。最后,我们将每个特征的条件概率相乘,再乘以该类别的先验概率,得到该样本在该类别下的概率。在计算完每个类别下该样本的概率后,我们选择概率最大的类别作为该样本的预测标签。

  1. 首先创建一个大小为y_test长度的全零向量y_pred,用于存储每个测试集样本的预测标签;
  2. 针对每个测试集样本,使用Numpy的prod函数计算出该样本在每个类别下每个特征的条件概率,再将每个特征的条件概率相乘,乘以该类别的先验概率,得到该样本在每个类别下的概率;
  3. 将该样本的预测标签设为概率最大的类别。

最终,y_pred向量中存储了每个测试集样本的预测标签,可以与真实标签进行比较以计算准确率。

# 预测测试集的标签
y_pred = np.zeros(y_test.shape[0])
for i, x in enumerate(X_test):
    # 计算x在每个类别下的概率
    probs = np.zeros(3)
    for j in range(3):
        probs[j] = np.prod(1 / (np.sqrt(2 * np.pi) * std_vectors[j]) * np.exp(-(x - mean_vectors[j]) ** 2 / (2 * std_vectors[j] ** 2))) * prior_probs[j]
    y_pred[i] = np.argmax(probs)

验证结果

主要部分结束,我们看看输出的结果如何

在这里插入图片描述
最终的准确度是93%,总体还是不错的。当然在现实中,我们要处理的特征肯定不止两维,这里只是一个简单的示例。

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

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

相关文章

加密流量专栏总览

文章目录加密流量专栏1. 原理篇2. 模型篇3. 文章分类总结3.1 研究方向3.2 特征提取3.3 机器学习模型改进3.4 深度学习模型改进3.5 其他模型改进3.7 实时检测3.8 概念漂移检索论文的方法加密流量专栏 1. 原理篇 原理: 会话、流、数据包之间的关系。 流:…

【离线数仓-4-数据仓库设计-分层规划构建流程】

离线数仓-4-数据仓库设计-分层规划&构建流程离线数仓-4-数据仓库设计-分层规划&构建流程1.数据仓库分层规划2.数据仓库构建流程1.数据调研1.业务调研2.需求分析3.总结2.明确数据域3.构建业务总线矩阵&维度模型设计4.明确统计指标1.指标体系相关概念1.原子指标2.派生…

【渝偲医药】DSPE-PEG-RGD;磷脂聚乙二醇多肽试剂级简介

DSPE-PEG-RGD、 二硬脂酰基磷脂酰乙醇胺-聚乙二醇-多肽、磷脂PEG多肽 英文名称: 1,2-Distearoyl-sn-Glycero-3-Phosphoethanolamine-PEG- RGD 溶剂:可溶解在水中和大多数有机溶剂中 外观:白色粉末 用途:用于链接带有链霉亲和素或其他的基团的分子 分子量(PEG ):2000、3400、…

那些开发过程中需要遵守的开发规范

入职公司三天,没干啥其他活,基本在配置本地环境和阅读相关文档。技术方面公司基本用的是主流的技术体系,入职后需要先阅读阿里的开发规范和其他的一些产研文档。今天整理一些平时需要关注的阿里规约和数据库开发规范,方便今后在开…

TatukGIS Developer Kernel for .NET

TatukGIS Developer Kernel for .NET 用于.NET的TatukGIS开发人员内核的强大功能: 打开、创建、编辑、保存和导出矢量、图片和网格的过程,包括类似于数据库的格式。 扩展属性、北箭头、比例和其他视觉控制也从TatukGIS编辑器/查看器商品中显示给用户开发…

Java基础系列(五): final关键字用法

一. 概述 final关键字代表最终,不可改变的. 常见有5种用法,我们来归纳总结一下: 1. 用来修饰一个类 2. 用来修饰一个方法 3. 用来修饰成员变量 4. 用来修饰局部变量 5. 用来修饰方法参数 二. final饰修类 如果声明一个类为final类, 那么这个类就是最终类,不能被继承 …

7 Python文件、文件夹、word及excel操作

0 建议学时和要求 4学时 掌握os和os.path模块对文件和文件夹操作的函数 掌握shutil模块对文件和文件夹操作的函数 掌握扩展库openpyxl对Excel文件的操作 1 文件的高级操作 1.1 文件的概念及分类 文本文件 文本文件可以使用记事本、gedit、ultraedit等字处理软件直接进行显…

ESP32设备驱动-DS1264数字温度传感器驱动

DS1264数字温度传感器驱动 1、DS1264介绍 DS1624 由两个独立的功能单元组成:一个 256 字节非易失性 E2 存储器和一个直接数字温度传感器。 非易失性存储器由 256 字节的 E2 存储器组成。 该存储器可用于存储用户希望的任何类型的信息。 这些内存位置通过 2 线串行总线访问。…

007永磁电机控制方式:别张嘴就FOC,其他常规控制方式也是伺服人的基本功

在读本篇文,我想做个小调查。到目前为止,你掌握的或者是你了解到的控制永磁同步电机的方式都有哪些?我想,你大概张口就说FOC控制吧。没错,FOC控制是我们日常生活中所见到的最普遍的永磁同步电机的控制方式。当然在本专…

微信电脑版字体模糊(或文字太小)怎么调整

文章目录第一步:设置屏幕缩放125%第二步:文本大小设置为125%第三步:微信设置--通用--勾选“适配系统缩放比例”第四步:微信高DPI缩放行为设置(关键)ClearType勾选(可选)笔者遇到这个…

【模板】线段树 2

题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xxx 将某区间每一个数加上 xxx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,pn,m,p,分别表示该数列数字的个数、操作的总个数…

计算机网络笔记(复试准备)第一章

计算机网络笔记(复试准备) 第一章 网络,互联网与因特网 网络由若干个结点和连接这些结点的链路组成 多个网络通过路由器连接起来这也就形成了一个更大的网络即是我们熟知的互联网也就是“网络的网络” 因特网是世界上最大的网络 问&#xf…

Open-Vocabulary Object Detection Using Captions论文讲解

文章目录一、论文前言二、提出原因三、论文的核心四、论文讲解4.1 论文流程4.2 OVD与之前相关的setting4.3 结果对比一、论文前言 目标检测是人工智能最突出的应用之一,也是深度学习最成功的任务之一。 然而,尽管深度对象检测取得了巨大进步&#xff0…

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot + Bee)

MongoDB在银行海量历史订单交易数据查询中的应用(Spring boot Bee) 近年来,随着各种便捷支付方式的普及,银行账户交易数据呈现爆炸式增长,同时数据模型也在不断变化,传统关系型数据库已难以满足这种海量的、模式灵活、高可用、高性能的数据存储和查询需求。通过对银行历史交易…

【编程入门】应用市场(php版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…

【MySQL】索引常见面试题

文章目录索引常见面试题什么是索引索引的分类什么时候需要 / 不需要创建索引?有什么优化索引的方法?从数据页的角度看B 树InnoDB是如何存储数据的?B 树是如何进行查询的?为什么MySQL采用B 树作为索引?怎样的索引的数…

033_SS_Inversion-Based Creativity Transfer with Diffusion Models

下载地址:Arxiv 2022.11.23 Code地址:https://github.com/zyxElsa/creativity-transfer 1. Introduction Motivations 以前的任意示例引导的艺术图像生成方法(比如风格迁移)通常无法控制形状变化或传达语义元素。而预训练的text…

【Linux | ELK 8.2】搭建ELKB集群Ⅰ—— 实验环境说明和搭建Elasticsearch集群

目录1. 实验环境1.1 实验工具1.2 操作系统1.3 架构版本、IP地址规划与虚拟机配置要求1.4 拓扑图1.5 其他要求2. 实验步骤2.1 安装Elasticsearch(单节点)(1)检查系统jdk版本(2)下载elasticsearch&#xff08…

格式化串漏洞

格式化字符串漏洞本身并不算缓冲区溢出漏洞,这里作为比较典型的一类漏洞进行简单介绍。为了能够将字符串、变量、地址等数据按照指定格式输出,通常使用包含格式化控制符的常量字符串作为格式化串,然后指定用相应变量来代替格式化串中的格式化…

进程管理之基本概念

目录 关于进程的基本概念 进程描述符 查看进程 进程标识 进程的生命周期 僵尸进程、孤儿进程 写时拷贝技术 fork()函数 vfork()函数 终止进程 进程优先级和权重 进程地址空间 关于进程的基本概念 进程和程序是操作系统领域的两个重要的概念,进程是执行…