机器学习贝叶斯算法详解+公式推导+垃圾邮件过滤实战+python代码实现(代码片段)

WSKH0929 WSKH0929     2023-01-11     391

关键词:

文章目录


一、贝叶斯简介

贝叶斯主要解决的问题是“逆概”问题,那么什么是正向概率什么是逆向概率呢,下面给出解释


二、贝叶斯公式推导

贝叶斯定理由英国数学家贝叶斯 ( Thomas Bayes 1702-1761 ) 发展,用来描述两个条件概率之间的关系,比如 P(A|B) 和 P(B|A)。按照乘法法则,可以立刻导出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B)。如上公式也可变形为:P(A|B)=P(B|A)*P(A)/P(B)。

下面举一个例子来推导贝叶斯公式:

解答如下:




最终得到贝叶斯公式如下

P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) P(A|B)=\\fracP(A)×P(B|A)P(B) P(AB)=P(B)P(A)×P(BA)


三、拼写纠正案例

问题描述如下:
例如,用户拼写 thr ,我们猜测他可能想拼写 the

根据贝叶斯公式,我们可以得到如下结论:

由于用户实际输入的单词是已知的,所以P(D)是一个常数,所以上式的P(D)其实可以忽略。
P(h)是我们猜测词可能出现的概率,这个概率可以通过从一个庞大的语料库中统计获取
P(D|h)是当用户实际像输入的词是h时,用户输入D的概率。假设D是thr,h是the,那么P(D|h)我们可以通过计算thr要通过多少步的增删改操作才能变为the,所需要的步数越少,P(D|h)概率越大。

其中,P(h)又叫先验概率,是我们从庞大语料库中可以获取到的已知概率

贝叶斯和最大似然的区别在于,最大似然的结果由数据决定,而贝叶斯的结果由先验概率决定。例如,抛硬币游戏,前一百次都抛了正面,最大似然会认为下一次抛肯定还是正面。但是贝叶斯由于有先验概率的存在,无论如何他都认为下一次抛出正面的概率是0.5。


四、垃圾邮件过滤案例

4.1 问题描述

问题的相关描述如下:

4.2 朴素贝叶斯引入

一封邮件里有很多单词,从实际出发,第二个词出现的概率其实是受第一个词的影响的。所以将P(d1,d2,…,dn|h+)扩展之后的公式如下所示:

像上面那样展开的话就会导致计算非常复杂,为了简化计算,我们可以假设相邻词之间是独立无关的,这样就可以将展开后的式子简化为下图所示的式子(朴素贝叶斯就是比贝叶斯多了独立无关这个假设):


五、基于朴素贝叶斯的垃圾邮件过滤实战

本章节的完整代码和邮件数据集的链接为:Python代码实现基于朴素贝叶斯算法的垃圾邮件分类

5.1 导入相关库

import numpy as np
import re
import random

5.2 邮件数据读取

下面是数据集的截图(每一行代表一封邮件),格式为:邮件类别\\t邮件内容

# 数据预处理操作(词的切分、词转化为小写)
def text_parse(input_str):
    word_list = re.split(r"\\W+", input_str)
    return [word.lower() for word in word_list if len(word_list) > 2 and len(word) > 0]


# 获取数据
def read_data():
    doc_list = []
    class_list = []
    with open("./data/SMS.txt", "r", encoding="utf-8") as file:
        datas = file.read()
        # print(data)
        datas = datas.split("\\n")
        for data in datas:
            # label = ham 代表 正常邮件 , label = spam 代表垃圾邮件
            label, text = data.split("\\t")
            doc_list.append(text_parse(text))
            # 0:正常邮件,1:垃圾邮件
            class_list.append(0 if label == "ham" else 1)
    return doc_list, class_list

5.3 构建语料表(字典)

# 构建语料表
def create_vocabulary_list(doc_list):
    vocabulary_set = set([])
    for document in doc_list:
        vocabulary_set = vocabulary_set | set(document)
    return list(vocabulary_set)

5.4 构建训练集的特征向量

# 将一篇邮件转化为 类似 One-Hot 的向量,长度和 vocabulary_list 一样,为 1 的位置代表该单词在该邮件中出现了
def set_of_word2vector(vocabulary_list, document):
    vec = [0 for _ in range(len(vocabulary_list))]
    for word in document:
        index = vocabulary_list.index(word)
        if index >= 0:
            vec[index] = 1
    return vec
    
train_matrix = []
train_class = []
for train_index in train_index_set:
    train_matrix.append(set_of_word2vector(vocabulary_list, doc_list[train_index]))
    train_class.append(class_list[train_index])

5.5 朴素贝叶斯算法计算概率

回顾一下,我们用贝叶斯算法进行垃圾邮件分类时,其实就是比较 P ( h + ∣ D ) P(h_+|D) P(h+D) P ( h − ∣ D ) P(h_-|D) P(hD) 的大小,如果 P ( h + ∣ D ) P(h_+|D) P(h+D) 大,则表示该邮件更有可能是垃圾邮件,否则更有可能是正常邮件。

P ( h + ∣ D ) = P ( h + ) × P ( D ∣ h + ) ÷ P ( D ) P ( h − ∣ D ) = P ( h − ) × P ( D ∣ h − ) ÷ P ( D ) P(h_+|D)=P(h_+)×P(D|h_+)\\div P(D) \\\\ P(h_-|D)=P(h_-)×P(D|h_-)\\div P(D) P(h+D)=P(h+)×P(Dh+)÷P(D)P(hD)=P(h)×P(Dh)÷P(D)

又因为,在针对某封邮件做预测时, P ( D ) P(D) P(D) 可以看作常数,因而可以忽略,从而得到简化后的公式如下(其实下面式子写等号不严谨,应该是正比于,但是为了方便,后面都将正比于简化为等号):

P ( h + ∣ D ) = P ( h + ) × P ( D ∣ h + ) P ( h − ∣ D ) = P ( h − ) × P ( D ∣ h − ) P(h_+|D)=P(h_+)×P(D|h_+) \\\\ P(h_-|D)=P(h_-)×P(D|h_-) P(h+D)=P(h+)×P(Dh+)P(hD)=P(h)×P(Dh)

其中, P ( h + ) P(h_+) P(h+) 为训练集中垃圾邮件的比率, P ( h − ) P(h_-) P(h)为训练集中正常邮件的比率,它们两个就是先验概率。

显然, P ( h + ) + P ( h − ) = 1 P(h_+) + P(h_-) = 1 P(h+)+P(h)=1,因此,下面我们可以只计算 P ( h + ) P(h_+) P(h+),用变量 p_spam 表示, P ( h + ) P(h_+) P(h+) 可以根据训练集很轻易地得到

又因为朴素贝叶斯假设任意两个词之间是独立无关的,所以可以将 P ( D ∣ h + ) P(D|h_+) P(Dh+) P ( D ∣ h − ) P(D|h_-) P(Dh) 展开如下:

P ( D ∣ h + ) = P ( d 1 ∣ h + ) × P ( d 2 ∣ h + ) × . . . × P ( d n ∣ h + ) P ( D ∣ h − ) = P ( d 1 ∣ h − ) × P ( d 2 ∣ h − ) × . . . × P ( d n ∣ h − ) P(D|h_+) = P(d_1|h_+)×P(d_2|h_+)×...×P(d_n|h_+)\\\\ P(D|h_-) = P(d_1|h_-)×P(d_2|h_-)×...×P(d_n|h_-) P(Dh+)=P(d1h+)×P(d2h+)×...×P(dnh+)P(Dh)=P(d1h)×P(d2h)×...×P(dnh)

其中 d n d_n 查看详情

机器学习——朴素贝叶斯算法

机器学习——朴素贝叶斯算法贝叶斯定理正向概率和逆向概率条件概率与全概率贝叶斯公式推导极大似然估计朴素贝叶斯分类器朴素可能性函数的作用拉普拉斯修正防溢出策略样例解释代码——使用拉普拉斯进行垃圾邮件分类构... 查看详情

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值。是一种监督算法。广泛应用于垃圾邮件检测等等。1#_... 查看详情

从贝叶斯公式到垃圾邮件的识别

...圾邮件的一种方法",觉得很适合用来表述数学公式与机器学习之间的关系。涉及到机器学习的数学公式比较简单,概率论基础教程都会讲到。解决的问题也很典型:垃圾邮件的识别。防止垃圾邮件有很多种方法,最直观的一... 查看详情

机器学习入门-贝叶斯垃圾邮件过滤(原理)

贝叶斯里面的参数原理最大似然:即最符合观测数据的最有优势,即p(D|h)最大奥卡姆剃刀:即越常见的越有可能发生,即p(h)表示的是先验概率最大似然:当我们投掷一枚硬币,观测到的是正面,那么我们猜测投掷正面的概率为1... 查看详情

使用朴素贝叶斯算法简单实现垃圾邮件过滤

一、算法介绍朴素贝叶斯法,简称NB算法,是贝叶斯决策理论的一部分,是基于贝叶斯定理与特征条件独立假设的分类方法:首先理解两个概念:·先验概率是指根据以往经验和分析得到的概率,它往往作为“由因求果”问题中... 查看详情

361机器学习常见算法

K-近邻算法(KNearestNeighbors)参考:机器学习实战教程(一):K-近邻算法(史诗级干货长文)决策树算法(DecisionTree)参考:机器学习实战教程(二):决策树基础篇之让我们从相亲说起参考:机器学习实战教程(三):决策树... 查看详情

机器学习实战3:基于朴素贝叶斯实现单词拼写修正器(附python代码)

...2.2语言模型建模2.3误差模型建模3单词修正测试0写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量... 查看详情

机器学习线性回归——岭回归从贝叶斯角度理解(理论+图解+公式推导)

查看详情

机器学习之朴素贝叶斯算法

1贝叶斯定理的引入概率论中的经典条件概率公式:公式的理解为,P(X,Y)=P(Y,X)<=>P(X|Y)P(Y)=P(Y|X)P(X),即X和Y同时发生的概率与Y和X同时发生的概率一样。2朴素贝叶斯定理朴素贝叶斯的经典应用是对垃圾邮件... 查看详情

实现|朴素贝叶斯模型算法研究与实例分析(代码片段)

...分析(白宁超2018年9月4日09:03:21)导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果。所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概... 查看详情

朴素贝叶斯算法

...出箱子里的球的个数。贝叶斯算法是一种基于概率统计的机器学习算法,它会计算出每种情况发生的概率,然后对其进行分类,贝叶斯算法经常用于文本分类问题和垃圾邮件过滤问题。假设有一篇新闻报道newsreport,我们使用贝... 查看详情

如何用java利用贝叶斯算法实现垃圾邮件过滤

参考技术A这个问题很有挑战性,做看其他大佬回答 查看详情

关于机器学习中贝叶斯决策的相关讨论

前言   贝叶斯决策可能在相关机器学习或数据挖掘或专家系统中有着广泛的应用,故其地位也相当重要;比如在垃圾邮件的过滤、钓鱼邮件的判定、垃圾(钓鱼)短信过滤等场合的应用就相当多(因为笔者较多地从事... 查看详情

spark机器学习:朴素贝叶斯算法

1.贝叶斯定理条件概率公式:这个公式非常简单,就是计算在B发生的情况下,A发生的概率。但是很多时候,我们很容易知道P(A|B),需要计算的是P(B|A),这时就要用到贝叶斯定理:2.朴素贝叶斯分类朴素贝叶斯分类的推导过程就不... 查看详情

利用朴素贝叶斯(naviebayes)进行垃圾邮件分类

...公式描写叙述的是一组条件概率之间相互转化的关系。在机器学习中。贝叶斯公式能够应用在分类问题上。这篇文章是基于自己的学习所整理。并利用一个垃圾邮件分类的样例来加深对于理论的理解。这里我们来解释一下朴素这... 查看详情

atitti文本分类 以及垃圾邮件判断原理以及贝叶斯算法的应用解决方案

 Atitti文本分类 以及垃圾邮件判断原理以及贝叶斯算法的应用解决方案 1.1.七、什么是贝叶斯过滤器?11.2.八、建立历史资料库21.3.十、联合概率的计算31.4.十一、最终的计算公式31.5.。这时我们还需要一个用于比较的门... 查看详情

机器学习实战三(naivebayes)

机器学习实战三(NaiveBayes)前两章的两种分类算法,是确定的分类器,但是有时会产生一些错误的分类结果,这时可以要求分类器给出一个最优的猜测结果,估计概率。朴素贝叶斯就是其中一种。学过概率论的人对于贝叶斯这... 查看详情