机器学习|朴素贝叶斯算法(一)-贝叶斯简介及应用

简介: 准备好好弄一弄机器学习——朴素贝叶斯算法,目前总共有三篇博文。这一篇主要是简述贝叶斯公式的推导和贝叶斯的一些应用,希望能有所收获( ̄︶ ̄)↗ 

偶然间听说阿里云云栖社区这个“寒假换装攻略活动”,还送键盘!
正好缺一个键盘(ノへ ̄、)
人穷志短,人穷志短,不开心的话说两遍,回到现实,想想把朴素贝叶斯算法再重新整理整理,来拿键盘( ̄︶ ̄)↗ 

tip:文章可能很长,希望看完了能有所收获

机器学习|朴素贝叶斯算法(一)-贝叶斯简介及应用
机器学习|朴素贝叶斯算法(二)-用sklearn实践贝叶斯
机器学习|朴素贝叶斯算法(三)-深入理解朴素贝叶斯原理


一、 贝叶斯

贝叶斯简介:

贝叶斯(RE V Thomas Bayes),英国数学家。
贝叶斯算法源于用来-解决一个“逆向概率”的问题。
AI 代码解读

贝叶斯要解决的问题:

  • 正向概率:假设袋子里面有N个白球,M个黑球,闭着眼伸手去摸球,摸出白球的概率是多少
  • 逆向概率:如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测

为什么用贝叶斯:

  • 现实世界本身就是不确定的,人类的观察能力是有局限性的
  • 我们日常所观察到的只是事物表面上的结果,因此我们需要提供一个猜测

下面举一个简单的概率问题来说明此事:

问题:男60%,女40%,男生总是穿长裤,女生则一半穿长裤一半穿裙子

正向概率:随机选取一个学生,他(她)穿长裤的概率和穿裙子的概率是多大

逆向概率:迎面走来一个穿长裤的学生,你只看得见他(她)穿的是否长裤,而无法确定他(她)的性别,你能够推断出他(她)是女生的概率是多大吗?

假设学校里面人的总数是 U

穿长裤的男生:U×P(Boy)×P(Pants|Boy)

P(Boy) 是男生的概率 = 60%

P(Pants|Boy) 是条件概率,即在 Boy 这个条件下穿长裤的概率是多大,这里是 100% ,因为所有男生都穿长裤

穿长裤的女生:U×P(Girl)×P(Pants|Girl)

求解:穿长裤的人里面有多少女生?

穿长裤总数:U×P(Boy)×P(Pants|Boy)+U×P(Girl)×P(Pants|Girl)

结果: U×P(Girl)×P(Pants|Girl)U×P(Boy)×P(Pants|Boy)+U×P(Girl)×P(Pants|Girl)

与总人数有关吗?

U×P(Girl)×P(Pants|Girl)U×P(Boy)×P(Pants|Boy)+U×P(Girl)P(Pants|Girl)

容易发现这里校园内人的总数U是无关的,可以消去

P(Girl|Pants)=P(Girl)×P(Pants|Girl)P(Boy)×P(Pants|Boy)+P(Girl)×P(Pants|Girl)

可以发现:

分母其实就是P(Pants)

分子其实就是P(Pants,Girl)

贝叶斯公式P(A|B)=P(B|A)P(A)P(B)

二、贝叶斯应用:

拼写纠正实例
垃圾邮件过滤实例
AI 代码解读

1.拼写纠正实例

问题是我们看到用户输入了一个不在字典中的单词,我们需要去猜测:这个家伙到底真正想输入的单词是什么呢?

P(我们猜测他想输入的单词 | 他实际输入的单词)

用户实际输入的单词记为 D ( D 代表 Data ,即观测数据)

猜测1P(h1|D)猜测2P(h2|D)猜测3P(h3|D)......

统一为P(h|D)

根据上文推导出来的贝叶斯公式:P(h|D)=P(h)×P(D|h)P(D)

对于不同的具体猜测 h1 h2 h3 .. ,P(D) 都是一样(因为都是同一个观测数据D嘛)的,所以在比较P(h1|D)P(h2|D) 的时候我们可以忽略这个常数

P(h|D)P(h)P(D|h)

上式的意思表明了:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小“(先验概率,Prior )(即P(h))和“这个猜测生成我们观测到的数据的可能性大小”(即似然,P(D|h))。

贝叶斯方法计算P(h)P(D|h),P(h)是特定猜测的先验概率

比如用户输入tlp ,那到底是 top 还是 tip ?这个时候,当最大似然不能作出决定性的判断时,先验概率就可以插手进来给出指示—— “既然你无法决定,那么我告诉你,一般来说 top 出现的程度要高许多,所以更可能他想打的是 top ”

模型比较理论

最大似然:最符合观测数据的(即 P(D|h) 最大的)最有优势的

奥卡姆剃刀P(h) 较大的模型有较大的优势

掷一个硬币,观察到的是“正”,根据最大似然估计的精神,我们应该猜测这枚硬币掷出“正”的概率是 1(也就是这枚硬币是特制的,两面都是正),因为这个才是能最大化 P(D|h)的那个猜测

如果平面上有 N 个点,近似构成一条直线,但绝不精确地位于一条直线上。这时我们既可以用直线来拟合(模型1),也可以用二阶多项式(模型2)拟合,也可以用三阶多项式(模型3),特别地,用 N-1 阶多项式便能够保证肯定能完美通过 N 个数据点。那么,这些可能的模型之中到底哪个是最靠谱的呢?

根据奥卡姆剃刀:在两个模型在训练集训练出来的结果一样好时,选择简单的(防止过拟合,把模型中特有的参数作为特征),也就是选择阶数最小的那个模型。

2.垃圾邮件过滤实例

问题:给定一封邮件,判定它是否属于垃圾邮件

D 来表示这封邮件,注意 D 由 N 个单词组成。我们用 h+ 来表示垃圾邮件,h- 表示正常邮件

P(h+|D)=P(h+)×P(D|h+)P(D)

P(h|D)=P(h)×P(D|h)P(D)

先验概率P(h+)P(h) 这两个先验概率都是很容易求出来的,只需要计算一个邮件库里面垃圾邮件和正常邮件的比例就行了。

设D 里面含有 N 个单词 d1,d2,d3,P(D|h+)=P(d1,d2,..,dn|h+)

P(d1,d2,..,dn|h+)就是说在垃圾邮件当中出现跟我们目前这封邮件一模一样的一封邮件的概率是多大!

显然,如果要一模一样也就是说要邮件中每个单词都一样,那真是很苛刻了,所以我们现实中要降低判断垃圾邮件的标准,只要求和我们已知的垃圾邮件有一定的相似度就行了

P(d1,d2,..,dn|h+)由全概率公式扩展为: P(d1|h+)×P(d2|d1,h+)×P(d3|d2,d1,h+)×..

这里我们假设 didi1是完全条件无关的(因为朴素贝叶斯(naïve bayes)假设特征之间是独立,互不影响

简化为P(d1|h+)×P(d2|h+)×P(d3|h+)×..,再次降低了评判的标准,而现在每一个概率又都是可计算的了

对于P(d1|h+)×P(d2|h+)×P(d3|h+)×..只要统计 di 这个单词在垃圾邮件中出现的频率即可。
下面来看一下老师在课程中给出的贝叶斯-拼写检查器的代码。

求解:argmaxc P(c|w) -> argmaxc P(w|c) P(c) / P(w)

P(c):文章中出现一个正确拼写词 c 的概率, 也就是说, 在英语文章中, c 出现的概率有多大
P(w|c):在用户想键入 c 的情况下敲成 w 的概率. 因为这个是代表用户会以多大的概率把 c 敲错成 w
argmaxc:用来枚举所有可能的 c 并且选取概率最大的


import re, collections
 ###贝叶斯-拼写检查器###
# 把语料中的单词全部抽取出来, 转成小写, 并且去除单词中间的特殊符号
def words(text): return re.findall('[a-z]+', text.lower()) 
 
#避免一个单词未在语料库中出现但却出现了(那不就返回0了),为了避免,用很小的lambda代替
def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model
 
NWORDS = train(words(open('big.txt').read()))
 
alphabet = 'abcdefghijklmnopqrstuvwxyz'
##编辑距离:两个词之间的编辑距离定义为使用了几次插入(在词中插入一个单字母), 删除(删除一个单字母), 交换(交换相邻两个字母), 替换(把一个字母换成另一个)的操作从一个词变到另一个词

#返回所有与单词 w 编辑距离为 1 的集合
def edits1(word):
    n = len(word)
    return set([word[0:i]+word[i+1:] for i in range(n)] +                     # deletion
               [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition
               [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # alteration
               [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])  # insertion
 
#返回所有与单词 w 编辑距离为 2 的集合
#在这些编辑距离小于2的词中间, 只把那些正确的词作为候选词
def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
 

#正常来说把一个元音拼成另一个的概率要大于辅音 (因为人常常把 hello 打成 hallo 这样); 把单词的第一个字母拼错的概率会相对小, 等等.但是为了简单起见, 选择了一个简单的方法: 编辑距离为1的正确单词比编辑距离为2的优先级高, 而编辑距离为0的正确单词优先级比编辑距离为1的高. 
def known(words): return set(w for w in words if w in NWORDS)

#如果known(set)非空, candidate 就会选取这个集合, 而不继续计算后面的
def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=lambda w: NWORDS[w])
AI 代码解读

OK,如果看完这一篇对贝叶斯还是不了解的话,没关系!
接下来我会用python机器学习的库来简单实践一下,再深入的谈一谈对朴素贝叶斯算法原理的理解。

目录
打赏
0
0
0
0
1243
分享
相关文章
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
56 6
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
基于遗传优化算法的多AGV栅格地图路径规划matlab仿真
本程序基于遗传优化算法实现多AGV栅格地图路径规划的MATLAB仿真(测试版本:MATLAB2022A)。支持单个及多个AGV路径规划,输出路径结果与收敛曲线。核心程序代码完整,无水印。算法适用于现代工业与物流场景,通过模拟自然进化机制(选择、交叉、变异)解决复杂环境下的路径优化问题,有效提升效率并避免碰撞。适合学习研究多AGV系统路径规划技术。
基于GA遗传算法的斜拉桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现斜拉桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率ηq(0.95≤ηq≤1.05)的要求,目标是使ηq尽量接近1,同时减少加载车辆数量和布载耗时。程序通过迭代优化计算车辆位置、方向、类型及占用车道等参数,并展示适应度值收敛过程。测试版本为MATLAB2022A,包含核心代码与运行结果展示。优化模型综合考虑车辆总重量、间距及桥梁允许载荷密度等约束条件,确保布载方案科学合理。
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等