本文目录

  • 概述
  • 一 贝叶斯算法概述
  • 二 贝叶斯公式
    • 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:贝叶斯算法(理论+实战)相关推荐

  1. 机器学习实验:朴素贝叶斯算法

    机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...

  2. 机器学习朴素贝叶斯算法_机器学习中的朴素贝叶斯算法

    机器学习朴素贝叶斯算法 朴素贝叶斯算法 (Naive Bayes Algorithm) Naive Bayes is basically used for text learning. Using t ...

  3. 【机器学习笔记】朴素贝叶斯

    本文学习自 https://zhuanlan.zhihu.com/ml-jack 朴素贝叶斯 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题. 1.贝叶斯决策理论 贝叶斯决策理论的核心思想:选择具 ...

  4. 机器学习笔记 - 学习朴素贝叶斯概念及应用

    一.思想概述         贝叶斯分类算法是一大类分类算法的总称:贝叶斯分类算法以样本可能属于某类的概率来作为分类依据:朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种. 朴素贝叶斯分类器是一种用于 ...

  5. 朴素贝叶斯算法及其实战

    1.概率: 随机事件发生的可能性 2.定义 贝叶斯方法 贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类.由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的.贝叶斯方法的特 ...

  6. 机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现

    本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序.1 方法概 ...

  7. 【Python】机器学习笔记03-朴素贝叶斯(Naive Bays)

    本文的参考资料:<Python数据科学手册>: 本文的源代上传到了Gitee上: 本文用到的包: %matplotlib inline import pandas as pd import ...

  8. sklearn上机笔记3:朴素贝叶斯算法实践

    import pandas as pd import numpy as np #导入数据集生成工具 from sklearn.datasets import make_blobs #随机生成500个类 ...

  9. 机器学习:朴素贝叶斯算法+中文情感分类+python

    朴素贝叶斯中文情感分类 1.写在前面 朴素贝叶斯算法理论在很多博客上已经解释的很详细了,本文就不再叙述,本文注重于算法的应用以及编程实现,在读取前人的博客以及他们的项目应用,本人结合书本<机器学 ...

  10. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

最新文章

  1. Sql Server 调用DLL
  2. Python自动化运维之25、Ajax
  3. VTK:图片之Cast
  4. linux安装trac+svn+apache+wike,windos中Trac+apache+svn的安装与配置
  5. 为什么说5G会提前于2018年到来?
  6. C++ 多线程使用future传递异常
  7. Git(10)-merge
  8. 引入js_好程序员web前端教程分享js中的模块化一
  9. java数组线性查找_数组查找: 线性查找与二分查找
  10. 考研复试问题之数据库概论
  11. emqx启用JWT令牌认证(包含hmac-based和public-key)
  12. Androi实现三个页面跳转
  13. python语句print(type(1j))的输出结果_Python 语句print(type(1J))的输出结果是:_学小易找答案...
  14. 无所不能的Python竟然没有一个像样的定时器?试试这个!
  15. Imperva之SecureSphere打补丁
  16. windows10专业版 hyper-v
  17. Treemily想做封闭版的家族社群,比Geni更迎合华人家庭观念
  18. C# 调用 速印标签标准版 的模板lbl文件
  19. 外骨骼设备系列4:人工智能学院派精英打造美国特种部队唯一合作的“钢铁侠”
  20. php nbl2,NBL二年级新军杀入总决赛 虽败犹荣已创造历史

热门文章

  1. serverlet 原理_什么是serverlet?
  2. 【MyBatisPlus】基础入门
  3. 代码规范----编程规约(下)
  4. 淘宝天猫1688拼多多京东电商API获取商品详情接口,参数汇总
  5. Alamofire提交json数组格式的参数
  6. java基础的查缺补漏
  7. 基于Android 6.0 MTK 彩信收发
  8. VS 2015 运行代码出现的问题
  9. Android 接入银联支付
  10. 139家企业入选前程无忧2021年度中国雇主榜;帝亚吉欧投资5亿于中国兴建碳中和威士忌酒厂 | 美通社头条...