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

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…

MySQL 字符字段长度设置详解:语法、注意事项和示例

本文将详细介绍在 MySQL 数据库中如何设置字符字段的长度。将介绍字符字段的数据类型、长度限制、语法示例,并提供具体的示例,以正确设置和管理字符字段的长度。 1. MySQL 字符字段长度概述 在 MySQL 中,字符字段是用于存储文本型数据的列。…

TIMESTAMP之2038年

TIMESTAMP 数据类型的存储上限。实际上,TIMESTAMP 类型在不同的数据库系统中有着不同的存储上限。 TIMESTAMP占用4个字节、并且查询的时候系统会帮你自动转成(Y-m-d H:i:s),可读性强,可读性与可维护性一举两得 但是!&#xff01…

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

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

leetcode148-Sort List

题目 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 分析 这道题目的思路也比较明确,我们可以用递归排序的思路,先不断拆分链表直到只…

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…

C#如何在异步任务中调用及取消一个长时间运行的同步方法

在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务) using System.Diagnostics;Console.WriteLine("Hell…

网络编程-day5

IO复用select实现TCP服务端 #define IP "192.168.125.196" #define PORT 8888 int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket");return -1;}int reuse 1;if(setsockopt(sfd, SOL_SOCKE…

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

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

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

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

Date、LocalDateTime、时间戳、日期字符串互转

前言 由于历史原因,项目上使用Date、LocalDateTime、时间戳甚至日期字符串的情况五花八门,在每次参数传递的时候,遇到类型不一致的时候就会很痛苦,接下来就总结下这些类之间到底怎样互转。 1 From Date Date作为老牌的日期处理…

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

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

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

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

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

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

云WAF:网络安全的未来之选

在数字化时代,网络安全面临着前所未有的挑战。云WAF(Web Application Firewall)作为一种创新的网络安全解决方案,正以其独特的优势引领网络安全的新潮流。云WAF(Web Application Firewall)作为保护Web应用安…

flutter出现kotlin版本问题解决办法

.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.7.1. 在android的settings.gradle下 plugins {id "dev.flutter.flutter-gradle-plugin" version "1.0.0…

几个速度比较快的 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…