朴素贝叶斯算法——拼写检查器
贝叶斯分类是一类分类算法的总称,这类算法都以贝叶斯理论为基础,统称为贝叶斯分类。这里我们讨论的是贝叶斯分类中最简单的一种:朴素贝叶斯分类。(不知道为啥,写到这里想起了“素面朝天毕淑敏”)。
贝叶斯理论
一般看到像拉格朗日中值定理、帕斯卡三角、洛必达法则等等,自然而然的就知道后面其实十个人,这里也不例外,贝叶斯也是个数学家。
贝叶斯为了解决逆向概率的问题,写了一篇文章(贝叶斯理论),但是在那个年代,好东西不一定立马就被大家认可,不然哥白尼的下场也会好一点了。
我们现在有一个数据集,它由两类数据组成,
用 p1(x,y) 表示数据点 (x,y) 属于类别 1的概率,
用 p2(x,y) 表示数据点 (x,y) 属于类别2的概率,
那么对于一个新数据点 (x,y),可以用下面的规则来判断它的类别:如果 p1(x,y) > p2(x,y) ,那么类别为1
如果 p2(x,y) > p1(x,y) ,那么类别为2也就是说,我们会选择高概率对应的类别。
这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。
正向概率:比如我们现在知道学校的学生总数,也知道学校有多少男生,随机抽一个学生,计算是男生的概率有多大。
逆向概率:现在我们事先不知道男女生的比例,而是通过随机抽一个(或多个)学生,通过观察抽出来的学生,来推测学校男女比例。
贝叶斯公式推导
现在刚刚高考完,再过 10 天左右又该填报志愿了。假设今年参加高考的总数为 U,其中能考上大学的学生中,南方占比为 P(南方),北方占比 p(北方)。
那么南方能上大学的学生就为:
U * P(南方) * P(上大学|南方)
北方的准大学生就为:
U * P(北方) * P(上大学|北方)
全国的准学生总数为:
[U * P(南方) * P(上大学|南方)] + [U * P(北方) * P(上大学|北方)]
现在的问题变了,我们要算的是上大学的南方学生占比多少?
P(南方|上大学) = [U * P(南方) * P(上大学|南方)] / 全国准大学生总数
把上面的过程泛化一下,表现的更简洁一点,就变成了下面的样子,应该学过高中数学的人对这个式子都很熟悉,是不是有一种确认过眼神,这就是对的算式的感觉。
拼写检查器
相信很多人在使用搜索引擎或者在一些网站上面填写表单的时候,系统会自动的给你提示,有的提示是自动补全,有的提示是改正了你的错误。这里就用朴素贝叶斯实现一个超简单的拼写检查器。
下面要实现的就是输入一个错误的单词 w,找到一个正确的单词 c 使得 P(c|w) 最大,那么这个单词c可能就是用户真正想要输入的单词。由前面所推导的公式可以知道:
具体实现如下所示,写的很简单,只做练习,了解基本原理够用了,实际上就是在已知的单词中找到一个正确的单词使得 P(c|w) 最大。
class SpellCheck():"""P(c|w) = P(w|c)P(c) / P(w)P(c):文章出现正确拼写词c的概率,程序中直接用词频表示P(w|c):用户把词c错敲成w的概率"""alphabet = list('abcdefghijklmnopqrstuvwxyz')# 读取数据def get_data(self):fp = open('big.txt', 'r', encoding='utf-8')return fp.read()# 只拿文本中的单词def get_words(self):text = self.get_data().lower()return re.findall('[a-z]+', text)# 词频统计,返回的是词语和出现的次数def train(self):result = collections.defaultdict(lambda: 1)for word in self.get_words():result[word] += 1return resultdef edit_first(self, word):"""只编辑一次就把一个单词变为另一个单词:return: 所有与单词word编辑距离为1的集合"""length = len(word)return set([word[0:i] + word[i + 1:] for i in range(length)] + # 删除一个字母[word[0:i] + word[i + 1] + word[i] + word[i + 2:] for i in range(length - 1)] + # 调换两个字母[word[0:i] + c + word[i + 1:] for i in range(length) for c in self.alphabet] + # 修改一个字母[word[0:i] + c + word[i:] for i in range(length + 1) for c in self.alphabet]) # 插入一个字母def edit_second(self, word):""":return: 编辑两次的集合"""words = self.train()return set(e2 for e1 in self.edit_first(word) for e2 in self.edit_first(e1) if e2 in words)def already_words(self, word):""":return: 返回已知的和错误单词相近的正确单词集合,允许进行两次编辑"""words = self.train()return set(w for w in word if w in words)def check(self, word):words = self.train()neighborhood = self.already_words([word]) \or self.already_words(self.edit_first(word)) \or self.already_words(self.edit_second(word)) \or [word]# 取概率最大的正确单词,即词频最多的return max(neighborhood, key=lambda w: words[w])if __name__ == '__main__':s = SpellCheck()print(s.check('learb'))
简单测试了一下,假设用户本来想输入单词learn
,但是不小心打成了learb
,上面的程序很巧妙的就把learb
改成了learn
。
写在最后
上面只是一个简单的案例,拼写检查现在用的地方很多,可能更多的是听说使用朴素贝叶斯实现垃圾邮件过滤,也可以用它来做推荐。
需要注意的是,朴素贝叶斯的重要的假设,那就是特征之间是相互独立的,比如我们
中的我
和们
出现的概率与这两个字相邻没有任何关系,这一点就是朴素的含义,另外一个假设是,各个特征是同等重要的,即权重相同。
朴素贝叶斯算法——拼写检查器相关推荐
- 人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法
6.1 什么是朴素贝叶斯 6.1.1 一个流量预测的场景 某广告平台接到小明和小李两家服装店的需求,准备在A.B两个线上渠道 投放广告.因为小明和小李两家店都卖女装,属于同一行业相同品类的广告, 所以 ...
- 机器学习-朴素贝叶斯算法
简介 NaïveBayes算法,又叫朴素贝叶斯算法,朴素:特征条件独立:贝叶斯:基于贝叶斯定理.属于监督学习的生成模型,实现简单,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑.在大量样本下会有 ...
- 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现
应用贝叶斯准则: 使用上面这些定义,可以定义贝叶斯分类准则为: 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1; 如果 P(c2|x, y) > P(c1|x, ...
- 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)
目录 1.朴素贝叶斯实现垃圾邮件分类的步骤 2.邮件数据 3.代码实现 4.朴素贝叶斯的优点和缺点 1.朴素贝叶斯实现垃圾邮件分类的步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析 ...
- 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)
<机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...
- 【机器学习-分类】一句话+一张图说清楚朴素贝叶斯算法(附案例+代码)
说在前面 同一个算法本身存在各种不同的变体,即各种改进版本.一句话+一张图并不能涵盖所有情况,只是尽量用通俗的语言介绍其中经典的算法版本.希望对某算法本身不了解的人看完能迅速get到该算法在干什么:二 ...
- 朴素贝叶斯算法----评论情感分析系统
文章目录 前言 Step1: 爬取京东评论,作为模型数据集 测试爬虫 爬取6000条好评信息作为数据集,并存储为CSV文件 爬取4000条差评信息作为数据集,并存储为CSV文件 Step2: 读取数据 ...
- python贝叶斯算法的论文_朴素贝叶斯算法从入门到Python实践
1,前言 很久不发文章,整理些干货,希望相互学习吧.进入主题,本文主要时说的为朴素贝叶斯分类算法.与逻辑回归,决策树一样,是较为广泛使用的有监督分类算法,简单且易于理解(号称十大数据挖掘算法中最简单的 ...
- 朴素贝叶斯算法的python实现
朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯 比如我们想判断一个邮件是不是垃圾邮件,那 ...
- Python实现朴素贝叶斯算法
Python实现朴素贝叶斯算法 1.算法介绍 朴素贝叶斯假设特征相互独立,于是有下面的公式: x表示特征向量,c表示类别. 原理: 通过数据集计算出公式中右边分子中的各个概率.预测时根据公式计算出该样 ...
最新文章
- 使用好的工程实践交付可交付产品
- memcached 启动参数
- python调用百度接口实现ocr识别_Python调用百度OCR实现图片文字识别的示例代码
- python 编码 解码 读写文件
- centos php7 无法加载mysqli_Linux下安装PHP7+MySQL
- 重构-使代码更简洁优美:实际经验之谈(提供一技巧,让你省掉N多代码)
- 等级保护三级信息系统安全设计
- win10系统无线服务器出错,win10系统中Wi-Fi证书错误的解决方法
- 【基础知识】~ 分频器
- H3CNE GB0-191最新题库 加解释四份材料
- 【CDH】cdh 安装新节点卡在“Acquiring installation lock...“
- js框架jquery实现的幸运大转盘抽奖程序代码,兼容多种浏览器(Internet Explorer 6.0+ 、Firefox 2.0 、Safari 3 、Opera 9 、Chrome)
- 【看表情包学Linux】进程阻塞 | 轮询检测 | 基于非阻塞等待的轮询方案 | 进程程序替换 | exec 函数簇
- Vue实现markdown编辑器
- 宋叔日记--新手级别入门全能赚钱软件!
- 排名前6位的最流行的大数据框架,你在用哪一款?
- (转)归纳:数据库设计的六个阶段详解(有这一篇就够了)
- N后问题详解(回溯法)--Java实现
- pdf文档补丁,pdf编辑,去除pdf文件限制
- springboot开发微信小程序
热门文章
- java deff_java – 在配置中添加时出现Spring NoClassDefF...
- 图片格式如何批量转换成jpg呢?
- 人工智能冬去春来 从技术导向向应用导向转变的自然结果
- 英语语法---读音规则
- matlab对图像处理差分,MATLAB图像处理实例详解
- PDF书签制作的方法!
- MongoDB 在Linux下 数据时间问题 .Net Core
- 【渗透测试】常用工具总结
- Delphi 金额转大写
- 高通APQ8009w LTR303_ALS 光感(sensor)兼容模式调试