【机器学习】笔记内容002:贝叶斯算法(理论+实战)
本文目录
- 概述
- 一 贝叶斯算法概述
- 二 贝叶斯公式
- 1 贝叶斯公式
- 2 举例解释贝叶斯公式
- 三 实例分析
- 1 Bayers单词拼写纠错分析
- 2 Bayers邮件过滤分析
- 四 实战代码
- 一 单词拼写检查器
- 二 新闻分类
概述
本文用于记录传统机器学习算法之Bayers算法,一方面加深知识理解,另一方面作为自己的参考和学习资料,如果文章中错误性知识,欢迎评论指出!谢谢!!!
Author:SopherAuthor: SopherAuthor:Sopher
Identification:StudentIdentification: StudentIdentification:Student
Description:Description:Description: 他常在深夜调试!因为她热爱这份职业!
一 贝叶斯算法概述
1.贝叶斯算法被应用于解决:正向概率和逆向概率(以袋中的黑白求作出解释)
①正向概率:已知袋中黑球和白球的数量,问模中其中一球的概率
②逆向概率:不知道袋中的黑白球比例,随机从袋中摸出一个(或多个)球,问通过这个操作能对袋中的黑白求比例做出什么猜测?
2.理解:对于复杂环境,通过局部推出整体的条件;即是将复杂问题转换为简单问题进行求解
二 贝叶斯公式
1 贝叶斯公式
P(A∣B)=P(B∣A)∗P(A)P(B)P(A|B)=\frac{P(B|A)*P(A)}{P(B)}P(A∣B)=P(B)P(B∣A)∗P(A)
2 举例解释贝叶斯公式
问题:学校中有学生MMM人,其中理科生(SciencestudentsScience studentsSciencestudents)为60%60\%60%,文科生(LiteraturestudentsLiterature studentsLiteraturestudents)为40%40\%40%,现在要求所有的SciencestudentsScience studentsSciencestudents 均要学习计算机,而文科生中要求30%30\%30%需要学习计算机。问:在学习计算机中,文科生所占比例?
求解过程:
① 学习计算机理科生:S_computer=M∗P(S)∗P(computer∣S)S\_computer=M*P(S)*P(computer|S)S_computer=M∗P(S)∗P(computer∣S)
其中:
- S:理科生
- P(S):学校中理科生概率比
- P(computer|S):理科生中学习计算机概率
② 学习计算机文科生:L_computer=M∗P(L)∗P(computer∣L)L\_computer=M*P(L)*P(computer|L)L_computer=M∗P(L)∗P(computer∣L)
其中:
- L:文科生
- P(L):学校中文科生概率比
- P(computer|L):文科生中学习计算机概率
③ 总学习计算机人数:All_computer=L_computer+S_computerAll\_computer = L\_computer + S\_computerAll_computer=L_computer+S_computer
④ 学习计算机中,文科生占比: P(L|computer)=L_computer/All_computerP\left(L\middle| c o m p u t e r\right)=L\_computer/All\_computerP(L∣computer)=L_computer/All_computer
⑤ 对④中公式化简:
P(L|computer)=P(L)∗P(computer∣L)(P(S)∗P(computer∣S)+P(L)∗P(computer∣L))P\left(L\middle| c o m p u t e r\right)=\frac{P(L)\ast P(computer|L)}{(P(S)\ast P(computer|S)+P(L)\ast P(computer|L))}P(L∣computer)=(P(S)∗P(computer∣S)+P(L)∗P(computer∣L))P(L)∗P(computer∣L)
进一步观察说明:
⑥ 求解学习computercomputercomputer中,文科生的比例和学校的总人数MMM无关的
⑦ P(computer)=P(S)∗P(computer∣S)+P(L)∗P(computer∣L)P(computer) = P(S)\ast P(computer|S)+P(L)\ast P(computer|L)P(computer)=P(S)∗P(computer∣S)+P(L)∗P(computer∣L),即为学习计算机的总人数
⑧ P(computer,L)=P(L)∗P(computer∣L)P(computer,L) = P(L)\ast P(computer|L)P(computer,L)=P(L)∗P(computer∣L),即为文科生中学习计算机的人数
因此,对⑤中公式进行进一步的转换:
P(L∣computer)=P(computer,L)P(computer)P(L|computer)=\frac{P(computer,L)\ }{P(computer)}P(L∣computer)=P(computer)P(computer,L)
三 实例分析
1 Bayers单词拼写纠错分析
问题: Sopher开发一款Sopher lexicon用于单词纠正, 现词库中有单词H=h1,h2,...,hnH={h_1,h_2,...,h_n}H=h1,h2,...,hn, 现在用户penny输入错误单词D(D不在Sopher lexicon中),我们需要用词库中单词去猜测penny真正想输入的单词是什么?
过程分析
① 问题结合Bayers公式可以转换成数学符号表示:
P(h∣D)=P(h)∗P(D∣h)P(D)P(h|D)=\frac{P(h)*P(D|h)}{P(D)}P(h∣D)=P(D)P(h)∗P(D∣h)
其中:
- h表示统一表示H=h1,h2,...,hnH={h_1,h_2,...,h_n}H=h1,h2,...,hn中的任意单词
- P(h)P(h)P(h)表示单词h在词库中出现的概率,我们称为先验概率
- D表示观察数据,即penny输入的单词
- P(D)P(D)P(D)表示输入纠错单词中D的概率
- P(D∣h)P(D|h)P(D∣h)表示输入单词和词库单词h之间的相似度,类似键盘中不同单词的间距
② 因为单词D是penny输入的,且纠错过程是我们假设考虑单个错误性单词,因此P(D)P(D)P(D)表示常量1(或者我们理解:输入错误单词P(D)对于每一种猜测P(h∣D)P(h|D)P(h∣D)都是一样的,因此我们忽略P(D)不看)。进一步,我们对公式进行修改,如下:
P(h∣D)=P(h)∗P(D∣h)P(h|D)=P(h)*P(D|h)P(h∣D)=P(h)∗P(D∣h)
③ 此时再衡量P(h∣D)P(h|D)P(h∣D),发现只和两种因素相关:
- 先验概率P(h):P(h):P(h):为单词的选择提供指示作用
- P(D∣h):P(D|h):P(D∣h):表示猜测单词h就是代表用户penny想输入单词的可能性大小,即表示相似性
④ 通过比较不同单词hhh中P(h∣D)P(h|D)P(h∣D)的大小,确定预测单词h表示penny想输入的单词
⑤ 模型比较的方法
- 最大似然估计: P(D∣h)P(D|h)P(D∣h)大的占有优势,理解成与观察数据最相似的最优优势
- 奥卡姆剃刀: P(h)P(h)P(h)较大的占有优势,即词库中单词h出现次数做多的
2 Bayers邮件过滤分析
问题: Sopher邮件中转站致力于邮件的刷选和分发,现在Sopher接收到一个邮件D,邮件由n个单词构成,即表示D=d1,d2,...,dnD={d_1,d_2,...,d_n}D=d1,d2,...,dn他需要进行判断该邮件是否为垃圾邮件,其中我们规定是有h+h_+h+表示垃圾邮件不进行分发,h−h_-h−表示正常邮件进行分发。
过程分析:
① 仍然结合Bayers公式,将接收邮件为垃圾邮件概率表示如下:
P(h+∣D)=P(h+)∗P(D∣h+)P(D)P(h_+|D)=\frac{P(h_+)*P(D|h_+)}{P(D)}P(h+∣D)=P(D)P(h+)∗P(D∣h+)
其中:
- P(h+):P(h_+):P(h+):先验概率,表示邮件中垃圾邮件的概率,可以通过历史接收邮件中进行求取
- P(D∣h+):P(D|h_+):P(D∣h+):垃圾邮件中和目前接收的邮件相似的概率,也可以表示为:P(d1,d2,...,dn∣h+)P(d_1,d_2,...,d_n|h_+)P(d1,d2,...,dn∣h+),理解就是垃圾邮件中出现这些单词的概率大小
- P(D):P(D):P(D):表示接收邮件为D的概率,但我们是单独邮件考虑,因此不考虑P(D)P(D)P(D)
② 对于接收邮件,不能以邮件与垃圾邮件的全部单词都相同,才认为该邮件是垃圾邮件。我们认为邮件D中出现垃圾邮件中的单词达到一定概率,则认为其为垃圾邮件,因此我们对P(d1,d2,...,dn∣h+)P(d_1,d_2,...,d_n|h_+)P(d1,d2,...,dn∣h+)进一步展开表示为:
P(d1,d2,...,dn∣h+)=P(d1∣h+)∗P(d2∣d1,h+)∗P(d3∣d1,d2,h+)...∗P(dn∣d1,d2,...,dn−1,h+)P(d_1,d_2,...,d_n|h_+)=P(d_1|h_+)*P(d_2|d_1,h_+)*P(d_3|d_1,d_2, h_+)...*P(d_n|d_1,d_2,...,d_{n-1},h_+)P(d1,d2,...,dn∣h+)=P(d1∣h+)∗P(d2∣d1,h+)∗P(d3∣d1,d2,h+)...∗P(dn∣d1,d2,...,dn−1,h+)
③对于P(D∣h+)P(D|h_+)P(D∣h+)展开式,由于单词之间是相互独立没有联系的。此时,问题转化为Naive Bayers:假设特征之间是完全独立的。因此,我们只需要统计每个单词did_idi在垃圾邮件h+h_+h+出现的频率(即,垃圾邮件中出现单词d1,d2,...dnd_1,d_2,...d_nd1,d2,...dn的频率),进一步公式表示如下:
P(D∣h+)=P(d1∣h+)∗P(d2∣h+)∗P(d3∣h+)...∗P(dn∣h+)P(D|h_+)=P(d_1|h_+)*P(d_2|h_+)*P(d_3| h_+)...*P(d_n|h_+)P(D∣h+)=P(d1∣h+)∗P(d2∣h+)∗P(d3∣h+)...∗P(dn∣h+)
四 实战代码
一 单词拼写检查器
1. 代码说明
- ①在3.1中我们已经对单词过滤过程进行详细的说明,这里我们在进行回顾一下
- ②假设输入单词我们设置为www,词库中存在的单词使用ccc表示,依据贝叶斯公式,我们的求解目标可以装换为如下的公式表示:
argmax(P(c∣w))=argmax(P(c)∗P(w∣c)P(w))argmax(P(c|w)) = argmax(\frac{P(c)*P(w|c)}{P(w)})argmax(P(c∣w))=argmax(P(w)P(c)∗P(w∣c))
其中:- P(c∣w):P(c|w):P(c∣w): 表示用户输入单词www,但实际想输入单词为ccc的概率
- P(w∣c):P(w|c):P(w∣c): 表示用户想要单词输入单词ccc,但误输入成单词www的概率
- P(c):P(c):P(c): 表示词库中存在单词c的概率/频率
- P(w):P(w):P(w): 常量
- 说明:对于P(c∣w)P(c|w)P(c∣w)和P(w∣c)P(w|c)P(w∣c)的说明可能有点相似,但实际是有区别的,大家可细品!!本质可以理解:P(c∣w)P(c|w)P(c∣w)不好求,而P(w∣c)P(w|c)P(w∣c)容易求出!!
- 求解出最大的概率P(c∣w)P(c|w)P(c∣w),则认为ccc为用户penny想输入的单词
2. 代码实现
import re, collections'''
function: spelling check machine
methods: Bayers methods
'''def words(text):return re.findall('[a-z]+', text.lower()) # fetch words changed lower case matching regular expression:[a-z]+def train(features):model = collections.defaultdict(lambda :1) # dict generate: make input word appear once(probability is small) although the word not in lexiconfor feature in features:model[feature] += 1return model
numWords = train(words(open('big.txt').read()))alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits(word):'''function: set distance equal 1 between input words with true words, get new form for input words'''n = len(word)return set([word[0:i] + word[i+1:] for i in range(n)] + # delete single letter[word[0:i] + word[i+1] + word[i] + word[i+2:] for i in range(n - 1)] + # transpose adjacent letter[word[0:i] + c + word[i+1:] for i in range(n) for c in alphabet] + # alteration single letter with 26 letter[word[0:i] + c + word[i:] for i in range(n + 1) for c in alphabet] # insert 26 letter)def know_edits(word):'''function: set distance equal 2 between e2 and e1, makesure e2 is true'''return set(e2 for e1 in edits(word) for e2 in edits(e1) if e2 in numWords)def know(word):return set(w for w in word if w in numWords)def correct(word):candidates = know([word]) or know(edits(word)) or know_edits(word) or [word] # stop when satisfy one return max(candidates, key=lambda w : numWords[w])result1 = correct("tha")
print("输入单词为tha,拼写检查器纠错后单词为:", result1)
result2 = correct("mrow")
print("输入单词为mat,拼写检查器纠错后单词为:", result2)
测试结果如下:
输入单词为tha,拼写检查器纠错后单词为: the
输入单词为mat,拼写检查器纠错后单词为: grow
3. 资料说明
①文中所有big.txt文件获取路径:https://github.com/dscape/spell
②具体方式:将路径中的项目使用Git或者Download ZIP形式下载到本地,具体文件所在在目录:test->resources->big.txt
二 新闻分类
"""朴素贝叶斯算法进行文本分类:return:None
"""
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_reportdef naveibayes():# 加载新闻数据news = fetch_20newsgroups(subset= "all")# 数据分割x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size= 0.25)# print(x_train)# 对数据集进行特征抽取(字符串数据)tf = TfidfVectorizer()x_train = tf.fit_transform(x_train)x_test = tf.transform(x_test)print(tf.get_feature_names()) # 获取特征抽取的特征名# 进行朴素贝叶斯算法mlt = MultinomialNB(alpha = 1.0)print(x_train.toarray())mlt.fit(x_train, y_train)# 对训练集特征值进行预测y_predict = mlt.predict(x_test)print("训练集预测结果为:", y_predict)print("模型的准确率:", mlt.score(x_test, y_test))# 精确率和召回率print("每个类别的精确率和召回率:")print(classification_report(y_test,y_predict,target_names= news.target_names))return Noneif __name__ == "__main__":naveibayes()
QWQ,Iwillsucceeduntilsuccess!!!!QWQ, I\space will\space succeed\space until\space success!!!!QWQ,I will succeed until success!!!!
【机器学习】笔记内容002:贝叶斯算法(理论+实战)相关推荐
- 机器学习实验:朴素贝叶斯算法
机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...
- 机器学习朴素贝叶斯算法_机器学习中的朴素贝叶斯算法
机器学习朴素贝叶斯算法 朴素贝叶斯算法 (Naive Bayes Algorithm) Naive Bayes is basically used for text learning. Using t ...
- 【机器学习笔记】朴素贝叶斯
本文学习自 https://zhuanlan.zhihu.com/ml-jack 朴素贝叶斯 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题. 1.贝叶斯决策理论 贝叶斯决策理论的核心思想:选择具 ...
- 机器学习笔记 - 学习朴素贝叶斯概念及应用
一.思想概述 贝叶斯分类算法是一大类分类算法的总称:贝叶斯分类算法以样本可能属于某类的概率来作为分类依据:朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种. 朴素贝叶斯分类器是一种用于 ...
- 朴素贝叶斯算法及其实战
1.概率: 随机事件发生的可能性 2.定义 贝叶斯方法 贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类.由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的.贝叶斯方法的特 ...
- 机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现
本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序.1 方法概 ...
- 【Python】机器学习笔记03-朴素贝叶斯(Naive Bays)
本文的参考资料:<Python数据科学手册>: 本文的源代上传到了Gitee上: 本文用到的包: %matplotlib inline import pandas as pd import ...
- sklearn上机笔记3:朴素贝叶斯算法实践
import pandas as pd import numpy as np #导入数据集生成工具 from sklearn.datasets import make_blobs #随机生成500个类 ...
- 机器学习:朴素贝叶斯算法+中文情感分类+python
朴素贝叶斯中文情感分类 1.写在前面 朴素贝叶斯算法理论在很多博客上已经解释的很详细了,本文就不再叙述,本文注重于算法的应用以及编程实现,在读取前人的博客以及他们的项目应用,本人结合书本<机器学 ...
- 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集
各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...
最新文章
- Sql Server 调用DLL
- Python自动化运维之25、Ajax
- VTK:图片之Cast
- linux安装trac+svn+apache+wike,windos中Trac+apache+svn的安装与配置
- 为什么说5G会提前于2018年到来?
- C++ 多线程使用future传递异常
- Git(10)-merge
- 引入js_好程序员web前端教程分享js中的模块化一
- java数组线性查找_数组查找: 线性查找与二分查找
- 考研复试问题之数据库概论
- emqx启用JWT令牌认证(包含hmac-based和public-key)
- Androi实现三个页面跳转
- python语句print(type(1j))的输出结果_Python 语句print(type(1J))的输出结果是:_学小易找答案...
- 无所不能的Python竟然没有一个像样的定时器?试试这个!
- Imperva之SecureSphere打补丁
- windows10专业版 hyper-v
- Treemily想做封闭版的家族社群,比Geni更迎合华人家庭观念
- C# 调用 速印标签标准版 的模板lbl文件
- 外骨骼设备系列4:人工智能学院派精英打造美国特种部队唯一合作的“钢铁侠”
- php nbl2,NBL二年级新军杀入总决赛 虽败犹荣已创造历史