朴素贝叶斯分类器(Naive Bayes Classifiers)

2023-10-31

原文地址:Naive Bayes Classifiers

本文讨论的是朴素贝叶斯分类器( Naive Bayes classifiers)背后的理论以及其的实现。

朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法。它不是单一存在的,而是一个算法家族,在这个算法家族中它们都有共同的规则。例如每个被分类的特征对与其他的特征对都是相互独立的。

开始之前,先看一下数据集。

这是一个虚构的数据集,这个数据集描述的是天气是否适合打高尔夫球。已知天气情况,每个元组都分成合适(“Yes”)或者不合适(“NO”)打高尔夫。

下面的截图就是表示的数据集表格:

数据集分为两个部分,也就是说,特征矩阵(feature matrix)响应向量(response vector)

  • 特征矩阵包含数据集中所有的向量(行),每个向量是由依赖特征组成的。在上面的数据集中,特征就是“天气”,“温度”,“湿度”还有“刮风”。
  • 响应向量包含的是特征矩阵每一行的类变量(预测或者输出)值。在上述的数据集中,类变量名为“Play golf”。

假设

朴素贝叶斯基础假设是,对于每一个特征都有:

  • 独立
  • 相等

来支持输出结果。

与我们的数据集关联起来,我们可以这样理解这个概念:

  • 我们假设没有特征对是相互依赖的。温度热不热跟湿度没有任何关系,天气是否下雨也不影响是否刮风。因此,这就是假设特征相互独立
  • 其次,每个特征都有相同的权重(或者是重要性)。例如,只知道温度和湿度是不能准确地推断出结果的。任何属性都与结果是有关系的,并且影响程度是相同的。

注意:如果在现实情况中,这个假设就使得朴素贝叶斯不能一般性地正确了。实际上独立这个假设就根本不可能成立,但是又往往在实践中能够很方便地计算。

在进入朴素贝叶斯方程之前,要知道贝叶斯理论是十分重要的。

贝叶斯理论

贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:

P(A|B)=P(B|A)P(A)P(B)
,在这里A和B都是事件, P(B) 不为0。

  • 基本上,只要我们给出了事件B为真,那么就能算出事件A发生的概率,事件B也被称为证据。
  • P(A)是事件A的先验(先验概率,例如,在证据之前发生的概率)。证据是一个未知事件的一个属性值(在这里就是事件B)。
  • P(A|B)是B的后验概率,例如在证据之后发生的概率。

现在再考虑一下我们的数据集,我们可以这样用贝叶斯理论:

P(y|X)=P(X|y)P(y)P(X)

在这里y是类变量,X是依赖特征向量(大小为n):

X=(x1,x2,x3,...,xn)

为了更加清晰点,我们这个例子的特征向量和相关类变量是(数据集的第一行):

X = (Rainy, Hot, High, False)
y = No

所以 P(X|y) 在这里的意思就是已知天气情况为:“Rainy outlook”, “Temperature is hot”, “high humidity”和“no wind”,得到“Not playing golf”的概率。

朴素假设

现在是时候为贝叶斯理论添加假设了,也就是每个特征之间都是相互独立的。所以我们可以将证据分成每个独立的部分。

如何两个事件A和B是相互独立的,那么有:

P(AB)=P(A)P(B)

因此我们可以得到以下结果:

P(y|x1,...,xn)=P(x1|y)P(x2|y)...P(xn|y)P(y)P(x1)P(x2)...P(xn)

于是又可以写成:

P(y|x1,...,xn)=P(y)Πni=1P(xi|y)P(x1)P(x2)...P(xn)

因为分母与输入数据是常量相关的,所以我们可以除去这一项:

P(y|x1,...,xn)P(y)Πni=1P(xi|y)

现在我们需要建立一个分类模型,我们用已知的类变量 y 的所有可能的值计算概率,并选择输出概率是最大的结果。数学表达式可以这么写:

y^=argmaxyP(y)Πni=1P(xi|y)

所以最后剩下的只有 P(y) P(xi|y) 的计算了。

请注意: P(y) 也被称为类概率 P(xi|y) 也被称为条件概率

不同的朴素贝叶斯分类器差异主要在 P(xi|y) 分布的假设。

我们试着将上面的式子用在天气数据集上。这样,我们先对数据集做一些预处理。

我们得求出每一个 X 中的xi y 中的yi。所有这些计算都被列在了下面的表格中:

所以在上图中,我们已经在表格1-4中手工计算了每一个 X 中的xi y 中的yi。例如打高尔夫的概率已知的是温度是cool,例如 P(temp=cool|playgolf=Yes)=3/9

我们也需要求出类概率( P(y) ),这个在表格5中已经计算出来了。例如 P(playgolf=Yes)=9/14

直到现在我们已经完成了预处理工作,分类器也准备好了。

today = (Sunny, Hot, Normal, False)

所以玩高尔夫的概率是:

P(Yes|today)=P(SunnyOutlook|Yes)P(HotTemperature|Yes)P(NormalHumidity|Yes)P(NoWind|Yes)P(Yes)P(today)

不打高尔夫的概率是:

P(No|today)=P(SunnyOutlook|No)P(HotTemperature|No)P(NormalHumidity|No)P(NoWind|No)P(No)P(today)

因为 P(today) 在两个概率中都用到了,我们可以忽略 P(today) ,然后再找到等比例的概率:

P(Yes|today)292969699140.0141

P(No|today)352515255140.0068

因为

P(Yes|today)+P(No|today)=1

所以这些数字可以做一下归一化:

P(Yes|today)=0.01410.0141+0.0068=0.67

P(No|today)=0.00680.0141+0.0068=0.33

因为

(Yes|today)>P(No|today)

所以预测结果应该是“Yes”。

上述讨论的方法只能应用在离散数据上。如果是连续数据的话,我们需要对每个特征数据的分布做一些假设。不同的朴素贝叶斯分类器差异主要在 P(xi|y) 分布的假设。

下面我们讨论一个这样的分类器:

高斯朴素贝叶斯分类器

在高斯朴素贝叶斯中,每个特征都是连续的,并且都呈高斯分布。高斯分布又称为正态分布。图画出来以后像一个倒挂的钟,以均值为轴对称,如下图所示:

特征的似然被假设为高斯分布了,那么条件概率函数可以写为:

P(xi|y)=12πσ2exp((xiμy)22σ2y)

现在我们看一下用scikit-learn实现的高斯朴素贝叶斯。

# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()

# store the feature matrix (X) and response vector (y)
X = iris.data
y = iris.target

# splitting X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)

# training the model on training set
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)

# making predictions on the testing set
y_pred = gnb.predict(X_test)

# comparing actual response values (y_test) with predicted response values (y_pred)
from sklearn import metrics
print("Gaussian Naive Bayes model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*100)

输出:

Gaussian Naive Bayes model accuracy(in %): 95.0

其他比较流行的朴素贝叶斯分类器:

  • 多项式朴素贝叶斯:特征向量表示由多项式分布生成的特定事件的频率。这是用于文件分类的典型的事件模型。
  • 伯努利朴素贝叶斯:在多变量的伯努利事件模型中,特征是独立的布尔(二进制变量)类型来描述输入。跟多项式模型类似,这个模型在文件分类中也很流行,在这里用的是二进制项的出现(一个词是否出现在文件中),而不是词频(一个文件中出现某个单词的次数)。

在文章的最后,有一些要点需要考虑下:

  • 尽管他们貌似过度简化了假设,朴素贝叶斯分类器在真实世界中的应用还是很不错的,其中著名的文件分类和垃圾邮件过滤就是例子。它只要少量的训练数据就能估计出关键的参数。
  • 与其他的复杂方法相比,朴素贝叶斯学习和分类的速度非常快。类条件特征分布的波动意思就是每个分布可以独立地被一个尺寸分布估计出来。这就减轻了维度带来的问题。

参考文献:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朴素贝叶斯分类器(Naive Bayes Classifiers) 的相关文章

  • 如何计算python 2D散点占用面积

    我使用 matplotlib 绘制了这两个 2000 个点的序列 从图片上看 前2000点占用的面积比后2000点要小 但如果我想定量计算2000个点的第一序列和第二序列占用了多少面积 该怎么办 我真的很感谢任何帮助 建议或意见 非常感谢
  • 比 in_array 更快?

    我需要将一个值与一组数组进行比较 但是 我需要比较 foreach 中的多个值 如果使用 in array 它可能会很慢 非常慢 有没有更快的替代方案 我当前的代码是 foreach a as b in array b array 谢谢 你
  • 计算 Adamic-Adar 的快速算法

    我正在研究图形分析 我想计算一个 N N 相似度矩阵 其中包含每两个顶点之间的 Adamic Adar 相似度 为了概述 Adamic Adar 让我从以下介绍开始 给定邻接矩阵A无向图的G CN是两个顶点的所有公共邻居的集合x y 两个顶
  • 一种递归算法,用于在数组中查找总和为给定整数的两个整数

    我需要一个算法来确定数组是否包含两个总和为给定整数的元素 数组已排序 该算法应该是递归的并且运行时间为 O n 递归步骤应该基于总和 这意味着该方法传递总和并根据最终结果返回 true 或 false 如果找到两个元素 返回 true 否则
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 数组中最远的相等元素

    假设你有一个未排序的数组 你如何找到两个相等的元素 使它们成为数组中最远的元素 例如8 7 3 4 7 5 3 9 3 7 9 0ans 将是7 9 7 1 8 我想到了以下几点 initialise max 0 using hashing
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 如何设计一种算法来计算倒数式数学数字难题

    我一直想这样做 但每次我开始思考这个问题时 它的指数性质都会让我大吃一惊 我希望能够理解的问题解决器和代码是针对倒计时数学问题的 给定一组数字 X1 到 X5 计算如何使用数学运算将它们组合起来生成 Y 您可以应用乘法 除法 加法和减法 那
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 简单的排名算法

    我需要创建一个民意调查 按照项目的好坏顺序创建一个排名列表 我打算向每个用户展示两个项目 让他们选择一个他们认为更好的项目 然后多次重复这个过程 它有点类似于您在社交网络电影 我应该如何根据收到的答案对项目进行排名 看着那 这ELO国际象棋
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left

随机推荐

  • GM(灰度预测模型)

    根据某市1 6月的交通事故数量 建立灰色模型预测GM 1 1 G表示grey M表示model 预测7 8月份的交通事故数量 要求做精度检验 灰色预测的概念 1 灰色系统 白色系统和黑色系统 白色系统是指一个系统的内部特征是完全已知的 既系
  • C++ 继承

    继承允许依据一个类来定义另一个类 为说明继承 首先需要一个基类 当创建一个类时 不需要重新编写新的数据成员和成员函数 只需指定新建的类继承一个已有的类的成员即可 这个已有的类称为基类 新建的类称为派生类 基类 派生类 一个类可以派生自多个类
  • 曲面细分着色器---细分二维四边形

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 曲面细分 二 细分二维四边形 参考 前言 术语Tessellation 镶嵌 是指一大类设计活动 通常是指在平坦的表面上 用各种几何形状的瓷砖相邻排列以形成图案 它的目
  • [转载]软件测试从零开始

    本文面向软件测试新手 从测试前的准备工作 测试需求收集 测试用例设计 测试用例执行 测试结果分析几个方面给出建议和方法 鉴于国内的软件开发 测试不规范的现状 本文为软件测试新手提供了若干个软件测试的关注点 关键词 软件测试 测试用例 测试需
  • AltiumDesigner20画图不求人13

    很多芯粉都遇到的问题就是AD20启动时间长 需要感觉N久的时间才能启动起来 今天为大家介绍可以提高AD20启动时间的方法八 取消一些相关的元件选择 视频教程 AltiumDesigner画图不求人13 提高AD20运行速度 取消一些元器件
  • nginx源码安装并设置开机自启

    NGINX源码安装 安装编译器和依赖包 openssl 软件包是用于提供网站加密证书服务的程序文件 提 pcre供 Perl 语言兼容的正则表达式库的软件包 root localhost yum y install gcc pcre dev
  • 使用Navicat for Oracle工具连接oracle

    使用Navicat for Oracle工具连接oracle 今天上网的时候偶然发现了一款oracle的客户端的图形化管理和开发工具 当看到这个界面的时候 感觉很舒服 便上网搜了一下这个工具 看百度百科之后感觉很出乎我的意料 这个产品对于许
  • 机器学习实战(十四)——利用SVD简化数据

    机器学习实战 十四 利用SVD简化数据 一 SVD的应用 SVD 奇异值分解 可以实现用小得多的数据集来表示原始数据集 达到去除噪声和冗余信息 以及压缩数据的目的 SVD的主要应用场景有 隐性语义索引 利用奇异值分解可以将文档中的概念或者主
  • 优秀的测试开发需要具备的能力

    最近很多同学在我公众号后台留言 提了很多问题 其中最多的就是如何提升技术能力 目前的就业市场 对测试的技术能力要求越来越高 测试开发岗位逐渐成为了香饽饽 测试开发对技术要求较高 部分同学要么技术基础较差 或没有找到一个很好的学习方法和路径
  • PyInstaller 4.6版本发布及更新内容

    4 6 2021 10 29 特征 添加对 Python 3 10 的支持 5693 Windows onedir默认情况下将清单嵌入到生成的可执行文件中 以避免用户重命名可执行文件时的潜在问题 例如 当用户重命名可执行文件并尝试在重命名之
  • Java开发规范手册(持续更新)

    一 Java开发规范 1 阿里巴巴泰山版java开发手册 pdf https www aliyundrive com s BbQfSbxR5T5 点击链接保存 或者复制本段内容 打开 阿里云盘 APP 无需下载极速在线查看 视频原画倍速播放
  • 为什么有了ERP还需要MES,看完这5点你就明白了

    随时MES项目实施的越来越多 涉及的行业也越来越多 我发现MES和ERP这两者的关系在制造企业中总是会被混淆 ERP实施对于制造企业而言是很关键的 它管理着企业的人力 资源 财务 计划等重要信息 当一个企业已经实施了ERP后 实施MES系统
  • linux nginx配置多站点,nginx配置多个站点的方法

    这里以配置2个站点对应2个不同域名为例 操作环境 ubuntu 16 04 64位 nginx 1 10 3 假设 IP地址 111 111 111 111 域名1 example1 com 放在 www example1 域名2 exam
  • 使用maven引入第三方jar包以及打包

    我们知道 Maven 是通过仓库对依赖进行管理的 当 Maven 项目需要某个依赖时 只要其 POM 中声明了依赖的坐标信息 Maven 就会自动从仓库中去下载该构件使用 但在实际的开发过程中 经常会遇到一种情况 对接第三方厂商 人家给了一
  • 人脸库dlib安装

    yum install gcc gcc c cmake pip3 install dlib i https pypi tuna tsinghua edu cn simple
  • mongodb的更新语句

    MongoDB 使用 update 和 save 方法来更新集合中的文档 update 方法 update 方法用于更新已存在的文档 语法格式如下 db collection update
  • STM32--0.96寸OLED显示屏

    1 OLED屏幕介绍 OLED有机发光二极管又称为有机激光显示 OL ED显示技术具有自发光的特性 采用非常薄的有机材料涂层 和玻璃基板 当有电流通过时 这些有机材料就会发光 而且OLED显示屏幕可视角大 功耗低 OL ED由于同时具备自发
  • 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具 受大极大的关注 铁路售票的管理者都主要考虑降低成本 提升售票服务满意度 一年一度的春运和节假日出行高峰期 给众多的出行群众者带来了极大的烦恼 也给用户购买火车票造成了巨大的不方便 本
  • 未来几年学什么设计更有前途?

    设计 是把一种设想通过合理的规划 周密的计划 通过各种感觉形式传达出来的过程 是设计师有目标有计划的进行技术性的创作与创意活动 设计的任务不只是为生活和商业服务 同时也伴有艺术性的创作 它是一个很大范围的概念 如果单问未来几年学什么设计更有
  • 朴素贝叶斯分类器(Naive Bayes Classifiers)

    原文地址 Naive Bayes Classifiers 本文讨论的是朴素贝叶斯分类器 Naive Bayes classifiers 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是