朴素贝叶斯分类器(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) 的相关文章

  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 生成非连续组合

    我正在尝试创建一个生成器 支持执行 next 的迭代器 可能在 python 中使用yield 它给出来自 1 2 n n 和 r 是参数 的 r 元素的所有组合 这样在选出的r个元素 没有两个是连续的 例如 对于 r 2 且 n 4 生成
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • C# 计算LRC(纵向冗余检查)

    我一直在到处研究这个问题 所有 LRC 实现似乎都没有给我正确的答案 花了几天时间后 我决定将我的代码放在这里 看看其他人是否可以发现问题 这是代码 C Input Data 31303030315E315E31303030325E315E
  • 当目标是查找某个字符串的所有出现情况时,KMP 最坏情况的复杂度是多少?

    我还想知道哪种算法在查找另一个字符串中所有出现的字符串时具有最坏情况的复杂性 博耶 摩尔算法似乎具有线性时间复杂度 KMP 算法在查找字符串中所有出现的模式时具有线性复杂度 如 Boyer Moore 算法1 如果您尝试在 aaaaaaaa
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 基于时间的算法评分

    我们希望创建一种评分算法 在更短的时间内获得更高的分数 在更长的时间内获得更少的分数 需要注意的是 没有实际范围 因此时间范围可以从 100 毫秒到长达 10 分钟或更长时间 点范围为 0 到 50 谢谢你的帮助 你可以简单地把它变成一个线
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 字符串排序真的是 O(n^2logn) 吗? [复制]

    这个问题在这里已经有答案了 我读了以下内容 排序需要 O NlogN 那么它怎么是 O N 2logN 我们在这里想念的是 两个字符串的比较不是 O 1 在最坏的情况下 需要 在 所以最终的复杂度是O N 2logN 它是否正确 我一直认为
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • 如何求解:T(n) = T(n - 1) + n

    我已经解决了以下问题 T n T n 1 n O n 2 现在 当我解决这个问题时 我发现界限非常松散 我是否做错了什么 或者只是这样 您还需要一个递归关系的基本情况 T 1 c T n T n 1 n 为了解决这个问题 您可以首先猜测一个
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo

随机推荐

  • 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 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是