【机器学习】朴素贝叶斯算法基本原理与计算案例

朴素贝叶斯算法基本原理与计算案例

文章目录

  • 朴素贝叶斯算法基本原理与计算案例
    • 1. 朴素贝叶斯算法的基本原理
    • 2. 概率基础
    • 3. 朴素贝叶斯简单计算案例
    • 4. 朴素贝叶斯算法对文本进行分类
    • 5. 拉普拉斯平滑系数
    • 6. 案例:20类新闻分类
    • 7. 总结

1. 朴素贝叶斯算法的基本原理

朴素贝叶斯算法的基本原理建立在贝叶斯定理的基础上,它用于分类和概率估计。算法的核心思想是根据已知数据,计算不同类别的条件概率,并利用这些概率进行分类。以下是朴素贝叶斯算法的基本原理:

  1. 贝叶斯定理:朴素贝叶斯算法基于贝叶斯定理,该定理描述了在给定某些观察数据的情况下,如何计算某一事件的条件概率。数学表示如下:

    P(A|B) = (P(B|A) * P(A)) / P(B)

    • P(A|B):在给定B的条件下,事件A发生的概率。
    • P(B|A):在给定A的条件下,事件B发生的概率。
    • P(A):事件A发生的先验概率。
    • P(B):事件B发生的先验概率。
  2. 朴素假设:朴素贝叶斯算法做出一个朴素的假设,即特征之间是相互独立的。这意味着在分类时,它假设每个特征对于类别的影响是相互独立的。尽管这个假设在实际情况中通常不成立,但它简化了计算,使算法易于实现。

  3. 学习阶段:在朴素贝叶斯的学习阶段,使用已知的训练数据来估计每个特征在不同类别下的条件概率。这包括计算每个类别的先验概率(每个类别发生的概率)以及每个特征在每个类别下的条件概率。

  4. 预测阶段:在预测阶段,算法使用已经估计的条件概率来对新的、未知的数据点进行分类。它计算每个类别的后验概率(给定数据点的情况下,每个类别发生的概率),然后选择具有最高后验概率的类别作为预测结果

具体步骤包括计算每个特征在给定类别下的条件概率,然后将这些条件概率组合起来,使用贝叶斯定理来计算后验概率。

朴素贝叶斯算法在特征之间相关性较高的情况下可能表现不佳,因为它的独立性假设通常不成立。

2. 概率基础

  • 联合概率:包含多个条件,且这些条件同时成立的概率记作:P(A,B,…)
  • 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率,记作P(A|B)
  • 相互独立:如果P(A,B)=P(A)*P(B),则称事件A和事件B相互独立

3. 朴素贝叶斯简单计算案例

  • 下面是训练集:
样本数职业体型女神是否喜欢
1程序员超重不喜欢
2产品经理匀称喜欢
3程序员匀称喜欢
4程序员超重喜欢
5美工匀称不喜欢
6美工超重不喜欢
7产品经理匀称喜欢
  • 下面是测试集:
测试集小明产品经理超重???

我们先来明确一下目标,已知小明是一个产品经理,体重超重,是否会被女神喜欢,从测试集来看,这是一个分类问题,而且还是一个二分类问题。先来解决以下的概率问题:

  • 女神喜欢的概率?P(喜欢)=4/7
  • 职业是程序员并且体型匀称的概率?P(程序员,匀称)=1/7 联合概率
  • 在女神喜欢的条件下,职业是程序员的概率?P(程序|喜欢)=2/4=1/2 条件概率
  • 在女神喜欢的条件下,职业是程序员,体重是超重的概率?P(程序员,超重|喜欢)=1/4 联合条件概率

解决完以上的问题之后,就来解决小明的问题。

  • 目标:P(喜欢|产品经理,超重)=? and 贝叶斯公式

P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

  • 接下来就是简单的计算,在计算的过程中,我们会发现,P(产品经理,超重)=0,回到朴素贝叶斯算法的i定义,两事件之间是相互独立的,所以P(产品经理,超重)=P(产品经理)*P(超重)=7/12,所以很大可能内女神喜欢,但是也是不实际的,因为样本量太小,而且做出了相互独立的假设。

4. 朴素贝叶斯算法对文本进行分类

文档ID文档中的词属于c=China类
训练集1Chinese Beijing ChineseYes
2Chinese Chinese ShanghaiYes
3Chinese MacaoYes
4Tokyo Japan ChineseNo
测试集5Chinese Chinese Chinese Tokyo Japan

如果朴素贝叶斯公式用在文章分类的场景中,我们可以这样看:
P ( C ∣ F 1 , F 2 , F 3 , F 4... ) = P ( F 1 , F 2 , F 3 , F 4... ∣ C ) ⋅ P ( C ) P ( F 1 , F 2 , F 3 , F 4... ) P(C|F1,F2,F3,F4...) = \frac{P(F1,F2,F3,F4...|C) \cdot P(C)}{P(F1,F2,F3,F4...)} P(CF1,F2,F3,F4...)=P(F1,F2,F3,F4...)P(F1,F2,F3,F4...∣C)P(C)
其中C可以是不同类别,公式分为三个部分:

  • P©:每个文档类别的概率(某文档类别数/总文档数量)
  • P(W|C):给定类别下特征(被预测文档中出现的词)的概率,计算方法:P(F1|C)=Ni/N(训练文档中去计算,Ni为该F1词在C类别所有文档中出现的次数,N为所需类别C下的文档所有词出现次数和)
  • P(F1,F2,F3,…):预测文档中每个词的概率

首先明确目标,我们要求的是P(C|Chinese,Chinese,Chinese,Tokyo,Japan),即求:P(Chinese,Chinese,Chinese,Tokyo,Japan|C),P©,P(Chinese,Chinese,Chinese,Tokyo,Japan)

  • 根据朴素贝叶斯算法,假设每一个事件相互独立所以:P(Chinese,Chinese,Chinese,Tokyo,Japan|C)=P(Chinese|C)^3*P(Tokyo|C)*P(Japan|C),我们可以算出P(Chinese|C)=5/8,而在算P(Tokyo|C)和P(Japan|C)的时候发现为0,这会对结果产生很大的影响,发生这种情况的原因就是样本量太小了,那么如何避免这情况呢?这就要用到拉普拉斯平滑系数了。

5. 拉普拉斯平滑系数

拉普拉斯平滑系数是一种在统计学和机器学习中用于处理概率估计问题的技术。它的主要作用是解决在统计分析中遇到的一些问题,如零概率问题和过拟合问题。具体来说,拉普拉斯平滑系数通常用于计算一个特定事件在一个样本空间中的概率。在统计中,如果一个事件在训练数据中没有观察到,那么根据最大似然估计,其概率会被估计为零。这可能导致问题,因为零概率的事件在实际应用中可能不是完全不可能发生的,而只是未观察到而已。

简单来说,就是防止计算出的分类概率为0
P ( F 1 ∣ C ) = N i + α N + α m P(F1|C) = \frac{Ni+α}{N+αm} P(F1∣C)=N+αmNi+α
α为指定系数一般为1,m为训练文档中统计出的特征词个数,例如:

P(Chinese|C)=(5+1)/(8+1*6)=3/7
P(Tokyo|C)=(0+1)/(8+1*6)=1/14
P(Japean|C)=(0+1)/(8+1*6)=1/14

6. 案例:20类新闻分类

  • sklearn.naive_bayes.MultinomialNB(alpha=1.0)
    • 朴素贝叶斯分类
    • alpha:拉普拉斯平滑系数
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_splitdef nb_news_demo():"""用朴素贝叶斯算法对新闻进行分类1.获取数据2.划分数据集3.特征工程,文本特征抽取-tfidf4.朴素贝叶斯算法预估器5.模型评估:return:"""news = fetch_20newsgroups(subset= "all")x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)transfer = TfidfVectorizer()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)estimator = MultinomialNB()estimator.fit(x_train, y_train)# 模型评估,方法1:直接比对真实值和预测值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接比对真实值和预测值:\n", y_test == y_predict)# 方法2:计算准确率score = estimator.score(x_test, y_test)print("准确率为:", score)return None
y_predict:[ 4 15  9 ...  4  0  6]
直接比对真实值和预测值:[ True False  True ... False False  True]
准确率为: 0.8499575551782682

7. 总结

  • 优点:朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率;对缺失数据不太敏感,算法比较简单,常用于文本分类;分类准确率高,速度快。
  • 缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时效果不好。

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

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

相关文章

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中,我们都需要用纸和笔做笔记,但随着时代的发展,许多人已经不再选择用这种传统方式,来记录自己重要的笔记了,他们都选择将重要的笔记用软件记录下来,将笔记保存在电脑里,更不容易…

下载的nginx证书转换成tomcat证书格式

1、下载的nginx证书格式 XXX.crt private.key 2、转换成JKS格式证书步骤 #crt格式证书转pem openssl x509 -in xxx.crt -out xxx.pem#先转成p12格式,此时注意,如果有别名,需要设置 openssl pkcs12 -export -in xxx.crt -inkey private.key…

第45天:标签的分类和重要属性及常用标签、css介绍及选择器

标签 标签的分类 按结构分&#xff0c;html标签可以分为单标签和双标签。 单标签 由一个标签组成。例如&#xff1a; <br/> <hr/> <img/> 双标签 由开始标签和结束标签两部分构成&#xff0c;例如&#xff1a; <a></a> <h></h> &l…

uniapp-自定义表格,右边操作栏固定

uniapp-自定义表格&#xff0c;右边操作栏固定 在网上找了一些&#xff0c;没找到特别合适的&#xff0c;收集了一下其他人的思路&#xff0c;基本都是让左边可以滚动&#xff0c;右边定位&#xff0c;自己也尝试写了一下&#xff0c;有点样式上的小bug&#xff0c;还在尝试修…

[论文笔记]E5

引言 今天又带来一篇文本匹配/文本嵌入的笔记:Text Embeddings by Weakly-Supervised Contrastive Pre-training。中文题目是 基于弱监督对比预训练计算文本嵌入。 本篇工作提出了E5模型(EmbEddings from bidirEctional Encoder rEpresentations)。该模型以带弱监督信号的对…

Zookeeper 集群搭建

Zookeeper Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目 Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架 一旦这些数据的状态发生变化&#xff0c;Zookeeper就将负责通知…

微信小程序 跳转客服页面

前言 小程序 用户反馈 没有页面设计 可以直接跳转小程序指定客服页面 <button class"contactBtn"open-type"contact" contact"handleContact" session-from"sessionFrom">

【Tomcat】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例&#xff1a; 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

【Docker】一些可以直接用的Docker环境

这里罗列一些打包的镜像&#xff0c;方便直接使用。 cu11.6ubuntu18.04 docker push kevinchina/deeplearning:cu11.6ubuntu18.04 FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu18.04 RUN apt-get update && apt-get install -y wget git vim curl RUN wget http://…

MyBatis实验(四)——关联查询

前言 多表关联查询是软件开发中最常见的应用场景&#xff0c;多表查询需要将数据实体之间的一对多、多对多、一对一的关系的转换为复杂的数据对象。mybaits提供的association和collection元素&#xff0c;通过映射文件构造复杂实体对象&#xff0c;在构造实体过程中&#xff0…

Qt:删除QWidget中的所有布局和组件

技术要点&#xff1a; 1、调用QWidget::layout()可获取组件的布局&#xff1b; 2、QLayout::count() 可获取布局内的子项数量&#xff0c;包括子布局和子组件&#xff1b; 3、QLayout::itemAt(int index) 可根据索引获取相应的子项&#xff1b; 4、QLayout::removeWidget(Q…

手机通讯类、ip查询、智能核验、生活常用API接口推荐

手机通讯类 手机号码归属地&#xff1a;提供三大运营商的手机号码归属地查询。 空号检测&#xff1a;通过手机号码查询其在网活跃度&#xff0c;返回包括空号、停机等状态。 手机在网状态&#xff1a;支持传入三大运营商的号码&#xff0c;查询手机号在网状态&#xff0c;返…

linux mysql 创建数据库并配置用户远程管理

要在Linux上创建MySQL数据库并配置用户以实现远程管理&#xff0c;您可以执行以下步骤&#xff1a; 1. 登录到MySQL服务器&#xff1a; 在您的Linux终端中&#xff0c;使用以下命令登录到MySQL服务器。您需要提供MySQL服务器的用户名和密码。 mysql -u root -p 输入密码后&a…

几种软件开发方法对比

几种软件开发方法对比 1 综述 软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过程。 本文对净室方法、结构化方法、面向对象方法、原型法、逆向工程等方法进行梳理&#xff0c;并对各种开发方法特点、优点进行对比。 2 净室方法 2.1 特点 净…

asp.net旅游交流管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 旅游交流管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net旅游交流网站1 应用技…

学术生活|如何有效参与学术会议

参与学术会议是研究生展示自己、提高学术能力、拓展人脉关系的重要途径。拟参会者可以从研究参加人员名单&#xff0c;找共同点&#xff0c;平等地与大佬展开交流。进行有用的学术社交需要真诚、多积累个人学术作品和发表&#xff0c;并不要仅仅加微信。这些经验将帮助学者更好…

阿里云的OSS云存储的基本使用

阿里云官网&#xff1a;阿里云-计算&#xff0c;为了无法计算的价值 通过阿里云官网&#xff0c;登录进入用户的界面&#xff0c;在搜索框中输入OSS&#xff0c;然后进入阿里云的对象存储OSS的控制台。&#xff08;未开通的开通即可&#xff09; 创建 Bucket 点击【Bucket 列…

Product owner的职责

Product owner就是产品的负责人。Product owner的职责就是使Scrum团队创造增量能够实现产品价值最大化。那么Product owner该如何做呢&#xff1f;作为Scrum团队的一员&#xff0c;他&#xff08;她&#xff09;要为团队提供清晰的产品信息&#xff0c;如产品的愿景、目标。当然…

执行source命令显示 command not found

1&#xff09;修改完成/etc/profile&#xff0c;使其生效 source /etc/profile -提示找不到命令 试试&#xff1a;A&#xff09;locate source /etc/profile 试试&#xff1a;B&#xff09;usr/bin/source /etc/profile 也就是source命令无法识别而已&#xff0c;至…

4.数据库的基本操作

1.创建数据库 系统安装完成后会有部分默认数据库存在: 注意&#xff1a;mysql的语句每一个输入完后要有分号才能写下一个 这初始的四个库不要删除 其中:mysql数据库中存储用户访问权限。 创建自己的数据库命令如下: create database database_name&#xff08;数据库名字&am…