说在前面
同一个算法本身存在各种不同的变体,即各种改进版本。一句话+一张图并不能涵盖所有情况,只是尽量用通俗的语言介绍其中经典的算法版本。希望对某算法本身不了解的人看完能迅速get到该算法在干什么;二刷该算法的人能够迅速回忆起算法核心思想和做法,做到能随口讲给别人听。

往期回顾
【机器学习-分类】一句话+一张图 说清楚kNN算法(附案例+代码)
【机器学习-分类】一句话+一张图说清楚决策树算法(附案例+代码)

一句话

朴素贝叶斯算法,是一种通过根据新样本的已有特征在数据集中的条件概率来判断新样本所属类别的算法;之所以称之为朴素,因为它假设①每个特征之间相互独立、②每个特征同等重要。

一张图

实例

下面是一个用朴素贝叶斯进行疾病分类的例子

某个医院早上收了六个门诊病人,如下表。

症状 职业 疾病
打喷嚏 护士 感冒
打喷嚏 农夫 过敏
头痛 建筑工人 脑震荡
头痛 建筑工人 感冒
打喷嚏 教师 感冒
头痛 教师 脑震荡

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
根据贝叶斯定理,P(H∣D)=P(D∣H)P(H)P(D)P(H|D)=\frac{P(D|H)P(H)}{P(D)}P(H∣D)=P(D)P(D∣H)P(H)​,可以得到:

可以看出分子其实就是联合概率分布

假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了:
P(感冒∣打喷嚏×建筑工人)=P(打喷嚏∣感冒)×P(建筑工人∣感冒)×P(感冒)P(打喷嚏)×P(建筑工人)P(感冒|打喷嚏\times建筑工人) =\frac {P(打喷嚏|感冒) \times P(建筑工人|感冒) \times P(感冒)}{P(打喷嚏) \times P(建筑工人)}P(感冒∣打喷嚏×建筑工人)=P(打喷嚏)×P(建筑工人)P(打喷嚏∣感冒)×P(建筑工人∣感冒)×P(感冒)​

所以:  P(感冒|打喷嚏x建筑工人)
    = 0.66 x 0.33 x 0.5 / 0.5 x 0.33
    = 0.66
    
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。

案例——区分敏感词汇

实际应用场景
文本分类
垃圾邮件过滤
病人分类
拼写检查

朴素贝叶斯常用的三个模型有:
高斯模型:处理特征是连续型变量的情况
多项式模型:最常见,要求特征是离散数据
伯努利模型:要求特征是离散的,且为布尔类型,即true和false,或者1和0

#!/usr/bin/env python
# -*- coding:utf-8 -*-from __future__ import print_function
from numpy import *
"""
p(xy)=p(x|y)p(y)=p(y|x)p(x)
p(x|y)=p(y|x)p(x)/p(y)
"""# 项目案例1: 屏蔽社区留言板的侮辱性言论def loadDataSet():"""创建数据集:return: 单词列表postingList, 所属类别classVec"""postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #[0,0,1,1,1......]['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]classVec = [0, 1, 0, 1, 0, 1]  # 1 is abusive, 0 notreturn postingList, classVecdef createVocabList(dataSet):"""获取所有单词的集合:param dataSet: 数据集:return: 所有单词的集合(即不含重复元素的单词列表)"""vocabSet = set([])  # create empty setfor document in dataSet:# 操作符 | 用于求两个集合的并集vocabSet = vocabSet | set(document)  # union of the two setsreturn list(vocabSet)def setOfWords2Vec(vocabList, inputSet):"""遍历查看该单词是否出现,出现该单词则将该单词置1:param vocabList: 所有单词集合列表:param inputSet: 输入数据集:return: 匹配列表[0,1,0,1...],其中 1与0 表示词汇表中的单词是否出现在输入的数据集中"""# 创建一个和词汇表等长的向量,并将其元素都设置为0returnVec = [0] * len(vocabList)# [0,0......]# 遍历文档中的所有单词,如果出现了词汇表中的单词,则将输出的文档向量中的对应值设为1for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else:print("the word: %s is not in my Vocabulary!" % word)return returnVecdef _trainNB0(trainMatrix, trainCategory):"""训练数据原版:param trainMatrix: 文件单词矩阵 [[1,0,1,1,1....],[],[]...]:param trainCategory: 文件对应的类别[0,1,1,0....],列表长度等于单词矩阵数,其中的1代表对应的文件是侮辱性文件,0代表不是侮辱性矩阵:return:"""# 文件数numTrainDocs = len(trainMatrix)# 单词数numWords = len(trainMatrix[0])# 侮辱性文件的出现概率,即trainCategory中所有的1的个数,# 代表的就是多少个侮辱性文件,与文件的总数相除就得到了侮辱性文件的出现概率pAbusive = sum(trainCategory) / float(numTrainDocs)# 构造单词出现次数列表p0Num = zeros(numWords) # [0,0,0,.....]p1Num = zeros(numWords) # [0,0,0,.....]# 整个数据集单词出现总数p0Denom = 0.0p1Denom = 0.0for i in range(numTrainDocs):# 遍历所有的文件,如果是侮辱性文件,就计算此侮辱性文件中出现的侮辱性单词的个数if trainCategory[i] == 1:p1Num += trainMatrix[i] #[0,1,1,....]->[0,1,1,...]p1Denom += sum(trainMatrix[i])else:# 如果不是侮辱性文件,则计算非侮辱性文件中出现的侮辱性单词的个数p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])# 类别1,即侮辱性文档的[P(F1|C1),P(F2|C1),P(F3|C1),P(F4|C1),P(F5|C1)....]列表# 即 在1类别下,每个单词出现次数的占比p1Vect = p1Num / p1Denom# [1,2,3,5]/90->[1/90,...]# 类别0,即正常文档的[P(F1|C0),P(F2|C0),P(F3|C0),P(F4|C0),P(F5|C0)....]列表# 即 在0类别下,每个单词出现次数的占比p0Vect = p0Num / p0Denomreturn p0Vect, p1Vect, pAbusivedef trainNB0(trainMatrix, trainCategory):"""训练数据优化版本:param trainMatrix: 文件单词矩阵:param trainCategory: 文件对应的类别:return:"""# 总文件数numTrainDocs = len(trainMatrix)# 总单词数numWords = len(trainMatrix[0])# 侮辱性文件的出现概率pAbusive = sum(trainCategory) / float(numTrainDocs)# 构造单词出现次数列表# p0Num 正常的统计# p1Num 侮辱的统计 # 避免单词列表中的任何一个单词为0,而导致最后的乘积为0,所以将每个单词的出现次数初始化为 1p0Num = ones(numWords)#[0,0......]->[1,1,1,1,1.....]p1Num = ones(numWords)# 整个数据集单词出现总数,2.0根据样本/实际调查结果调整分母的值(2主要是避免分母为0,当然值可以调整)# p0Denom 正常的统计# p1Denom 侮辱的统计p0Denom = 2.0p1Denom = 2.0for i in range(numTrainDocs):if trainCategory[i] == 1:# 累加辱骂词的频次p1Num += trainMatrix[i]# 对每篇文章的辱骂的频次 进行统计汇总p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])# 类别1,即侮辱性文档的[log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表p1Vect = log(p1Num / p1Denom)# 类别0,即正常文档的[log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表p0Vect = log(p0Num / p0Denom)return p0Vect, p1Vect, pAbusivedef classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):"""使用算法:# 将乘法转换为加法乘法:P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C)/P(F1F2...Fn)加法:P(F1|C)*P(F2|C)....P(Fn|C)P(C) -> log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C)):param vec2Classify: 待测数据[0,1,1,1,1...],即要分类的向量:param p0Vec: 类别0,即正常文档的[log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表:param p1Vec: 类别1,即侮辱性文档的[log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表:param pClass1: 类别1,侮辱性文件的出现概率:return: 类别1 or 0"""# 计算公式  log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C))# 使用 NumPy 数组来计算两个向量相乘的结果,这里的相乘是指对应元素相乘,即先将两个向量中的第一个元素相乘,然后将第2个元素相乘,以此类推。# 我的理解是:这里的 vec2Classify * p1Vec 的意思就是将每个词与其对应的概率相关联起来# 可以理解为 1.单词在词汇表中的条件下,文件是good 类别的概率 也可以理解为 2.在整个空间下,文件既在词汇表中又是good类别的概率p1 = sum(vec2Classify * p1Vec) + log(pClass1)p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)if p1 > p0:return 1else:return 0def bagOfWords2VecMN(vocabList, inputSet):returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] += 1return returnVecdef testingNB():"""测试朴素贝叶斯算法"""# 1. 加载数据集listOPosts, listClasses = loadDataSet()# 2. 创建单词集合myVocabList = createVocabList(listOPosts)# 3. 计算单词是否出现并创建数据矩阵trainMat = []for postinDoc in listOPosts:# 返回m*len(myVocabList)的矩阵, 记录的都是0,1信息trainMat.append(setOfWords2Vec(myVocabList, postinDoc))# 4. 训练数据p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))# 5. 测试数据testEntry = ['love', 'my', 'dalmation']thisDoc = array(setOfWords2Vec(myVocabList, testEntry))print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))testEntry = ['stupid', 'garbage']thisDoc = array(setOfWords2Vec(myVocabList, testEntry))print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))if __name__ == "__main__":testingNB()

代码框架

运行结果

【机器学习-分类】一句话+一张图说清楚朴素贝叶斯算法(附案例+代码)相关推荐

  1. 朴素贝叶斯算法以及案例

    朴素贝叶斯算法以及案例 大家好,我是W 这次给大家带来朴素贝叶斯算法,贝叶斯分类是一类分类算法的总称,其基础都是贝叶斯定理.要理解该算法就需要先理解其背后的概率知识,我会尽量详细地给大家讲解清楚.所以 ...

  2. 朴素贝叶斯算法_机器学习第三篇:详解朴素贝叶斯算法

    一.统计知识 01|随机事件: 1.概念 随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件(简称事件).随机事件通常用大写英文字母A.B.C等表示.随机 ...

  3. 机器学习第三篇:详解朴素贝叶斯算法

    一.统计知识 01|随机事件: 1.概念 随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件(简称事件).随机事件通常用大写英文字母A.B.C等表示.随机 ...

  4. 朴素贝叶斯算法原理、代码实现原理、以及鸢尾花分类代码实现(详细代码原理讲解)

    朴素贝叶斯算法原理及鸢尾花分类代码实现 一.概率模型 1.全概率公式(由因推果) 设事件B1,B2,-,Bn构成一个完备事件组,即两两不相容,和为全集且P(Bi)>0,则对任意事件A,有 由因推 ...

  5. 【人工智能】机器学习及与智能数据处理Python使用朴素贝叶斯算法对垃圾短信数据集进行分类

    朴素贝叶斯算法 输入:样本集合D={(x_1,y_1),(x_2,y_2) (x_m,y_m); 待预测样本x; 样本标记的所有可能取值{c_1,c_2,c_3 c_k}; 样本输入变量X的每个属性变 ...

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

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

  7. 机器学习之朴素贝叶斯算法原理+Python实现

    朴素贝叶斯 1.简介 ​ 贝叶斯分类算法是统计学中的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种.其分类原理就是利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概 ...

  8. 垃圾邮件识别-朴素贝叶斯算法

    1.数据集 垃圾邮件识别使用的数据集为Enron-Spam数据集,该数据集是目前在电子邮件相关研究中使用最多的公开数据集,其邮件数据是安然公司(Enron Corporation, 原是世界上最大的综 ...

  9. 朴素贝叶斯算法学习总结

    1.朴素贝叶斯算法之朴素的含义: 朴素是指假定数据的特征变量之间是相互独立的. 2.朴素贝叶斯算法分类: 将实例分类到后验概率最大的类别当中. 假设实例数据有3个特征向量:{A1,A2,A3},Cj为 ...

最新文章

  1. springboot后台弹出前台对话框_基于springboot的精品小说网站
  2. 我们为什么需要工作流
  3. 前端工程师的知识体系
  4. 618“后高考经济”数据:3C数码依旧是毕业季的首选礼品
  5. JAVA实现求五个数阶乘之和 小实例
  6. 编译OpenJDK8:Target CPU mismatch. We are building for x86_64 but CL is for ; expected x64
  7. 《数据算法:Hadoop_Spark大数据处理技巧》艾提拉笔记.docx 第1章二次排序:简介 19 第2章二次排序:详细示例 42 第3章 Top 10 列表 54 第4章左外连接 96 第5
  8. 中兴机顶盒刷机后服务器连接失败,刷机后rec无法进入!!!求助
  9. 学校家教服务管理系统mysql_数据库课程设计报告-学校家教服务管理系统.doc
  10. python+requests爬取汽车之家二手车
  11. svc预测概率_sklearn-SVC实现与类参数
  12. 03.计算机网络--- 网络层、IP协议、手工配置IP地址
  13. 基于天牛须搜索算法的函数寻优算法
  14. 1000句英语经典口语(6)
  15. Tita绩效宝:在360度评估中要问的10个最佳问题
  16. metasploit meterpreter介绍
  17. 基于Matlab深度学习Yolov4-tiny的交通标志识别道路标志识别检测
  18. 如何高效迅速的进行CodeReview
  19. Java实现 LeetCode 754 到达终点数字(暴力+反向)
  20. 智能家居语音控制及摄像头人脸识别(含代码)

热门文章

  1. 金华职业技术学院计算机教研室主任,兰州职业技术学院教研室主任考核办法.PDF...
  2. 学习笔记——C#字符串删除字符
  3. 华为的MAC地址表安全看这一篇文章就行了
  4. 如何从视频里提取音乐
  5. 从“扁鹊自责”看品质控制(转载)
  6. 35张美丽的城市摄影作品欣赏
  7. 第二学期开学典礼致辞
  8. redhat 红帽 centos 7 中文文件夹改英文
  9. 基岩版服务器开启坐标显示,基岩版官方服务端MOD的安装和编写
  10. 男人二十五岁前该懂的