前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
bilibili API 合集整理(bv/av)
整理于 bilibili 专栏,作者:可爱的小喵咪Cat,见 BilibiliAPI合集-持续更新
2Broear
2024/03/12
7670
bilibili(b站)升级到BV号了,还想用av号怎么办?
就在3月23日b站宣布b站链接由原来的av改为BV了,具体看官方说明【升级公告】AV号全面升级至BV号https://www.bilibili.com/read/cv5167957/
苏生不惑
2020/04/02
2.1K0
bilibili(b站)升级到BV号了,还想用av号怎么办?
❤️心动挑战❤️python爬虫爬取B站封面图片
🍑源生动力😍 对于文章,标题是其浓缩的精华;那么对于视频,其封面就可能是最亮眼的那一帧。B站,作为最近比较火热的短视频平台,其舞蹈区各种各样的舞蹈,尤其是宅舞,深受“宅男”的喜爱。(别和我说什么黑丝、jk,我真的不喜欢😆 ) [在这里插入图片描述] 于是乎,我就尝试使用爬虫获取B站的封面。 🍉网页获取 B站是有防爬措施的,我一开始根据网页进行分析,无果。 转念一想,这么火热的B站,想爬取的人肯定不止我一个,于是乎,我就开始搜索相关的文章和视频。 啪的一下,很快啊,我就找到一篇,根据B站AV号爬取封面图片的文
远方的星
2021/08/21
1.5K0
❤️心动挑战❤️python爬虫爬取B站封面图片
WordPress 视频插件Smartideo支持B站BV号和AV号
2020年3月23日 B站调整视频链接ID AV开头升级为BV开头,B站说是为了保护稿件信息安全,容纳更多投稿,维护UP主的权益。但升级后的链接造成WordPres视频播放插件Smartideo中的正则无法获取由数字和大小写字母组成的字符串,原来直接复制粘贴视频地址到文章中调用视频的方法失效,有用户已在插件作者网站反映,作者并没有回应,可能因各视频站更新升级频繁,Smartideo插件很多视频站点都已不支持,估计作者已放弃更新了,所以一下教大家AV和BV号共存播放视频!
空木白博客
2020/05/11
1.3K0
WordPress 视频插件Smartideo支持B站BV号和AV号
Bilibili bv 号 和 av 号 互转算法,php版
前段时间 Bilibili 已经将 av 号升级为 bv 号了,如 BV1iQ4y1M7EH
Alone88
2020/06/11
1.1K0
获取Bilibili视频直链并挂载至网站
查了一下网上的教程,摸索到了获取Bilibili直链的方法,这就分享给大家,可能会过期失效,但目前是可以的。
浩瀚博客
2022/03/23
11.9K3
获取Bilibili视频直链并挂载至网站
Python爬虫,B站视频下载源码脚本工具助手学习参考
B站,bilibili,以二次元闻名的站点,同时也是学习的天堂,推荐大家学习,尤其是你想要视频学习的话,里面有很多大佬发布了学习视频资源,如果有意,也可以下载下来慢慢看,慢慢学,对于本渣渣来说,收藏从未停止,学习从未开始!
二爷
2021/03/11
6400
Python爬虫实战:爬取B站Top100视频,分析弹幕、播放量和分类并数据可视化
最近挺好奇的,B站每天Top100,具体什么视频最多,播放量和视频的弹幕数有没有比例关系。
Mintimate
2022/02/15
6K2
Python爬虫实战:爬取B站Top100视频,分析弹幕、播放量和分类并数据可视化
用Python制作一个B站视频下载小工具(文末附完整代码)
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
可以叫我才哥
2022/04/12
4.1K1
用Python制作一个B站视频下载小工具(文末附完整代码)
人类高质量 Java 学习路线【一条龙版】
大家好,我是鱼皮。现在网上的编程资料实在太多了,而且人人肯定都说自己的最好,那就导致大家又不知道怎么选了。大部分的博主推荐资源,也就是把播放量高的视频说一遍,水一期视频,没有一条很清晰的学习路线。
程序员鱼皮
2021/08/20
2.5K0
用Python制作一个B站视频下载小工具
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
查理不是猹
2022/01/11
1K1
Python 批量下载BiliBili视频 打包成软件
有一天,我突然想找点事做,想起一直想学但是没有学的C语言,就决定来学一下。 可是怎么学呢?看书的话太无聊,报班学呢又快吃土了没钱,不如去B站看看? 果然,关键字C语言搜索,出现了很多C语言的讲课视频:
cutercorley
2020/07/23
2.1K0
Python 批量下载BiliBili视频 打包成软件
java小工具util系列3:JSON和实体类转换工具
https://blog.csdn.net/a924382407/article/details/121955349
刘大猫
2024/11/18
1590
java小工具util系列1:日期和字符串转换工具
https://blog.csdn.net/a924382407/article/details/121955349
刘大猫
2024/11/28
1810
可拷,很刑!一种基于ChatGPT的高效吃瓜方式的探索和研究。
随后“常温常压下的超导材料”直接霸占了各个新闻媒体的头条,引爆了话题,点燃了股市。
why技术
2023/08/23
2890
可拷,很刑!一种基于ChatGPT的高效吃瓜方式的探索和研究。
飞桨万能转换小工具X2Paddle,教你玩转模型迁移
百度推出飞桨(PaddlePaddle)后,不少开发者开始转向国内的深度学习框架。但是从代码的转移谈何容易,之前的工作重写一遍不太现实,成千上万行代码的手工转换等于是在做一次二次开发。
用户1386409
2019/07/02
9720
图像版PDF文件OCR识别转换为文本的3款免费工具软件
图像版PDF文件里面都是图片,要先通过OCR技术识别出文本,然后才能进行进一步处理编辑。下面是3个免费的PDF文件OCR识别软件工具:
AIGC部落
2024/06/24
6890
图像版PDF文件OCR识别转换为文本的3款免费工具软件
【云+社区年度征文】2021秋招,我从Java开发劈腿了大数据
今年秋招之前,我曾以为我以后会是一名Java开发,但是在真正的秋招过程中,我出轨了大数据(呵呵,男人!),既然将它作为第一份职业,那就要好好来了解下它,要对现有的大数据的生态有个直观的理解,所以在此基础上列出自己的学习计划和自己的职业规划。在这里,要特别感谢韩顺平老师B站2020大数据公开课,受益匪浅,视频链接在参考文献中,感兴趣的小伙伴可以看看。
Simon郎
2020/12/03
3760
《利用Python进行数据分析·第2版》第11章 时间序列11.1 日期和时间数据类型及工具11.2 时间序列基础11.3 日期的范围、频率以及移动11.4 时区处理时区本地化和转换11.5 时期及其
时间序列(time series)数据是一种重要的结构化数据形式,应用于多个领域,包括金融学、经济学、生态学、神经科学、物理学等。在多个时间点观察或测量到的任何事物都可以形成一段时间序列。很多时间序列是固定频率的,也就是说,数据点是根据某种规律定期出现的(比如每15秒、每5分钟、每月出现一次)。时间序列也可以是不定期的,没有固定的时间单位或单位之间的偏移量。时间序列数据的意义取决于具体的应用场景,主要有以下几种: 时间戳(timestamp),特定的时刻。 固定时期(period),如2007年1月或201
SeanCheney
2018/04/24
6.9K0
《利用Python进行数据分析·第2版》第11章 时间序列11.1 日期和时间数据类型及工具11.2 时间序列基础11.3 日期的范围、频率以及移动11.4 时区处理时区本地化和转换11.5 时期及其
推荐阅读
相关推荐
bilibili API 合集整理(bv/av)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验