用朴素贝叶斯做垃圾邮件分类&demo

2023-11-13

贝叶斯公式

P(A|B)=\frac{P(B|A)P(A)}{P(B)}

全概公式

P(A)=\sum_{i=1}^{N}P(A|B_i)P(B_i)

思路和实现

最终的目标:对于一封邮件,分词得到w_1, w_2, ..., w_n,我们需要求出给定w_1, w_2, ..., w_n的条件下,这封邮件是垃圾邮件的概率,即求出P(s|w_1, w_2, ..., w_n)。这里s表示是垃圾邮件(spam)。

根据贝叶斯公式:P(s|w_1, w_2, ..., w_n)=\frac{P(w_1, w_2, ..., w_n|s)P(s)}{P(w_1, w_2, ..., w_n)}

根据全概公式,上式=\frac{P(w_1, w_2, ..., w_n|s)P(s)}{P(w_1, w_2, ..., w_n|s)P(s)+P(w_1, w_2, ..., w_n|n)P(n)},这里n表示是正常邮件(noraml)。

令先验概率P(s)=P(n)=0.5,因此上式=\frac{P(w_1, w_2, ..., w_n|s)}{P(w_1, w_2, ..., w_n|s)+P(w_1, w_2, ..., w_n|n)}

根据朴素贝叶斯的独立假设,上式=\frac{\prod^{n}_{i=1}P(w_i|s)}{\prod^{n}_{i=1}P(w_i|s)+\prod^{n}_{i=1}P(w_i|n)},记为式1。

至此,我们很容易统计出P(w_i|s)P(w_i|n),比如全部的垃圾邮件共计1000封,其中w_k出现800次,则P(w_k|s)=0.8。但是如果这样统计,由于词数量很多,代入式1后,就会有很多小于1的小数连乘,结果趋于零,无法计算。因此式1需要继续推导。

根据贝叶斯公式:P(w_i|s)=\frac{P(s|w_i)P(w_i)}{P(s)},把这个带入到式1中,可以得到\frac{\prod^{n}_{i=1}P(s|w_i)}{\prod^{n}_{i=1}P(s|w_i)+\prod^{n}_{i=1}P(n|w_i)}

由于在w_i出现的条件下,要么是垃圾邮件,要么不是垃圾邮件,即P(s|w_i)+P(n|w_i)=1,则上式=\frac{\prod^{n}_{i=1}P(s|w_i)}{\prod^{n}_{i=1}P(s|w_i)+\prod^{n}_{i=1}(1-P(s|w_i))}

至此,我们只需要在训练集中统计出P(s|w_i),然后对于被判定邮件的w_1, w_2, ..., w_n,取出最大的前若干个P(s|w_i)带入到上式即可进行判定是不是垃圾邮件了,这样解决了小数连乘趋于0的问题。

接下来看下如何统计P(s|w_i)

上文已经介绍了如何统计出P(w_i|s)P(w_i|n),有了这两个,就可以计算P(s|w_i)了。

根据贝叶斯公式:P(s|w_i)=\frac{P(w_i|s)P(s)}{P(w_i)}

根据全概公式,上式=\frac{P(w_i|s)P(s)}{P(w_i|s)P(s)+P(w_i|n)P(n)}=\frac{p(w_i|s)}{P(w_i|s)+P(w_i|n)}

至此,可以写代码统计出P(w_i|s)P(w_i|n),然后进行判定了。如果被判定的邮件中,有些词没有在训练集的垃圾邮件中出现。则令P(w_i|s)=0.01,同理,要是在训练集的正常邮件中没有出现,则令P(w_i|n)=0.01,如果两种邮件中都没出现过,则令P(s|w_i)=0.4。这些设定都是经验值。

代码实现和数据集

由于数据是中文的,因此用到了jieba分词模块,可以用pip install jieba安装。

https://github.com/zcsxll/bayesian_spam

参考链接

https://blog.csdn.net/shijing_0214/article/details/51200965

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用朴素贝叶斯做垃圾邮件分类&demo 的相关文章

  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485
  • 计算机网络基础概论

    什么是Internet 从具体构成角度看 端系统 主机节点 主机及其上运行的网络应用程序 和网络交换设备 数据交换节点 中继器 路由器 交换机 负载均衡设备等 边 通信链路 分为接入网链路和骨干链路 接入网链路是指主机连接到互联网的链路 骨
  • java开发异常类型汇总

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Java 5-1、用户模块-Mybatis代码生成

    5 1 用户模块 Mybatis代码生成 从这里开始 环境相关配置就告一段落了 项目就开始进入开发学习阶段 一 代码生成 实体类 Mapper接口 Mapper xml 分别生成 AppUser java SysUser java 再抽取B
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

    Python题目 学生信息管理系统 高级版 图形界面 MySQL数据库 使用图形界面显示 选用list tuple dictionary或map等数据结构 操作数据库存储X个学生的三门课的成绩 机器学习 Python程序设计 研究生英语 并
  • #BDA#笔记#阶段一:熟悉要分析的数据

    学习参考 1 小灶能力派 BDA证书班

随机推荐

  • java jhat_java命令--jhat命令使用

    jhat也是jdk内置的工具之一 主要是用来分析java堆的命令 可以将堆中的对象以html的形式显示出来 包括对象的数量 大小等等 并支持对象查询语言 使用jmap等方法生成java的堆文件后 使用其进行分析 第一步 导出堆 jmap d
  • 将一组很大的数据集随机分成两组数据

    最近在看机器学习的东西时发现了一些特别好玩的东西 机器学习中又分为训练集和测试集 如何把一组很大的数据分为这两个集合呢 可以使用接下来的函数完成 当然由于random这个随机数生成函数每次产生的数不一定都是刚好达到你的期望 所以总会有一点小
  • 【大数据入门核心技术-Impala】(一)Impala简介

    目录 一 Impala介绍 二 Impala优势 三 Impala主要功能 一 Impala介绍 Impala是Cloudera公司主导开发的新型查询系统 它提供SQL语义 能查询存储在Hadoop的HDFS和HBase中的PB级大数据 已
  • hibernateCRUD

    本文章的目的是实现hibernateDao层功能 但是具体的操作不在Dao层内完成 实体类 package com hibernate entity public class User private int id private Stri
  • 前端实现单元测试(代码版)

    Jest使用 下载 npm install save dev jest ts jest ts node jest globals types jest 在nodejs中支持ts ts执行报错 npx ts jest config init
  • 小白学习go之基础篇2 -- Slice切片的原理

    文章目录 前言 一 为什么要有切片 二 切片是怎么实现的呢 1 Go的切片结构体 SliceHeader 2 初始化切片的两种方式 3 切片是在栈上分配内存的还是在堆 4 切片的扩容 三 切片的使用有什么坑需要注意呢 总结 前言 本文主要记
  • 【解决】mysql安装时,Unable to connect to any of the specified MySQL hosts

    解决方法 win r打开运行 输入regedit 打开注册表 更改注册表 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet services mysql 服务名 ImagePath 我原先的地址为
  • 性能调优篇07:Zabbix性能优化的几点原则

    性能调优 概述 使Zabbix系统正确调整以获得最佳性能是非常重要的 Zabbix性能优化的几点原则 确保zabbix内部组件性能处于被监控状态 调优的基础 使用硬件性能足够好的服务器 不同角色分开 使用各自独立的服务器 使用分布式部署 调
  • 统计:Flutter,开发采用量

    本文作者 徐宜生 原文发布于 群英传 Flutter这个东西出来这么久了 到底市场占有率怎么样呢 为了让大家了解这一真实数据 也为了让大家了解当前Flutter在各大App中的使用情况 我今天下载了几百个App 占了手机将近80G空间 就为
  • 队列同步器AQS原理分析及具体实现

    Java中的并发编程很多都是以队列同步器AbstractQueuedSynchronizer为基础的 例如ReentrantLock CountDownLatch等 下面介绍其构成以及相应的实现 构成 private volatile in
  • 【汽车电子】浅谈LIN总线

    目录 1 为何使用LIN总线 2 什么是LIN总线 3 LIN总线的主从关系 4 LIN的特点 5 LIN报文帧结构 6 LIN总线波形 7 帧类型 8 进度表 9 状态机的实现 10 总结 11 声明 1 为何使用LIN总线 在这里你可能
  • Vue常用的修饰符有哪些?分别有什么应用场景?

    一 修饰符是什么 在程序世界里 修饰符是用于限定类型以及类型成员的声明的一种符号 在Vue中 修饰符处理了许多DOM事件的细节 让我们不再需要花大量的时间去处理这些烦恼的事情 而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    一步一步详解LSTM网络 从RNN到LSTM到GRU等 直至attention 0 前言 1 Recurrent Neural Networks循环神经网络 2 The Problem of Long Term Dependencies长期
  • import sys

    import sys 的作用是什么 参考来源 1 首先 先看一段代码 1 from sys import argv 2 script first second third argv 3 print The script is called
  • 3A之自动白平衡(AWB)篇

    在手机相机的专业模式中 可以看到有一个白平衡 WB 调节的选项 什么是AWB 人眼视觉系统具有颜色恒常性的特点 对物体的观察不受光源的影响 本质上是白色的物体 在不同色温 反射光线颜色不同的场景下 经过人眼的视觉系统矫正后还是白色 而对于C
  • 信息安全渗透测试都需要学习哪些内容?

    这个问题 说实话 在2019年之前 其实关注信息安全相关的人并不多 对于市场来讲 信息安全的需求量也不是很大 但大家都知道 在中国 随着时代和技术的发展 信息安全越来越受到重视 一步一步上升到国家战略层面 随着等保2 0出台 相应的信息行业
  • 阿里开源FASTJSON2,为FASTJSON重构升级,目标是为下一个十年提供一个高性能的JSON库

    大厂杂谈关注到阿里最近开源了fastjson2 推出几天已经获得500多的star FASTJSON2是FASTJSON项目的重要升级 目标是为下一个十年提供一个高性能的JSON库 持JSON JSONB两种协议 JSONPath是一等公民
  • 代码质量保障第2讲:单元测试 - 浅谈单元测试

    代码质量保障第2讲 单元测试 浅谈单元测试 本文是代码质量保障第2讲 浅谈单元测试 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 这是基础 所以围绕着单元测试 我从网上搜集和总结了相关的概念 以助你完善体系
  • 「OKR 理论篇」5 分钟快速掌握 OKR 管理法

    近几年在企业管理领域有一个很火的词 OKR 它发源于英特尔 兴盛于Google 随着字节跳动等互联网新贵的迅速崛起 引起了越来越多创新企业的关注 然而 对大部分公司而言 他们并没有完全理解 OKR 理念 往往将 OKR 与绩效考核等同起来
  • 用朴素贝叶斯做垃圾邮件分类&demo

    贝叶斯公式 全概公式 思路和实现 最终的目标 对于一封邮件 分词得到 我们需要求出给定的条件下 这封邮件是垃圾邮件的概率 即求出 这里s表示是垃圾邮件 spam 根据贝叶斯公式 根据全概公式 上式 这里n表示是正常邮件 noraml 令先验