前言

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

概要

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

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

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

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

算法面试

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

  1. 为什么朴素贝叶斯如此“朴素”?

  2. 朴素贝叶斯基本原理和预测过程;

  3. 简单说说贝叶斯定理;

  4. 使用朴素贝叶斯如何进行垃圾分类?

今天我们讨论的问题是:

朴素贝叶斯的算法实现。

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

  1. 确定朴素贝叶斯的类型(高斯朴素贝叶斯或者伯努利朴素贝叶斯等);

  2. 模型的拟合,重点在于模型到底保存了什么内容;

  3. 后验概率的计算;

  4. 最大后验概率的输出;

1. 模型类型

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

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

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. 每个类的每个特征的均值与标准偏差(可以计算类条件概率);

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

因此:

 def summarize(self, train_data):summaries = [(self.mean(column), self.stdev(column), len(column)) for column in zip(*train_data)]return summariesdef 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. 后验概率的计算

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

 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

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

 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. 最大后验概率

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

 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)

总结

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

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑
本站知识星球“黄博的机器学习圈子”(92416895)
本站qq群704220115。
加入微信群请扫码:

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

  1. 机器学习:朴素贝叶斯模型算法原理(含实战案例)

    机器学习:朴素贝叶斯模型算法原理 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页

  2. 机器学习基础 朴素贝叶斯算法

    文章目录 一. 朴素贝叶斯算法简介 二.概率基础复习 1.概率定义 2.案例:判断女神对你的喜欢情况 3.联合概率.条件概率与相互独立 4.贝叶斯公式 4.1 公式介绍 4.2 案例计算 4.3 文章 ...

  3. 机器学习之朴素贝叶斯算法

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 贝叶斯公式与朴素贝叶斯算法 贝叶斯公式推导 用机器学习的视角理解贝叶斯公式 NB ...

  4. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)

    <机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...

  5. 朴素贝叶斯 php,PHP实现机器学习之朴素贝叶斯算法详解.pdf

    PHP实实现现机机器器学学习习之之朴朴素素贝贝叶叶斯斯算算法法详详解解 本文实例讲述了PHP实现机器学习之朴素贝叶斯算法.分享给大家供大家参考 具体如下: 机器学习已经在我们的生活中变得随处可见了.比 ...

  6. 一步步教你轻松学朴素贝叶斯模型算法理论篇1

    一步步教你轻松学朴素贝叶斯模型理论篇1 (白宁超2018年9月3日17:51:32) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...

  7. 【机器学习】朴素贝叶斯、SVM和数据分布检验分析

    [机器学习]朴素贝叶斯.SVM和数据分布检验分析 文章目录 1 朴素贝叶斯 2 SVM2.1 线性可分2.2 最大间隔超平面2.3 SVM 最优化问题 3 数据分布检验方法3.1 数据分布检验3.2 ...

  8. 【机器学习】朴素贝叶斯(Naive Bayes)

    在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系, ...

  9. 实现 | 朴素贝叶斯模型算法研究与实例分析

    实现 | 朴素贝叶斯模型算法研究与实例分析 (白宁超  2018年9月4日10:28:49) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受 ...

最新文章

  1. Android实现简单短信发送器
  2. Springboot: Failed to get nested archive for entry BOOT-INF/lib/ Zip64 archives are not supported
  3. argmax函数_Python 的Numpy 函数到底是个啥?看这篇就足够了
  4. Idea系列文章2-依赖包的引入
  5. 二阶带通有源滤波器设计与仿真测试
  6. PE文件格式详解(0)
  7. PMBOK2008中的三种沟通方式(草稿版)
  8. 编程设计模式中委托 和代理模式的区别
  9. 计算机 变成飞行模式无法上网,win10电脑中开启了飞行模式不能上网如何解决
  10. 计算机刊物SCI影响因子排名
  11. 思科关闭日志_思科交换机日志管理
  12. Unity3D中如何调用序列帧图片为动画
  13. 编程将输入的百分制成绩转换为五分制成绩输出
  14. idea 设置编辑器 table 全部显示
  15. 决策树决策算法ID3算法、改进算法C4.5算法和CART算法代码实现
  16. [Android 性能优化系列]内存之终极篇--降低你的内存消耗
  17. 你会的还只有初级安卓工程师的技术吗?论程序员成长的正确姿势
  18. 阵列信号处理——LMS自适应波束形成算法
  19. java web.xml taglib_web.xml 中taglib报错(转载)
  20. 【python】【惰性序列】【iterator】

热门文章

  1. 接口 类型转换 try-catch(学习笔记)
  2. Linux下安装 Indy 到 Lazarus
  3. 代码规范:在Keil5中使用代码格式化工具Astyle(插件)
  4. js数组对象的常用方法
  5. Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
  6. RxJava系列6(从微观角度解读RxJava源码)
  7. jax-ws实现WebService
  8. 贵州2021高考状元成绩查询,2021年贵州高考最高分多少分,历年贵州高考状元
  9. 做乘法c语言,【code】C语言_实现输入的矩阵的乘法运算
  10. ​​毕业论文选题三步法