最近又看了很多贝叶斯算法的一些文章,好多的文章对这个算法解释起来会放一大堆公式,对代数不好的人来说真的很头疼。本文尝试着用大白话写写这个算法,再做个例子,帮助大家理解和运用。

Naive Bayes is a probabilistic machine learning algorithm based on the Bayes Theorem, used in a wide variety of classification tasks.

贝叶斯算法是分类问题的重要解决方法,简单但是很强大,在文本分类、垃圾邮件识别等高维数据(特征超多的数据集)的机器学习领域有重要应用。基本逻辑就是很多的时候我们很容易知道在不同的因变量的水平上自变量的分布的怎样的,我们要解决的问题是知道了特征的情况然后去预测因变量,其实就是:from P(X|Y), known from the training dataset, to find P(Y|X).朴素贝叶斯算法架起了从from P(X|Y)to find P(Y|X)的桥梁。

要很好的理解朴素贝叶斯的整个过程首先要弄清楚两个东西,一个是条件概率、一个是贝叶斯理论。

条件概率和贝叶斯定理

我们什么理论都不要想,先做一个例子:100个人的数据如下表,按照身份可以分为教师、学生。按照性别又可以分为男性女性。现在我们尝试得到男性中教师的概率是多少(把性别当做特征,把身份当做结局,这个问题便是知道特征求结局的概率的一个问题)。

这个男性中教师的概率就是条件概率,我们不是单纯的求教师的概率而是先给了个条件(这个人首先得是男性)。这个时候计算概率的分母会变化。

when you say the conditional probability of A given B, it denotes the probability of A occurring given that B has already occurred.

这个问题你会怎么做?可以直接找到男教师有多少(看表应该是12),然后用这个数字除以男性(看表应该是60人),可以得到12/60=0.12。就得到男性中教师的概率是0.2。

上面的12比上100就是0.12为同时是男性又是教师的概率。60比上100就是0.6为数据中男性的概率,我们用0.12/0.6得到了0.2的结果其实我们就是在不自觉地运行下面的公式:

公式中,teacher和male可以互换位置。于是就有

图1

上面这两个公式就是两独立事件计算条件概率时天然满足的:

图2

我们将图1中的公式2带入公式1就得到贝叶斯定理了:

这个贝叶斯定理最最重要的作用就是打通了从P(X|Y), known from the training dataset, to find P(Y|X)的路径

贝叶斯与朴素贝叶斯

上面的例子我们知道了贝叶斯定理的公式,这个公式和实际问题联系到一起还需要拓展一下

我们把公式中的AB换成XY,于是就有下图:

我们把x当做自变量,y当做因变量。通过贝叶斯定理我们就把P(X|Y)到P(Y|X)的路径打通了。这个话要反复读。

现实中,我们收集来一波训练数据,我们是很容易知道在y的不同水平x是如何分布的(就像上面的例子中我们很容易知道教师中男性的比例是如何的,如果把性别当做自变量、身份当做因变量的话,很容易知道P(X|Y)),通过贝叶斯公式我们可以求得x分布确定的情况下,y取不同水平的概率(就像上面例子中我们知道了自变量性别是男性可以求的其为教师的概率为0.2,得到P(Y|X)).

也就是说贝叶斯定理成功的让我们可以从自变量的分布预测因变量。

The Bayes Rule is a way of going from P(X|Y), known from the training dataset, to find P(Y|X).

现实中我们会有很多的x,我们会想着直接将多个贝叶斯公式相乘来处理,这么做就暗含了一个朴素的假设就是所有的x都是独立的,这么一种朴素假设加持的贝叶斯就是朴素贝叶斯:

这个名字只是因为它有这么一个朴素的假设:

The name naive is used because it assumes the features that go into the model is independent of each other. That is changing the value of one feature, does not directly influence or change the value of any of the other features used in the algorithm.

就这么一个简单的假设,可以让这个算法可以处理很多个x的高维数据。很强大。

成为正规算法之后,就得有一些高大上的名词:

我们把特征理解为证据,因变量理解为结局,那么P(Y|X)就叫做后验概率posterior probability,意思是一组证据情况下结局是什么的概率,也是我们要预测的感兴趣的东西。

P(X|Y)叫做证据的似然概率,意思是某个结局存在的情况下相应证据出现的概率。

P(Y)叫做先验,意思是某个结局的相应概率。

P(X)叫做证据概率,意思是某些特征(证据),特征组合的相应概率。

总结一下:朴素贝叶斯就是后验概率等于证据似然概率乘以先验概率除以证据概率。

实例

我们现在想通过3个证据组合x1,x2,x3来预测水果种类,数据大概格式如下:

对这么个数据我们需要换个格式才能计算朴素贝叶斯算法对应的各种概率:

统共有3个、首先是先验概率:

Compute the ‘Prior’ probabilities for each of the class of fruits

首先就是计算先验,就是每个种类水果的概率,可以看到在1000个水果中有800个香蕉,300个橘子,200个其他,那么我们可以得到各种水果的先验分别为0.5,0.3,0.2.

P(Y=Banana) = 500 / 1000 = 0.50 P(Y=Orange) = 300 / 1000 = 0.30 P(Y=Other) = 200 / 1000 = 0.20

再是证据概率

Compute the probability of evidence that goes in the denominator.

第二步就是计算证据的概率,也就是所有特征出现的概率,我们的特征有3个,x1到x3的证据概率分别为0.5,0.65,0.8。

P(x1=Long) = 500 / 1000 = 0.50 P(x2=Sweet) = 650 / 1000 = 0.65 P(x3=Yellow) = 800 / 1000 = 0.80

Compute the probability of likelihood of evidences that goes in the numerator.

第三步是计算证据似然的概率,比如说香蕉long这个特征为真的概率就为P(Long | Banana) = 400/500 = 0.8。

Substitute all the 3 equations into the Naive Bayes formula, to get the probability that it is a banana.

最后一步就是将前三步的结果带入朴素贝叶斯公式就可以得到在某组特征下水果分别为香蕉,为橘子,为其他水果的概率。例如在特征long、sweet、yellow为真的情况下,水果为香蕉的概率为0.252,为橘子的概率为0,为其他水果的概率为0.01875.

那么这个时候算法就会告诉我们这个水果就是香蕉。

上面就是算法的整个过程,细心的同学估计会有疑问橘子的概率为0,只是因为所有训练数据中结局为橘子的个案long这个特征没有出现真(某一个证据似然概率为0),朴素贝叶斯算法涉及到相乘的话造成了结果为0。在这个只有3个特征的数据集中看起来这个结果无可厚非,长橘子本身好像现实中也不存在。但是想象一下我们面对一个陌生的数据集,特征很多,所有特征其实都有影响的,结局的某个类别中某个特征为0导致算法结果排除了该类别,这样肯定存在不合适,为0的特征影响实在太大了,相当于某一个特征有了一票否决。

所以有必要进行校正。校正的方法就叫做Laplace Correction,就是给每个为零的格子加一个数(通常为1),这样保证不出现概率为0的情况。

实操

只要理解了背后的逻辑,实操就很简单了,我们以iris数据集作为例子。原始数据长这样:

共有5个变量,4个是特征,最后一个是结局(花的种类,有3类)。对于上面的数据集我们按照7:3划分好训练集和测试集。

iris_split <- initial_split(iris, prop = 0.70)
iris_train <- training(iris_split)
iris_test <- testing(iris_split)

然后我们用klaR包进行贝叶斯算法训练,同时用训练好的模型预测测试集数据,代码如下:

nb_mod <- NaiveBayes(Species ~ ., data=training)
pred <- predict(nb_mod, test)

得到的pred对象就是预测的结果,对每一个个案预测模型都会输出的成为各个类别应变量的后验概率:

后验概率最大的类别就是最终的模型输出类别。

再得到混淆矩阵,代码如下:

tab <- table(pred$class, iris_test$Species)
caret::confusionMatrix(tab)

可以看到我们的模型在测试集中表现还是很好的,只有2个个案分类错了。

R机器学习:朴素贝叶斯算法的理解与实操的更多相关文章

  1. python机器学习——朴素贝叶斯算法

    背景与原理: 朴素贝叶斯算法是机器学习领域最经典的算法之一,仍然是用来解决分类问题的. 那么对于分类问题,我们的模型始终是:用$m$组数据,每条数据形如$(x_{1},...,x_{n},y)$,表示 ...

  2. 朴素贝叶斯算法--python实现

    朴素贝叶斯算法要理解一下基础:    [朴素:特征条件独立   贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.]   极大似然估计 ...

  3. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

  4. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  5. 机器学习---用python实现朴素贝叶斯算法(Machine Learning Naive Bayes Algorithm Application)

    在<机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)>一文中,我们介绍了朴素贝叶斯分类器的原理.现在,让我们来实践一下. 在 ...

  6. 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】

    1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...

  7. 机器学习:python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实 ...

  8. 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现

    关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...

  9. 朴素贝叶斯算法 & 应用实例

    转载请注明出处:http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段就要把基 ...

  10. 朴素贝叶斯算法下的情感分析——C#编程实现

    这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Pr ...

随机推荐

  1. 墨天轮沙龙 | 亚马逊云科技李君:见微知著 - Serverless云原生数据库概览

    导读 以业务为导向的数据库需要满足现代化应用的需要,以 Serverless 数据库为代表,云数据库正在迅速发展成熟,并带来更好的可访问性和高可用性,还有高扩展性与可迁移性. [墨天轮数据库沙龙-Se ...

  2. js中常见的继承

    1. 使用原型链继承 2. 通过构造函数继承 通过构造函数,创建的实例,可以访问构造函数的属性和方法,以及可以访问构造函数的原型对象 prototype 上的数据和方法 : 3. 组合继承(1 和 2 ...

  3. linux运维巡检脚本

    #!/bin/bash#author by acrossyao#date: 2021-02-08#张波勇巡检脚本echo "--------------------------------- ...

  4. 基于 KubeSphere 的开源微服务开发平台 Pig 最佳实践

    作者:何昌涛,北京北大英华科技有限公司高级 Java 工程师,云原生爱好者. 前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部 ...

  5. 格点拉格朗日插值与PME算法

    技术背景 在前面的一篇博客中,我们介绍了拉格朗日插值法的基本由来和表示形式.这里我们要介绍一种拉格朗日插值法的应用场景:格点拉格朗日插值法.这种场景的优势在于,如果我们要对整个实数空间进行求和或者积分 ...

  6. WEB渗透01_渗透测试方法论

    前言 这个系列是根据一个网络安全教程学习的笔记. 1 渗透测试 渗透测试,是为了证明网络防御按照预期计划正常运行而提供的一种机制.不妨假设,你的公司定期更新安全策略和程序,时时给系统打补丁,并采用了漏 ...

  7. C语言数据类型和变量

    目录 1.数据类型介绍 1.1字符型 1.2整形 1.3浮点型 1.4布尔类型 1.5各种数据类型长度 1.5.1sizeof操作符 1.5.2数据类型长度 1.5.3 sizeof中表达式不计算 2 ...

  8. 洛谷 P1540 [NOIP2010 提高组] 机器翻译

    题目概括 给定 N 个整数,和一个容量为 M 的"字典",从头到尾依次翻译,每次翻译先看自家字典,没有的话再看别人的字典并存到自家字典,如果自家字典满了,当前单词的翻译会代替最早进 ...

  9. 遗传算法+强化学习—TPG—Emergent Tangled Graph Representations for Atari Game Playing Agents

    最近在看进化算法在强化学习(RL)领域的一些应用,有些论文中将使用进化算法解决强化学习问题的算法归为非强化学习算法,然而又有些论文把使用进化算法解决强化学习问题的算法归为强化学习算法,不过更多的论文是 ...

  10. python列表自动扩容机制

    问题引入:在对比列表与元组的优缺点时,百度答案为:列表是可变的,可以随时进行增加.修改.删除操作,可以进行动态扩容,动态扩容是以牺牲性能损耗的为代价的,于是我搜索了一下列表的动态扩容 当在创建一个列表 ...