超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现

1. 朴素贝叶斯算法

朴素贝叶斯(Naive Bayes)算法是一类基于贝叶斯定理的简单而强大的概率分类器,它在假设特征之间相互独立的前提下工作。尽管这种“朴素”的假设在现实中很少成立,但朴素贝叶斯分类器在许多实际应用中表现良好,特别是在文本分类和自然语言处理领域。下面是对朴素贝叶斯算法的详细介绍,包括其原理、优点、局限性和应用场景。

1.1 贝叶斯公式

这是一个简单的贝叶斯公式,看不懂?让我们转换为中文:

-P(类别|特征)是给定特征,类别的后验概率

-P(特征|类别) 是给定类别后,条件概率

-P(类别) 是类别的先验概率

-P(特征) 是特征的边缘概率

贝叶斯公式最基本的假设是条件之间相互独立,每个条件的变更不会影响其他条件的概率。

让我们来细讲一下:

P(类别)先验概率表示类别在样本集中出现频率,比如垃圾邮件占比60%,正常邮件占比40%

条件概率表示在某个类别下特征出现的频率,计算方法为在给定的类别样本中,某个特征出现频率,例如垃圾邮件共有20封,“免费”这个词在其中出现了2次,那么条件概率为2/20 = 1/10

那么组合一下,根据公式我们可以得到每个类别的后验概率,意义就是这些特征出现,那么特征为A&B的概率是多少。

朴素贝叶斯分类就是比较后验概率的大小,如果这个类别的概率比另一个大,那么我们认定其属于概率较大的类。

根据公式我们可以得知:

计算P(特征)可以抵消,实际上我们是在比较分子大小,那么计算分子大小就是算法的关键所在。

1.2 平滑处理

实际应用中,可能出现训练数据中某些特征在某个类别下从来没有出现,将会导致计算概率为0。为了解决这个问题,我们常使用拉普拉斯平滑:

1.3 步骤分解

1. 计算先验概率  P(C) :

   先验概率表示每个类别在训练数据中出现的频率。例如,如果我们有两类邮件,垃圾邮件和正常邮件,它们各自的比例是 30% 和 70%,那么P({垃圾邮件}) = 0.3 ,P({正常邮件}) = 0.7。

2. 计算条件概率P(x_i|C) :

   条件概率表示在某个类别下特征出现的频率。例如,在垃圾邮件中,“免费”这个词出现的频率可能是 20%,而在正常邮件中可能是 1%。这些频率可以通过统计训练数据中的词频来计算。

3. 组合概率:

   将先验概率和条件概率组合在一起,计算每个类别的后验概率。然后选择后验概率最大的类别作为预测结果。

1.4 举个例子

场景:垃圾邮件分类

步骤1: 计算先验概率

P(垃圾邮件) = 3/5

P(正常邮件) = 2/5

步骤2: 计算条件概率:(这里用到拉普拉斯平滑)

垃圾邮件下的条件概率:

P(免费|垃圾邮件)= (2+1)/(9+5)= 3/14

P(中奖|垃圾邮件)= (1+1)/(9+5)= 2/14

P(点击|垃圾邮件)=(3+1)/(9+5)= 4/14

P(优惠|垃圾邮件)=(2+1)/(9+5)= 3/14

同理得到正常邮件的条件概率

步骤3:分类新邮件:

假设有一封新邮件,内容为“免费,点击,会议”,判断是属于什么类别的邮件

属于概率较大的一类

2. 手写代码实现

def loadData():postList = [['my','dog','has','flea','problems','help','please'],['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]return postList,classVec

首先自定义一个数据集

def createVocabList(dataset): #包含在文档中不出现重复的词 相当于关键词集合vocabSet = set([])for document in dataset:vocabSet = vocabSet | set(document) #求并集return list(vocabSet)

设置一个关键词字典

def setOfwords(vocabList,inputSet):returnVec = [0]*len(vocabList) #创建与词汇表等长的零向量for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1 #word在关键词集合中的位置,在returnVec中同样的位置设定为1return returnVec

判断数据集中是否出现了我们所设置的关键词

def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory)/float(numTrainDocs)p0Num = np.ones(numWords)p1Num = np.ones(numWords)p0Denom = 2.0;p1Denom=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])p1Vect = np.log(p1Num/p1Denom)p0Vect = np.log(p0Num/p0Denom)return p0Vect,p1Vect,pAbusive

计算出先验概率以及条件概率

#朴素贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):p1 = sum(vec2Classify * p1Vec) + np.log(pClass1) #前部分为频率*概率p0 = sum(vec2Classify * p0Vec) + np.log(1-pClass1)if p1 > p0:return 1else:return 0

最后判断比较每个类别的后验概率,得到分类结果。

3. 调包实现

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化朴素贝叶斯分类器
nb_classifier = GaussianNB()# 在训练集上训练分类器
nb_classifier.fit(X_train, y_train)# 在测试集上进行预测
y_pred = nb_classifier.predict(X_test)# 计算分类器的准确率
accuracy = accuracy_score(y_test, y_pred)
print("朴素贝叶斯分类器的准确率为: {:.2f}".format(accuracy))

4. 算法优点与局限性

4.1 优点

1. 简单易实现:朴素贝叶斯算法实现起来非常简单,计算复杂度低,适合大规模数据的处理。

2. 训练速度快:由于朴素贝叶斯只需要计算先验概率和条件概率,训练速度非常快。

3. 对小数据集有效:在数据量较小的情况下,朴素贝叶斯分类器仍能提供较好的性能。

4. 适用于多类分类:朴素贝叶斯天然支持多类分类问题,而无需进行复杂的调整。

5. 处理缺失数据:朴素贝叶斯能够在一定程度上处理缺失数据。

4.2 局限性

1. 特征独立性假设:朴素贝叶斯假设特征之间是相互独立的,这在现实中很少成立。特征之间的相关性可能会影响分类器的性能。

2. 概率估计不准确:朴素贝叶斯分类器的概率输出不一定准确,尤其在特征独立性假设不成立时。

3. 对零概率敏感:如果训练数据中某类特征组合从未出现过,条件概率会被估计为零,导致最终概率也为零。这通常通过平滑技术(如拉普拉斯平滑)来解决。

4. 数据量要求:尽管在小数据集上表现良好,但如果数据量过小,分类器可能会受到训练数据分布的极大影响。

5. 应用前景

1. 文本分类:

   - 垃圾邮件过滤:通过分析电子邮件中的词频来判断邮件是否为垃圾邮件。

   - 情感分析:根据文本中的词语分布来判断文本的情感倾向(如积极、消极)。

   - 主题分类:将文档自动分类到不同的主题类别中。

2. 文档分类:

   - 新闻分类:根据新闻文章的内容自动将其归类到不同的新闻类别。

   - 电影评论分类:根据用户评论内容,判断其对电影的评价(如好评、中评、差评)。

3. 医疗诊断:

   - 疾病预测:根据病人的症状和体征,预测其可能患有的疾病。

4. 推荐系统:

   - 产品推荐:根据用户的历史行为和偏好,推荐可能感兴趣的产品。

5. 图像处理:

   - 图像分类:根据图像的像素值或特征进行分类。

6. 参考资料

机器学习(五)——朴素贝叶斯-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G工业数采网关是什么?天拓四方

随着工业4.0时代的到来,数字化、网络化、智能化成为工业发展的新趋势。在这个过程中,5G工业数采网关作为一种关键设备,发挥着越来越重要的作用。本文将详细解析5G工业数采网关是什么,以及它在工业领域中的应用和重要性。 一、5G工…

保研面试408复习 5——操作系统(死锁)、计网(TCP和UDP)

文章目录 1、操作系统一、死锁的定义、原因和必要条件a.死锁的定义b.死锁的原因c.死锁产生的必要条件 二、如何预防死锁? 2、计算机网络一、TCP和UDP的相同点二、TCP和UDP的区别 标记文字记忆,加粗文字注意,普通文字理解。 1、操作系统 一、…

领域知识 | 智能驾驶安全领域部分常见概论

Hi,早。 最近想买个新能源车,这个车吧相比于之前的内燃车,新能源车与外界的交互多了很多。比如娱乐的第三方应用,OTA升级等应用。 交互带来的便利越多,暴露的风险自然也就越大,相比于手机等消费者终端设备…

【GDAL】GDAL库学习(C#版本)

1.GDAL 2.VS2022配置GDAL环境(C#) VS2022工具–NuGet包管理器–管理解决方案的NuGet程序包,直接安装GDAL包。 并且直接用应用到当前的控制台程序中。 找一张tiff格式的图片,或者用格式转换网站:https://www.zamzar.c…

用kimi一键绘制《庆余年》人物关系图谱

《庆余年》里面人物关系复杂,如果能画出一个人物关系图谱,可以直观的理解其中人物关系,更好的追剧。 首先,用kimi下载庆余年的分集剧情,常见文章《AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情》&am…

C++三剑客之std::any(二) : 源码剖析

目录 1.引言 2.std::any的存储分析 3._Any_big_RTTI与_Any_small_RTTI 4.std::any的构造函数 4.1.从std::any构造 4.2.可变参数模板构造函数 4.3.赋值构造与emplace函数 5.reset函数 6._Cast函数 7.make_any模版函数 8.std::any_cast函数 9.总结 1.引言 C三剑客之s…

外汇天眼:外汇干预是什么? 谁来做? 怎么做?

日元兑美元汇率持续下跌,市场对外汇干预的警惕性提高。 如果日本政府和日本银行(央行)进行外汇干预,会是大约1年半以来首次。 日本2022年曾进行过3次干预。 外汇干预由谁来进行,目的是什么,又采取了什么具体…

工况数据导入MATLAB及数据复用

01--数据导入 之前在Matlab/Simulink的一些功能用法笔记(二)中有介绍过数据的导入到MATLAB工作区间 本次主要是想介绍下数据的复用 我们以NEDC工况数据为例: 通过下列3种方法进行导入: 1.通过导入Excel表数据,使用F…

番外篇 | YOLOv5更换主干网络之Conformer:首个CNN + Transformer的backbone模型

前言:Hello大家好,我是小哥谈。Transformer和CNN在处理视觉表征方面都有着各自的优势以及一些不可避免的问题。因此,国科大、鹏城实验室和华为研究人员首次将二者进行了融合并提出全新的Conformer模型,其可以在不显著增加计算量的前提下显著提升了基网表征能力。论文已被IC…

Jenkins部署成功后自动发通知到钉钉群

钉钉上如何配置 选择钉钉群,找到群设置-机器人-添加机器人 选择自定义 选择【添加】 选择【加签】,复制值,后续在jenkins里配置时会用到 复制Webhook地址,后面在jenkins里配置的时候要用到 Jenkins上如何配置 系统管理-插件管…

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗,我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格,也可能听说过中文编程,但你有没有脑洞大开,想过如果把这两者结合起来,会碰撞出什么样的火花呢? 别不信,跟着我来看看吧&a…

几个速度比较快的 Linux 开源镜像站

搜狐开源镜像站 https://mirrors.sohu.com/ File Name CPAN/ FreeBSD/ QpenBSD/ RockyL apache/ archlinux/ centos/ ceph/ cygwin/ debian/ debian–cd/ debian-security/ deepin/ deepin-cd/ docker-ce/ fedora/ fedora-epel/ gentoo/ lib/ mysql/ nginx/ opensuse/ php/ ubu…

计算机视觉中-语义分割

语义分割 语义分割是计算机视觉中的一个关键技术,它涉及对图像中的每个像素进行类别划分,从而识别出图像中的不同物体或区域。具体来说,语义分割就是按照“语义”给图像上目标类别中的每一点打上一个标签,使得不同种类的东西在图像…

EI会议的投稿流程是什么?

EI会议是工程技术领域的学术会议,为研究人员提供展示研究成果、交流学术观点的平台。下面是EI会议投稿的详细流程: EI会议论文的投稿流程是什么? 确定会议信息: 首先,确定你感兴趣的EI会议的相关信息,包括…

数据结构:树(3)【二叉树链式结构实现】【二叉树的前序,中序,后序遍历】【求二叉树全部结点个数】【求二叉树叶子结点个数】【求二叉树的深度】【单值二叉树】

一.二叉树链式结构的实现 二叉树的链式结构的实现相对于顺序结构的实现就没有那么多的讲究了。就是普通的链表,只不过多了一个指向的指针。 具体结构如下: typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

消息号 KI261 成本中心 XXXX/123123 冻结而不能直接对 2020.10.08 收入记帐

做AR凭证遇到如上图所示的报错,检查之后发现是科目的成本要素类别与成本中心的控制面板-锁定中的类型不匹配,现在科目的成本要素类别是11,控制面板中锁定了“实际销售收入”与“计划收入”。 成本要素类别“11”代表主营收入或者库存收入&…

WEB攻防【1】——ASP应用/HTTP.SYS/短文件/文件解析/Access注入/数据库泄漏

#知识点: 1、ASP-SQL注入-Access数据库 2、ASP-默认安装-数据库泄漏下载 3、ASP-IIS-CVE&短文件&解析&写入 windows iis asp access (sqlsever) 常见组合:winiisaspaccess php一般是和mysql搭配 access 数据库 一…

SQL刷题笔记day1

1题目 我的代码: select * from employees order by hire_date desc limit 2,1 标准代码: select * from employees where hire_date (select distinct hire_date from employees order by hire_date desc limit 2,1) 复盘:因为按照入…

excel里如何将数据分组转置?

这个表格怎样转换为下表?按照国家来分组,把不同年份对应的不同序列值进行转置?? 这演示用数据透视表就完成这个数据转换。 1.创建数据透视表 选中数据中任意单元格,点击插入选项卡,数据透视表,…

202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生

202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生 《首先你要快乐,其次都是其次》作者林小仙,挺轻松的小漫画,清新的文字。 生而为人,我很抱歉,大可不必。 生活已经很难…