您现在的位置是:首页 > 正文

朴素贝叶斯算法

2024-02-01 04:01:38阅读 6

机器学习(六)朴素贝叶斯算法

一.算法介绍

读过大学本科的,在学习《概率论和数理统计》中,一定学过两个公式:全概率公式,贝叶斯公式。我们这里要涉及朴素贝叶斯算法,就是基于这两个公式。这两个概率又都和条件概率密不可分。我们现在就把这三个公式列出来:

条件概率公式

全概率公式:

在这里插入图片描述

其中A1,A2,A3……An 相互独立

贝叶斯公式:

在这里插入图片描述

其中:事件Bi的概率为P(Bi),事件Bi已发生条件下事件A的概率为P(A│Bi),事件A发生条件下事件Bi的概率为P(Bi│A)。

那么,假设B最多只有两个,且B1,B2相互独立,就有:P(B1,B2|A) = P(B1|A)*P(B2|A)

所谓朴素贝叶斯算法当中的”朴素“:就是指相互独立,因此可以说,在我们本科阶段学的贝叶斯公式,其实就是朴素贝叶斯公式。

二.朴素贝叶斯算法在文档分类中的应用

朴素贝叶斯公式常用于文档分类。那么基于上述理论,我们可以逐渐进行推导。

我们假设,有这么一大批文档。给定了文档的各个特征值W(如各个词的频数统计等),C为文档类别,假设,所提供的这些文章全都相互没有关联。那么我们可以构建许多的条件概率:

P(文档类别1|文档特征值),记作:P(C1|W)

P(文档类别2|文档特征值),记作:P(C2|W)


P(文档类别n|文档特征值),记作:P(Cn|W)

于是,我们可以得到如下公式:

在这里插入图片描述

举一个例子。现在,我们有这样一个统计数据:

在这里插入图片描述

现在呢,我们得到了一个文档,出现了”影院“,”支付宝“,”云计算“这三个关键字,那么,他属于科技类分账的概率是多少?它属于娱乐类文章的概率又是多少呢?

我们将公式带入:

P(科技|影院,支付宝,云计算) = P(影院,支付宝,云计算|科技) * P(科技) = P(影院|科技) *P(支付宝|科技)*P(云计算|科技) * P(科技) = (8/100)*(20/100)*(63/100)*(30/90)

P(娱乐|影院,支付宝,云计算) = P(影院,支付宝,云计算|娱乐) * P(娱乐) = P(影院|娱乐) *P(支付宝|娱乐)*P(云计算|娱乐) * P(娱乐) = (56/121)*(15/121)*(0/121)*(60/90) = 0

那么,关于第二个问,很显然,在实际运用当中,一定是有概率为娱乐类文章的,不可能概率为0, 为了避免这个误判,引入了一个概念——拉普拉斯平滑系数(我们暂且记作L),一般情况下,L取1,引入了L= 1,第二个公式就成了:

P(娱乐|影院,支付宝,云计算) = P(影院,支付宝,云计算|娱乐) * P(娱乐) = P(影院|娱乐) *P(支付宝|娱乐)*P(云计算|娱乐) * P(娱乐) = ((56+L)/(121+L*4))*((15+L)/(121+L/4))((0+L)/(121+L*4))*(60/90) = 0.001

三.相关运用

3.1 API介绍

虽然,上面写了这么多,但实际中用sklearn的时候,并不需要直到上面这些底层原理,sklearn为我们提供了相关的API:

sklearn.naive_bayes

相关方法:

sklearn.naive_bayes.MultinomialNB(alpha = 1.0) #朴素贝叶斯分类,其中alpha:拉普拉斯平滑系数

3.2 案例

在sklearn当中,有一个数据集:fetch_20newsgroups,这当中有20个类型的新闻分类,20个主题,18000个新闻帖子。现在呢,出现了一个新闻稿,那么他成为这20个类的新闻的概率,分别是多少呢?预测一下

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split

"""
文章分类,不可避免的要涉及特征抽取
"""

def naviebayes():
    """
    朴素贝叶斯进行文本分类
    :return: None
    """
    news = fetch_20newsgroups(subset='all')

    # 进行数据分割,测试数据选25%即可
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

    # 对数据集进行特征抽取
    tf = TfidfVectorizer()

    # 以训练集当中的词的列表进行每篇文章重要性统计
    x_train = tf.fit_transform(x_train)

    print(tf.get_feature_names())

    x_test = tf.transform(x_test)

    # 进行朴素贝叶斯算法的预测
    mlt = MultinomialNB(alpha=1.0)

    print(x_train.toarray())

    mlt.fit(x_train, y_train)

    y_predict = mlt.predict(x_test)

    print("预测的文章类别为:", y_predict)

    # 得出准确率
    print("准确率为:", mlt.score(x_test, y_test))

    return None

if __name__ == "__main__":
    naviebayes()

四.总结

朴素贝叶斯算法有如下特点:

  • 优点:

    • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
    • 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
    • 分类准确度高,速度快
  • 缺点:

    需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验
    模型的原因导致预测效果不佳。

网站文章

  • python 日志打印

    python 日志打印

    参考文章python loggin 教程简单样例# 保存日志到文件 example.log ,日志级别 DEBUGlogging.basicConfig(filename='example.log'...

    2024-02-01 04:01:31
  • 错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    网站对接支付宝网站支付时提示验签出错 测试时是可以支付的,换了个应用提示以上错误,并不是我们的公、私钥有误,而是传输过程中出现了编码转换, 解决方法:再发起订单支付的controller注解加上以下内...

    2024-02-01 04:01:02
  • 怎么从融云服务器端发送消息,融云开发者文档

    # 什么是 targetId ?说明: targetId 为目标 id,senderUserId 为发送方 id举例: user1 为发送方,user2 为接收方,对应 targetId 值如下:us...

    2024-02-01 04:00:56
  • lodop打印控件的使用

    web打印解决方案1.生成打印模版(网页),使用window.print()预览打印模版,在浏览器中打印2.导出网页为excel文件,详见网页导出为excel3.使用lodop打印控件第一种方法和第二种方法,只能满足预先定义好打印模版得打印;且第一种直接打印网页得方法,用户无法修改打印模版,只能开发人员修改;第二种方法,用户可以在e...

    2024-02-01 04:00:49
  • 最大IO和最小IO,条带优劣

    最大IO和最小IO,条带优劣

    本文摘自: Oracle最大IO取决于连续的IO有多大,当然还有OS的限制。 比如下图: 条带大小为512KB,数据以512KB为单位分割到多块磁盘中。如果区大小为1MB,虽然这1MB对数据库来说是连续的,但是在ASM的dg中,将被分散到4块盘中,此时最大的连续数据不会超过512KB,因此最大IO也不会超过512kB. ...

    2024-02-01 04:00:21
  • Golang 学习二十(反射)

    Golang 学习二十(反射)

    文章目录1. reflect2. ValueOf3. Value.Set4. 结构体反射5. 函数反射6. 方法反射变量 ---> 一个值,一个类型,值类型数组 ---> 相同类型,多个值,长度固定,...

    2024-02-01 04:00:15
  • 【系统性学习】《Mysql基础》【Mysql触发器 新建触发器、修改触发器、删除触发器、举例】 编程入门 学习分享 【公开免费】 热门推荐

    新建触发器: 格式:create trigger 数据库名.触发器名称 触发时刻 insert on 表名 for each........

    2024-02-01 04:00:08
  • Redis 分布式锁如何实现自动续期

    Redis 分布式锁如何实现自动续期

    如果锁当前还是被占用的,那么等待释放锁的消息,具体实现使用了信号量 Semaphore 来阻塞线程,当锁释放并发布释放锁的消息后,信号量的 release() 方法会被调用,此时被信号量阻塞的等待队列...

    2024-02-01 04:00:01
  • C. Palindromic Matrix

    http://codeforces.com/contest/1118/problem/C 题意:给n(0-20),和n*n数组,构造n*n回文数组,行和列调换不变 思路:n为偶时,必然每个数时4的倍数;奇时个数为奇数的一个是最中间,中间行和列两两构造,剩下的四个四个构造; #include<algorithm> #include<set> #include<...

    2024-02-01 03:59:33
  • Windows上利用Python自动切换代理IP的终极方案!

    Windows上利用Python自动切换代理IP的终极方案!

    声明下:不同于网络上千百篇方法,下文是经过各种严格测试都通过的,同时也是一个实验的过程,排除了各种不靠谱的方法。有需要的可以评论来讨论,想要源码和相关参考文献或笔记的,也可以找我。 思路及启发 先说一下我这一路实验的思路吧,这个至关重要。 之前一直在用Python做爬虫抓取数据,发现本机IP的问题不解决,爬虫相当于白费了。然后各种百度,不...

    2024-02-01 03:59:25