当前位置: 首页 > 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所特有,很多其它的编程语言都有这一机…...

AI开发不再卡顿:RTX4090D 24G镜像解决环境冲突全攻略

AI开发不再卡顿:RTX4090D 24G镜像解决环境冲突全攻略 1. 为什么选择RTX4090D 24G深度学习镜像? 深度学习开发者最头疼的问题莫过于环境配置。不同框架版本、CUDA版本、依赖库之间的冲突常常让人望而却步。传统环境搭建方式需要: 手动安装C…...

别再只用CEC2005了!手把手教你用MATLAB跑通CEC2017测试集(附完整代码)

从CEC2005到CEC2017:MATLAB实战迁移指南与性能优化技巧 当优化算法研究者还在使用CEC2005作为基准测试时,前沿论文早已转向更具挑战性的CEC2017测试集。这个转变不仅仅是数字上的更新,更代表着优化算法评估标准的一次重大飞跃。本文将带你从零…...

大数据在电力行业的应用案例解析 -【电力技术】(一)—— 基于电力大客户运营的大数据落地拓展

目录 一、电力大客户运营场景与大数据价值 二、大数据平台架构(大客户运营专用) 三、落地应用案例一:电力大客户价值分群与精准画像 1. 业务目标 2. 数据宽表(工程常用) 3. 核心算法:K-Means 用户分群(简化示例代码) 4. 应用效果 四、落地应用案例二:大客户负荷…...

OpenClaw:四大使用挑战与破局思路

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...

避坑指南:Double DQN和Dueling DQN在TensorFlow 2.x中的5个常见实现错误

Double DQN与Dueling DQN在TensorFlow 2.x中的五大工程陷阱与解决方案 当你在深夜调试强化学习模型时,是否遇到过这种情况:训练曲线像过山车一样剧烈波动,明明采用了Double DQN或Dueling DQN这些改进算法,效果却比基础DQN还要差&a…...

客服服务时长难统计?RPA自动记时长,排班更合理

RPA在客服服务时长统计中的应用客服服务时长的准确统计是优化排班和提高效率的关键。传统手动统计方式存在误差大、效率低等问题。RPA(机器人流程自动化)技术可以自动记录客服工作时长,为排班提供数据支持。RPA自动记录客服工作时长的实现方式…...

Matlab实战:5步搞定微电网源储荷协调调度(附完整CPLEX调用代码)

Matlab实战:微电网源储荷协调调度的5个工程化技巧 微电网调度是新能源时代的核心技术难题之一。面对风光发电的波动性和负荷需求的多变性,如何实现源、储、荷三者的动态平衡,成为电力工程师们每天都要应对的挑战。不同于学术论文中复杂的理论…...

手把手教你用Python打造一个简易图片颜色替换工具(含Tkinter GUI界面)

用Python和Tkinter构建智能图片颜色替换工具:从零到一的完整开发指南 在数字图像处理领域,颜色替换是一个基础但极其实用的功能。想象一下,你有一张产品照片需要快速调整主色调,或者需要将证件照的背景色统一更换——传统方式可能…...

夺回社交主动权:iBeebo如何让微博回归纯粹体验

夺回社交主动权:iBeebo如何让微博回归纯粹体验 【免费下载链接】iBeebo 第三方新浪微博客户端 项目地址: https://gitcode.com/gh_mirrors/ib/iBeebo 你是否经历过这样的时刻?通勤路上想快速刷几条微博,却被开屏广告耽误了上车时间&am…...

SmartBMS:革新性开源智能电池管理系统技术解析

SmartBMS:革新性开源智能电池管理系统技术解析 【免费下载链接】SmartBMS Open source Smart Battery Management System 项目地址: https://gitcode.com/gh_mirrors/smar/SmartBMS 破解锂电池管理行业痛点:从安全隐患到性能瓶颈 在新能源技术飞…...