朴素贝叶斯算法及其代码实现————拼音修正
朴素贝叶斯
朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。在机器学习分类算法中,朴素贝叶斯和其他绝多大的分类算法都不同,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。但是朴素贝叶斯却是生成方法,这种算法简单,也易于实现。
1.基本概念
朴素贝叶斯:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类时贝叶斯分类中最简单,也是最常见的一种分类方法。
贝叶斯公式:
先验概率P(X):先验概率是指根据以往经验和分析得到的概率。
后验概率P(Y|X):事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小,后验分布P(Y|X)表示事件X已经发生的前提下,事件Y发生的概率,叫做事件X发生下事件Y的条件概率。
后验概率P(X|Y):在已知Y发生后X的条件概率,也由于知道Y的取值而被称为X的后验概率。
朴素:朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思,那么贝叶斯公式中的P(X|Y)可写成:
朴素贝叶斯公式:
2,贝叶斯算法简介
贝叶斯方法源域它生前为解决一个“逆概”问题写的一篇文章。其要解决的问题:
正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大
逆向概率:如果我们事先不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或者好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例做出什么样的推测。
那么什么是贝叶斯呢?
- 1,现实世界本身就是不确定的,人类的观察能力是有局限性的
- 2,我们日常观察到的只是事物表明上的结果,因此我们需要提供一个猜测
NaiveBayes算法,又称朴素贝叶斯算法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现监督,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。
朴素贝叶斯会单独考量每一维独立特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,朴素贝叶斯的基本数据假设是:各个维度上的特征被分类的条件概率之间是相互独立的。它经常被用于文本分类中,包括互联网新闻的分类,垃圾邮件的筛选。
朴素贝叶斯分类时一种十分简单的分类算法,叫他朴素贝叶斯分类时因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,即认为此待分类项属于哪个类别。
3.贝叶斯算法的推导过程
联合概率:表示两件事共同发生(数学概念上的交集)的概念,A和B的联合概率表示为
P(AnB)。
根据条件概率的定义,在事件B发生的条件下事件A发生的概率为:
同样地,在事件A发生的条件下事件B发生的概率为:
结合这两个方程式,我们可以得到:
这个引理有时称为概率乘法规则。上式两边同时除以P(A),若P(A)是非零的,我们可以得到贝叶斯定理:
事件X在事件Y发生的条件下的概率,与事件Y在事件X发生的条件下的概率是不一样的;然而这两者是有确定关系的,贝叶斯定理就是这种关系的陈述。

4.朴素贝叶斯分类的优缺点
优点:
(1) 算法逻辑简单,易于实现
(2)分类过程中时空开销小
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
5.代码实现
import re, collections
把语料中的单词全部抽取出来, 转成小写, 并且去除单词中间的特殊符号
def words(text): return re.findall('[a-z]+', text.lower())
我们用的是big.text这个语料库
要是遇到我们从来没有过见过的新词怎么办. 假如说一个词拼写完全正确, 但是语料库中没有包含这个词, 从而这个词也永远不会出现在训练集中.
于是, 我们就要返回出现这个词的概率是0. 这个情况不太妙, 因为概率为0这个代表了这个事件绝对不可能发生, 而在我们的概率模型中, 我们期望用一个很小的概率来代表这种情况. lambda: 1
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的词中间, 只把那些正确的词作为候选词
正常来说把一个元音拼成另一个的概率要大于辅音 (因为人常常把 hello 打成 hallo 这样); 把单词的第一个字母拼错的概率会相对小, 等等.但是为了简单起见, 选择了一个简单的方法: 编辑距离为1的正确单词比编辑距离为2的优先级高, 而编辑距离为0的正确单词优先级比编辑距离为1的高.
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=lambda w: NWORDS[w])
print (correct("wort"))#这里是对wort修改,想测试其他的单词直接修改这一个单词就好了
6.数据
链接:https://pan.baidu.com/s/1SjqjhtLIRthaaoCViRHFIQ?pwd=6666
提取码:6666
参考文章:
1.[Python机器学习笔记:朴素贝叶斯算法 - 战争热诚 - 博客园 (cnblogs.com)](https://www.cnblogs.com/wj-1314/p/10560870.html#:~:text=Python机器学习笔记:朴素贝叶斯算法. 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。.,对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。. 比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。. 但是朴素贝叶斯却是生成方法,该算法原理简单,也易于实现。.)
2.带你理解朴素贝叶斯分类算法 - 忆臻的文章 - 知乎 https://zhuanlan.zhihu.com/p/26262151
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!