一:朴素贝叶斯算法概述
1:朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,并有坚实的数学理论(即贝叶斯定理)作为支撑。

2:理解:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法

3:那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?

是下面这个贝叶斯公式:

可以换一个表达形式更容易理解:

4:例子分析

这里我们联系到朴素贝叶斯公式:

由表中的数据计算可以得到:

对于类别“嫁”的贝叶斯分子为:

对于类别“不嫁”的贝叶斯分子为:

最终结果为:

不嫁(60%) > 嫁( 40%),则该女生选择不嫁。

5:朴素贝叶斯算法的优缺点

优点:

(1) 算法逻辑简单,易于实现

(2)分类过程中时空开销小

缺点:

理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

二:垃圾邮件(我们想采用的分类方法是通过多个词来判断是否为垃圾邮件,但这个概率难以估计,通过贝叶斯公式,可以转化为求垃圾邮件中这些词出现的概率。)

1:主要步骤:

分类标准:当 P(垃圾邮件|文字内容)> P(正常邮件|文字内容)时,我们认为该邮件为垃圾邮件,但是单凭单个词而做出判断误差肯定相当大,因此我们可以将所有的词一起进行联合判断。

P(垃圾邮件|邮件内容) = P(垃圾邮件和邮件内容) / P(邮件内容) = P(邮件内容|垃圾邮件) * P(垃圾邮件) / P(邮件内容)

2:代码实现

import os
import re
import string
import mathDATA_DIR = 'enron Email dataset/enron'
target_names = ['ham', 'spam']def get_data(DATA_DIR):subfolders = ['enron%d' % i for i in range(1, 7)]data = []target = []for subfolder in subfolders:# spamspam_files = os.listdir(os.path.join(DATA_DIR, subfolder, 'spam'))for spam_file in spam_files:with open(os.path.join(DATA_DIR, subfolder, 'spam', spam_file), encoding="latin-1") as f:data.append(f.read())target.append(1)# hamham_files = os.listdir(os.path.join(DATA_DIR, subfolder, 'ham'))for ham_file in ham_files:with open(os.path.join(DATA_DIR, subfolder, 'ham', ham_file), encoding="latin-1") as f:data.append(f.read())target.append(0)return data, targetX, y = get_data(DATA_DIR)class SpamDetector_1(object):"""Implementation of Naive Bayes for binary classification"""# 清除空格def clean(self, s):translator = str.maketrans("", "", string.punctuation)return s.translate(translator)# 分开每个单词def tokenize(self, text):text = self.clean(text).lower()return re.split("\W+", text)# 计算某个单词出现的次数def get_word_counts(self, words):word_counts = {}for word in words:word_counts[word] = word_counts.get(word, 0.0) + 1.0return word_countsclass SpamDetector_2(SpamDetector_1):# X:data,Y:target标签(垃圾邮件或正常邮件)def fit(self, X, Y):self.num_messages = {}self.log_class_priors = {}self.word_counts = {}# 建立一个集合存储所有出现的单词self.vocab = set()# 统计spam和ham邮件的个数self.num_messages['spam'] = sum(1 for label in Y if label == 1)self.num_messages['ham'] = sum(1 for label in Y if label == 0)# 计算先验概率,即所有的邮件中,垃圾邮件和正常邮件所占的比例self.log_class_priors['spam'] = math.log(self.num_messages['spam'] / (self.num_messages['spam'] + self.num_messages['ham']))self.log_class_priors['ham'] = math.log(self.num_messages['ham'] / (self.num_messages['spam'] + self.num_messages['ham']))self.word_counts['spam'] = {}self.word_counts['ham'] = {}for x, y in zip(X, Y):c = 'spam' if y == 1 else 'ham'# 构建一个字典存储单封邮件中的单词以及其个数counts = self.get_word_counts(self.tokenize(x))for word, count in counts.items():if word not in self.vocab:self.vocab.add(word)  # 确保self.vocab中含有所有邮件中的单词# 下面语句是为了计算垃圾邮件和非垃圾邮件的词频,即给定词在垃圾邮件和非垃圾邮件中出现的次数。# c是0或1,垃圾邮件的标签if word not in self.word_counts[c]:self.word_counts[c][word] = 0.0self.word_counts[c][word] += countMNB = SpamDetector_2()
MNB.fit(X[100:], y[100:])class SpamDetector(SpamDetector_2):def predict(self, X):result = []flag_1 = 0# 遍历所有的测试集for x in X:counts = self.get_word_counts(self.tokenize(x))  # 生成可以记录单词以及该单词出现的次数的字典spam_score = 0ham_score = 0flag_2 = 0for word, _ in counts.items():if word not in self.vocab:continue# 下面计算P(内容|垃圾邮件)和P(内容|正常邮件),所有的单词都要进行拉普拉斯平滑else:# 该单词存在于正常邮件的训练集和垃圾邮件的训练集当中if word in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于垃圾邮件的训练集当中,但不存在于正常邮件的训练集当中if word in self.word_counts['spam'].keys() and word not in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log(1 / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于正常邮件的训练集当中,但不存在于垃圾邮件的训练集当中if word not in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log(1 / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 把计算到的P(内容|垃圾邮件)和P(内容|正常邮件)加起来spam_score += log_w_given_spamham_score += log_w_given_hamflag_2 += 1# 最后,还要把先验加上去,即P(垃圾邮件)和P(正常邮件)spam_score += self.log_class_priors['spam']ham_score += self.log_class_priors['ham']# 最后进行预测,如果spam_score > ham_score则标志为1,即垃圾邮件if spam_score > ham_score:result.append(1)else:result.append(0)flag_1 += 1return resultMNB = SpamDetector()
MNB.fit(X[100:], y[100:])
pred = MNB.predict(X[:100])
true = y[:100]accuracy = 0
for i in range(100):if pred[i] == true[i]:accuracy += 1
print("测试的正确率为:"+accuracy)  

3:结果展示(结果为:数据集中有训练集和测试集,所以当我们对训练结果进行测试时,可以发现测试结果很高为98%,所以可以实现大部分的垃圾邮件的检索。)

机器学习-朴素贝叶斯-垃圾邮件相关推荐

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  2. 朴素贝叶斯-垃圾邮件(中文的)处理

    #coding=utf-8 from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np import jie ...

  3. 朴素贝叶斯——垃圾邮件过滤

    文章目录 利用朴素贝叶斯进行文档分类 1.获取数据集 2.切分文本 3.构建词表和分类 4.构建分类器 5.测试算法 利用朴素贝叶斯进行垃圾邮件过滤 1.导入数据集 2.垃圾邮件预测 总结 利用朴素贝 ...

  4. python实现朴素贝叶斯垃圾邮件分类

    查看通俗易懂的贝叶斯垃圾邮件分类原理 请点击此处 下载邮件数据 请点击此处 import os import re import string import math import numpy as ...

  5. 机器学习实战4(1):朴素贝叶斯:垃圾邮件的识别

    一.朴素贝叶斯基础知识 预备数学知识: A. 无约束条件的优化 1.求极值问题 人工智能中最核心的数学环节是求出一个目标函数(object function)的最小值/最大值.求出一个函数最小是/最大 ...

  6. 朴素贝叶斯-垃圾邮件分类实现

    1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive B ...

  7. 第四章 朴素贝叶斯-垃圾邮件过滤

    #朴素贝叶斯之垃圾邮件过滤 import os #----------------------1.获取数据集----------------------- import pandas as pd''' ...

  8. 机器学习之贝叶斯垃圾邮件分类

    代码来源于:https://www.cnblogs.com/huangyc/p/10327209.html  ,本人只是简介学习 1. 贝叶斯.py import numpy as np from w ...

  9. 朴素贝叶斯-垃圾邮件(英文的)处理

    from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np MultinomialNB 多项式朴素贝叶斯 G ...

最新文章

  1. 国际C语言乱码大赛(IOCCC)经典之作
  2. Fundebug录屏插件更新至0.4.0,修复BUG,优化性能
  3. Java IO流面试题
  4. 客户端(STS)连接服务器上redis时的问题
  5. jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】
  6. python序列化对象的函数_使 Python 对象可序列化的函数
  7. TensorFlow HOWTO 2.3 支持向量分类(高斯核)
  8. 耶鲁大学公开课:哲学-死亡
  9. windows10资讯和兴趣怎么关闭?
  10. 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
  11. 变量的内部存储:引用和计数
  12. 计算机文档加密如何解锁,bitlocker怎么解锁_bitlocker解锁方法
  13. BUUCTF web writeup
  14. [Mac]macOS Mojave 10.14.3安装Java
  15. java 错误声音播放器_JavaME 声音播放器的使用
  16. 教师不能错过的三款教学必备工具
  17. 西电微机系统课程设计——步进电机开环控制系统设计
  18. Java腾讯企业邮箱发送邮件
  19. ABB机器人系统和出错信息
  20. 自己编写自动同步脚本

热门文章

  1. NVIDIA视频编码器 ffmpeg -h encoder=h264_nvenc
  2. 山东菏泽家乡网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  3. WordPress站点快速集成腾讯数字身份管控平台CIAM,免开发实现登录认证
  4. Python爬取京东:价格、商品ID、标题、评价、店名、是否自营
  5. 数据分析领域不同职位de薪酬职能差异
  6. 计算机考研转专业,申请美国研究生转专业有什么要求?
  7. 【精】微信小程序生成二维码海报分享 [原理+源码]
  8. 解决Linux下无法利用shell脚本启动conda虚拟环境问题
  9. 大白话、最简单——SpringBoot+Mybatis+freemarker整合(二)
  10. 基于Core Text实现的TXT电子书阅读器