前言

本次我们将梳理下朴素贝叶斯(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. java起源_Java的来源
  2. 主机信息收集技术 -Nmap
  3. 5W+人的公司怎么把总部和分部网络连接起来?
  4. forever不重启 node_运维监控Prometheus,部署安全的node_exporter监控主机
  5. php 数组移除指定健,php删除数组指定键的方法
  6. JavaEE实战班第18天
  7. ICCV2021 香港理工、阿里达摩院提出RealVSR:视频超分任务中的新数据集与损失方案...
  8. linux内存管理总结
  9. php larvel https,laravel 解决强制跳转 https的问题
  10. python middleware模块_python之auth模块
  11. QT tableWidget的使用及其实例
  12. 基于webpack工程化的思考
  13. Vulnerability Scanning Tools
  14. 003.ASP.NET MVC集中管理Session
  15. 步进电机驱动器细分原理_步进驱动器细分设置表说明
  16. taptap解析安装包出错_电脑上面怎么提取taptap游戏安装包 提取taptap里面游戏教程...
  17. 常用制作钓鱼网站的工具
  18. 华氏温度与摄氏温度用C语言的实现方法
  19. C-11 Problem H: 开宝箱2
  20. 咱们的课程里,有微信的这种菜单示例吗?---酷课堂iOS交流群问答整理(201810期)...

热门文章

  1. global cache cr request
  2. C#下把txt文件数据读进sql server中存储所遇到的乱码问题
  3. SQL Server 2005查询处理结构-用户模式计划(UMS)
  4. js中的各种宽度计算
  5. RocketMQ事务消息实现分析
  6. 【代码笔记】iOS-在导航栏中显示等待对话框
  7. ZeroMQ之Publish/Subscribe (Java)
  8. 中文版示例代码浏览器for Windows 8
  9. 人工智能技术的新突破:MIT科学家发明Church AI语言
  10. 基于matlab 求多边费马点,POJ2420(求多边形费马点) | 学步园