前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习基础】朴素贝叶斯的算法实现

【机器学习基础】朴素贝叶斯的算法实现

作者头像
黄博的机器学习圈子
发布于 2021-02-08 11:10:35
发布于 2021-02-08 11:10:35
67900
代码可运行
举报
运行总次数:0
代码可运行

前言

本次我们将梳理下朴素贝叶斯(Naive Bayes)的相关内容。 本文约1.6k字,预计阅读10分钟。

概要

朴素贝叶斯算法是一种适用于二分类和多分类分类问题的「分类算法」。在贝叶斯概率框架下,通过相应推导得知,「期望风险最小化等价于后验概率最大化」。对于后验概率的计算,可以通过「联合概率分布建模」,得到后验概率(「生成模型」);

对于生成模型来说,根据「贝叶斯定理」,可以将其写成:

在朴素贝叶斯中,由于条件概率难以计算,因此提出一个强烈的假设:「特征独立性假设」,即各个特征是独立同分布的,不存在交互,这也是朴素贝叶斯名称的来由。先验概率和条件概率的估计不作展开,感兴趣的可以参考《统计学习方法》,通过转化,最终最大化后验概率(MAP),即「先验概率与类条件概率的乘积」

【注】期望风险最小化等价于后验概率最大化的推导可以参考《机器学习》,详细的推导,可以参考《统计学习方法》。

算法面试

在算法面试中,设计朴素贝叶斯相关的问题包括:

  1. 为什么朴素贝叶斯如此“朴素”?
  2. 朴素贝叶斯基本原理和预测过程;
  3. 简单说说贝叶斯定理;
  4. 使用朴素贝叶斯如何进行垃圾分类?

今天我们讨论的问题是:

❝朴素贝叶斯的算法实现。 ❞

对于朴素贝叶斯来说,这既对我们的算法原理进行考察,也检验了编程能力。我以建立整个朴素贝叶斯算法模型类来展开,主要分为:

  1. 确定朴素贝叶斯的类型(高斯朴素贝叶斯或者伯努利朴素贝叶斯等);
  2. 模型的拟合,重点在于模型到底保存了什么内容;
  3. 后验概率的计算;
  4. 最大后验概率的输出;

1. 模型类型

对于类条件概率参数的估计,我们采用极大似然估计法,首先最重要的是「假设随便变量(特征)服从什么分布」,对于不同的假设,也对应着不同的朴素贝叶斯,例如伯努利朴素贝叶斯、高斯朴素贝叶斯、多项分布朴素贝叶斯。最常见的是通过假设「高斯分布」,在模型拟合中,「只需要估计训练数据(每个类别的所有样本的每个特征)的平均值和标准偏差」

因此,我们可以得到初步的框架:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Gaussian_NaiveBayes:
  def init(self):
     
   def mean(self, X):  # 计算均值
     return sum(X) / float(len(X))
    
   def stdev(self, X):  # 计算标准差
     avg = self.mean(X)
   return math.sqrt(sum([pow(x-avg, 2) for x in X]) / float(len(X)-1))

2. 模型拟合

通过对朴素贝叶斯原理的理解,我们知道,学习联合概率模型,需要通过极大似然法估计先验概率(假设服从伯努利分布)和类条件概率参数,对于高斯朴素贝叶斯来说,整个训练数据集,我们需要保存:

  1. 每个类对应的数量(可以计算先验概率)和总样本数量(可以作为模型的一个属性);
  2. 每个类的每个特征的均值与标准偏差(可以计算类条件概率);

综上所述,我们可以通过「字典」的形式进行保存:

因此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def summarize(self, train_data):
   summaries = [(self.mean(column), self.stdev(column), len(column)) for column in zip(*train_data)]
  return summaries

 def fit(self, X, y):
   self.total_rows = len(X)
   labels = list(set(y))
   data = {label: [] for label in labels}
   for f, label in zip(X, y):
     data[label].append(f)
   self.model = {label: self.summarize(value) for label, value in data.items()}

3. 后验概率的计算

对于每个类别的后验概率计算,需要求得先验概率和类条件概率。首先对于类条件概率,根据高斯公式求得,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def gaussian_probabality(self, x, mean, stdev):
   exponent = math.exp(-math.pow(x - mean, 2) / (2 * math.pow(stdev, 2)))
   return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent

然后迭代计算所有类的后验概率:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def calculate_probabalities(self, input_data):
      probalalities = {}
      for label, summaries in self.model.items():
        probalalities[label] = summaries[0][2] / self.total_rows # 先验
        for i in range(len(summaries)):
          mean, stdev, _ = summaries[i]
          probalalities[label] *= self.gaussian_probabality(  # 先验 * 条件概率
            input_data[i], mean, stdev)
      return probalalities

4. 最大后验概率

最大后验概率的计算就是排序,得到最大概率对应的标签值。对于测试集来说,遍历所有样本进行计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def predict(self, X_test):
  labels = []
  for i in X_test:
   label = sorted(
    self.calculate_probabalities(i).items(),
    key=lambda x: x[-1])[-1][0]
   labels.append(label)
  return np.array(labels)

总结

以上便是对“朴素贝叶斯算法实现”的总结。最重要的是需要一个完善的类框架,才能够好的结合原理进行代码的复现。至于其他几个问题,比较简单,这里就不作详细讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
温州大学《机器学习》课程代码(四)朴素贝叶斯
这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。
黄博的机器学习圈子
2021/04/16
8720
图解机器学习 | 朴素贝叶斯算法详解
教程地址:http://www.showmeai.tech/tutorials/34
ShowMeAI
2022/03/10
2.9K0
图解机器学习 | 朴素贝叶斯算法详解
【机器学习】贝叶斯机器学习:经典模型与代码实现
贝叶斯定理是概率模型中最著名的理论之一,在机器学习中也有着广泛的应用。基于贝叶斯理论常用的机器学习概率模型包括朴素贝叶斯和贝叶斯网络。本章在对贝叶斯理论进行简介的基础上,分别对朴素贝叶斯和贝叶斯网络理论进行详细的推导并给出相应的代码实现,针对朴素贝叶斯模型,本章给出其NumPy和sklearn的实现方法,而贝叶斯网络的实现则是借助于pgmpy。
黄博的机器学习圈子
2021/07/07
1.9K0
【机器学习】贝叶斯机器学习:经典模型与代码实现
A.机器学习入门算法(二): 朴素贝叶斯(Naive Bayes)
朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
汀丶人工智能
2023/03/22
8900
A.机器学习入门算法(二): 朴素贝叶斯(Naive Bayes)
机器学习(五)—朴素贝叶斯
 最近一直在看机器学习相关的算法,今天我们学习一种基于概率论的分类算法—朴素贝叶斯。本文在对朴素贝叶斯进行简单介绍之后,通过Python编程加以实现。
oYabea
2020/09/07
4940
机器学习算法--朴素贝叶斯(Naive Bayes)
朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
@小森
2024/03/15
3400
机器学习算法--朴素贝叶斯(Naive Bayes)
【机器学习】朴素贝叶斯算法详解与实战扩展
朴素贝叶斯算法是一种基于概率统计的分类方法,它利用贝叶斯定理和特征条件独立假设来预测样本的类别。尽管其假设特征之间相互独立在现实中往往不成立,但朴素贝叶斯分类器因其计算简单、效率高、对缺失数据不敏感等优点,在文本分类、垃圾邮件过滤、情感分析等领域有着广泛的应用。
破晓的历程
2024/08/20
3710
朴素贝叶斯 Numpy实现高斯朴素贝叶斯
小小程序员
2023/12/09
2880
数据挖掘面试题之:朴素贝叶斯
关于作者:DD-Kylin,一名喜欢编程与机器学习的统计学学生,勤学好问,乐于钻研,期待跟大家多多探讨机器学习的相关内容~
木东居士
2019/07/30
3.1K0
简单易学的机器学习算法——朴素贝叶斯
    贝叶斯推断告诉我们,先预估计一个“先验概率”,然后加入实验结果,看这个实验到底是增强还是削弱了“先验概率”,由此得到更接近事实的“后验概率”。
felixzhao
2019/02/27
5320
简单易学的机器学习算法——朴素贝叶斯
【机器学习-监督学习】朴素贝叶斯
  贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,所以统称为贝叶斯分类。朴素贝叶斯是一种贝叶斯分类算法,在许多场合可以与决策树和神经网络分类算法相媲美。图1展示了贝叶斯原理、贝叶斯分类和朴素贝叶斯三者之间的关系。
Francek Chen
2025/01/22
2570
【机器学习-监督学习】朴素贝叶斯
机器学习-23:MachineLN之朴素贝叶斯
贝叶斯模型是指模型参数的推断用的是贝叶斯估计方法,也就是需要指定先验分布,再求取后验分布。
MachineLP
2022/05/09
3630
机器学习-23:MachineLN之朴素贝叶斯
太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)
寄语:首先,简单介绍了生成模型和判别模型,对条件概率、先验概率和后验概率进行了总结;其次,对朴素贝叶斯的原理及公式推导做了详细解读;再次,对三种可能遇到的问题进行了解析,给出了合理的解决办法;最后,对朴素贝叶斯的sklearn参数和代码进行了详解。
Datawhale
2020/05/16
2.5K0
机器学习–朴素贝叶斯模型原理
朴素贝叶斯中的朴素是指特征条件独立假设, 贝叶斯是指贝叶斯定理, 我们从贝叶斯定理开始说起吧.
全栈程序员站长
2022/09/20
4150
AI -朴素贝叶斯
朴素贝叶斯是一种基于概率论和统计学的分类算法,它的核心是贝叶斯定理和特征条件独立假设。
@小森
2024/03/24
1560
【机器学习】--机器学习之朴素贝叶斯从初始到应用
机器学习算法中,有种依据概率原则进行分类的朴素贝叶斯算法,正如气象学家预测天气一样,朴素贝叶斯算法就是应用先前事件的有关数据来估计未来事件发生的概率。
LhWorld哥陪你聊算法
2018/09/13
4480
【机器学习】--机器学习之朴素贝叶斯从初始到应用
【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器
贝叶斯算法是一种常用的概率统计方法,它利用贝叶斯定理来进行分类和预测。其在计算机还没有出现前几十年就存在了,那个时候科学家们都是用手算的,是最早的机器学习形式之一,该算法基于统计学原理,通过已知的先验概率和观测到的数据,更新对事件发生概率的估计。因为有着一个很强的假设,每个数据特征都是独立的,这也是条件独立的前提条件,也叫"朴素的"的假设,故叫朴素贝叶斯算法。
计算机魔术师
2023/10/15
8070
【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器
python实现朴素贝叶斯
朴素贝叶斯是jiyu贝叶斯定理和特征条件独立假设的分类方法。即对于给定训练数据集,首先基于特征条件独立假设学习输入\输出的联合概率分布,然后基于此模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
西西嘛呦
2020/08/26
1K0
python实现朴素贝叶斯
朴素贝叶斯三种模型_朴素贝叶斯多分类
由上图可以看出,在事件B已经发生的情况下,事件A发生的概率为事件A和事件B的交集除以事件B:
全栈程序员站长
2022/11/10
1.3K0
朴素贝叶斯三种模型_朴素贝叶斯多分类
机器学习中的朴素贝叶斯算法
在处理预测相关的建模问题时你会发现朴素贝叶斯是一个简单而又强大的算法。
花落花飞去
2018/02/05
1.2K0
机器学习中的朴素贝叶斯算法
推荐阅读
相关推荐
温州大学《机器学习》课程代码(四)朴素贝叶斯
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验