当前位置: 首页 > news >正文

Python机器学习:朴素贝叶斯

前两天不知道把书放哪去了,就停更了一下,昨天晚上发现被我放在书包夹层里面了,所以今天继续开始学习。

首先明确一下啊,朴素贝叶斯是什么:朴素贝叶斯分类器是一种有监督的统计学过滤器,在垃圾邮件过滤、信息检索等领域经常被使用到。

一、极大似然估计:这个我就不讲了,纯纯数理统计的问题,目标就是找到一个参数p,让他使得所有随机变量的联合概率最大,我就直接贴上一张图吧:

图1:最大似然估计

 二、朴素贝叶斯分类:

先回忆一下,概率论里面贝叶斯公式是什么?想不起来的话,建议翻一翻浙大的那本概率论与数理统计,那里面有的,简单的来说,就是求条件概率,或者说,已知道一件事情X发生的概率,求X发生情况下另一个事件Y发生的概率:

P(Y_i |X)=\frac{P(X,Y_i)}{P(X)}=\frac{P(Y_i)P(X|Y_I)}{\sum_{j=1}^{K}P(Y_j)P(X|Y_j)}

那么,用频率代替概率在样本集合上进行估计的话,就是:

\left\{\begin{matrix} P(Y=c_k)\approx \frac{N_k}{m} & \\ P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}}{N_k} & \end{matrix}\right.

三、拉普拉斯平滑:

如果说,我们的样本集合不够大,就可能没有法子去覆盖特征值的所有可能取值,也就是说,可能会出现这种情况:

P(X^i=x^i|Y=c_k)

这个时候,你不管怎么给其他的特征分量取值,都会出现:

P(Y=c_k)\prod_{I=1}^{N}P(X^i=x^i|Y=c_k)=0

这种情况,很麻烦吧,但是,这种情况是可以避免的,通过平滑处理(典型的就是拉普拉斯平滑):

\left\{\begin{matrix} P(Y=c_k)\approx \frac{N_k+1}{m+K} & \\ P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}+1}{N_k+A^i} & \end{matrix}\right.

A_iX_i的所有可能取值的个数。

来看一下书上给出的完整的朴素贝叶斯分类器的算法:

我们要输入的是:样本集合D=\left \{ (x_1,y_1),(x_2,y_2),....(x_n,y_n) \right \},待预测样本下,样本标记的所有可能值:\left\{c_1,c_2,\cdots,c_k\right\}样本输入变量X的每个属性X_i的所有可能取值\left\{a_i1,a_i2,\cdots,a_{iA_i}\right\};

输出很简单:带预测样本x所属类别

算法如下:

step1:计算标记为c_k的样本出现的概率:

P(Y=c_k)\approx \frac{N_k+1}{m+K}

step2:计算标记为c_k的样本,其X_i分量的属性值为a_{ip}的概率

P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}+1}{N_k+A^i}

step3:根据上面的估计值计算x属于所有y_k的概率值,并且喧杂概率最大的作为输出

y=\arg max_{k=1,2,\cdots,K}(P(Y=c_k|X=x))

即:

y=\arg max_{k=1,2,\cdots,K}(P(Y=c_k)\prod_{i=1}^{n}P(X^i=x^i|Y=c_k))

 其实,朴素贝叶斯的本质就是极大似然估计,我也不知道再写些啥,书上有P(Y=c_k)P(X^i=x^i|Y=c_k)的计算方法,想推的自己推一推吧,极大似然估计这个是考研数一的必考点,我在这里强烈推荐宇哥的视频,学完一身轻松。

我们看一个书上给出的利用朴素贝叶斯实现垃圾短信分类的应用,emm,他用的是SMS Spam Collection DataSet,you 5574条短信,其中有747条垃圾短信,数据集和是个纯文本,每行对应一条垃圾短信,第一个单词是Spam或者ham,表示是不是垃圾短信,这就是很简单的标签了,标签和短信内容之间用制表符分隔。

其实看到这个的时候,我想说,好好学一学,没啥坏处,我的qq邮箱和163邮箱里面全是垃圾邮件,每天都有,烦死了快。

找了一下啊,Kaggle上面是有这个数据集的,其他人的博客也给出了相关的下载地址,我会把这个传到我的下载哪一栏里面去,有需要的可以下载。

with open('./spam.csv','r',encoding='gb18030', errors='ignore')as f:sms=[line.split(',')for line in f ]#,encoding='utf-8'
y,x=zip(*sms)
from sklearn.feature_extraction.text import CountVectorizer as CV
from sklearn.model_selection import train_test_split
y=[label=='spam'for label in y]
x_train,x_test,y_train,y_test=train_test_split(x,y)
counter=CV(token_pattern='[a-zA-Z]{2,}')
x_train=counter.fit_transform(x_train)
x_test=counter.transform(x_test)
# print (x_train)
# print(x_test)
from sklearn.naive_bayes import MultinomialNB as NB
model=NB()
model.fit(x_train,y_train)
train_score=model.score(x_train,y_train)
test_score=model.score(x_test,y_test)
print("train_score:",train_score)
print("test_score:",test_score)

注意,这里有两个地方和书上的不一样,因为我从kaggle上面下载的是.csv文件,一直读不出来,然后查了一下,将encoding='utf-8'改成了encoding='gb18030', errors='ignore',同时,这个数据集合并没有和书上说的那样子,标签和正文以空格隔开,而是用“,”隔开的,所以分隔那里我用的是

line.split(','),这下才读取成功,这个地方告诉我们,搞之前要好好看一下数据集合,不能一昧的跟着书上走,因为书是先出的,你是后学的,先出的肯定会和你后面学习要用到的东西有出入,因地制宜,合理发展,产品迭代才是硬道理(此处连续三个/doge)

好了,来看看分类效果,为啥把两个print给注释了?没错误啊,绝对保真,就是输出太多了,我嫌烦才给注释了。

图2:朴素贝叶斯分类结果

 可以看到,训练结果是0.989,测试结果是0.979,效果还是可以滴。

 

相关文章:

Python机器学习:朴素贝叶斯

前两天不知道把书放哪去了,就停更了一下,昨天晚上发现被我放在书包夹层里面了,所以今天继续开始学习。 首先明确一下啊,朴素贝叶斯是什么:朴素贝叶斯分类器是一种有监督的统计学过滤器,在垃圾邮件过滤、信…...

几个最基本软件的环境变量配置

在Windows中配置环境变量位置: 控制面板->系统和安全->系统。可以点击:“此电脑”->“属性”直接进入。 点击“高级系统设置”->【环境变量】。在这里可以看见用户变量和系统变量,如果你这台机器不是你一个人使用设置为用户变量…...

物业企业如何加快向现代服务业转型

近年来,随着人民生活水平的提高,人们对住宅质量提出更高的要求,在此前提下,全国各地涌现出了一些运用现代的计算机、控制与通信技术建设的智能化住宅小区。但是许多智能化住宅小区都存在建好了智能硬件环境却没有智能化的软件在上…...

java ssm人力资源系统Y3程序

1.系统登录:系统登录是员工访问系统的路口,设计了系统登录界面,包括员工名、密码和验证码,然后对登录进来的员工判断身份信息,判断是管理员还是普通员工。 2.系统员工管理:不管是超级…...

leetcode重点题目分类别记录(三)动态规划深入与素数理论

文章目录动态规划背包问题01背包抽象出求解目标尝试进程子问题拆分基本情况根据拆分过程定义dp数组与转移方程遍历顺序与状态压缩模板归纳题目应用变种提升组合问题多维01背包有特殊限制的01背包完全背包打家劫舍股票系列子序列类数位dp动态规划 背包问题 01背包 有C0-Cx件物…...

面试篇-学习Java多线程编程必备:深入理解volatile与synchronized

1. 概述 1.1 Volatile概述 Volatile是Java中的一种轻量级同步机制,用于保证变量的可见性和禁止指令重排。当一个变量被声明为Volatile类型时,任何修改该变量的操作都会立即被所有线程看到。也就是说,Volatile修饰的变量在每次修改时都会强制…...

后端系列文章

后端系列文章目录 缘由:无聊了,写点博客玩玩 注:该系列文章纯属个人见解,漏洞百出,大家看个乐就行了,别当真! 私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多&…...

C++之AVL树

文章目录前言一、概念二、AVL树结点的定义三、AVL树的插入四、AVL树的旋转1.右单旋的情况以及具体操作抽象图h 0h 1h 2代码实现2.左单旋的情况以及具体操作抽象图代码实现3.右左双旋的情况以及具体操作抽象图h 0h 1h 23.左右双旋的情况以及具体操作抽象图5.总结6.完整实现…...

【ROS2指南-2】入门 turtlesim 和 rqt

目标:安装并使用 turtlesim 包和 rqt 工具为即将到来的教程做准备。 教程级别:初学者 时间: 15分钟 内容 背景 先决条件 任务 1 安装turtlesim 2 启动turtlesim 3 使用turtlesim 4 安装rqt 5 使用 rqt 6 重新映射 7 关闭turtlesim …...

Python 进阶指南(编程轻松进阶):四、起个好名字

原文:http://inventwithpython.com/beyond/chapter4.html 计算机科学中最困难的两个问题是命名事物、缓存失效引起错误."这个经典的笑话,出自利昂班布里克之手,并基于菲尔卡尔顿的一句话,包含了一个真理的核心:很…...

STL容器适配器之<priority_queue>

文章目录测试环境priority_queue介绍头文件模块类定义对象构造元素访问元素插入和删除容器大小迭代器其他函数测试环境 系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2 priority_queue介绍 容器适配器。支持在末端插入…...

线程——线程同步

案例:卖票 需求:某电影院目前正在上映国产大片,共有100张票,而它有三个窗口卖票,请设计一个程序模拟该电影院卖票 思路: 定义一个类SellTicket实现Runnable接口,里面定义一个成员变量&#xff…...

安卓录屏使用VirtualDisplay虚拟屏幕;MediaRecorder,媒体录影机;

1.跟截屏一样,判断权限,然后在onActivityResult里面给mediaProjection赋能; 2.初始化录像机: //初始化Recorder录像机 fun initRecorderStart() { //新建Recorder val displayMetrics DisplayMetrics() val width displayMetri…...

Java FileChannel文件的读写实例

一、概述: 文件通道FileChannel是用于读取,写入,文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率,他们读和写直接建立了通道&#x…...

2023 年男生还推荐报计算机专业吗?

计算机专业确实是一个非常热门的专业,就业前景也很广阔。 但是,近些年随着各个大学对计算机专业及其相关专业疯狂扩招,而且每年的毕业人口都在增多,行业是根本容纳不下的,就业竞争力度也急剧上升。因此,选…...

【华为OD机试真题】积木最远距离(相同数字的积木游戏1)(javapython)

相同数字的积木游戏1 知识点数组循环map 时间限制:1s 空间限制:256MB 限制语言:不限 题目描述: 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数…...

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

一、SG90舵机介绍 SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械…...

【4.13(补)】二叉搜索树的遍历、插入、删除

文章目录二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 因为二叉搜索树是有序的,第一次找到p和q中间的值,就是最近的公共祖先…...

Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)

Web 攻防之业务安全:Callback自定义测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业务所提…...

Java访问底层操作系统

native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...