jjzjj

概率还不会的快看过来《统计学习方法》——第四章、朴素贝叶斯法

王者与CV 2024-01-06 原文

作者简介:整个建筑最重要的是地基,地基不稳,地动山摇。而学技术更要扎稳基础,关注我,带你稳扎每一板块邻域的基础。
博客主页:七归的博客
收录专栏:《统计学习方法》第二版——个人笔记
南来的北往的,走过路过千万别错过,错过本篇,“精彩”可能与您失之交臂 la
Triple attack(三连击):Comment,Like and Collect—>Attention

文章目录

简介

  • 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的分类方法。对于给定训练数据集,首先基于特征条件独立性假设学习输入和输出的联合概率分布;然后基于此模型,对给定的输入新实例x,利用贝叶斯定理求出最大的后验概率输出y。

  • 朴素贝叶斯不会直接学习输入和输出的联合概率分布,而是通过学习类的先验概率和类条件概率来完成。

  • 朴素贝叶斯法包括朴素贝叶斯法的学习与分类、朴素贝叶斯法的参数估计算法。

1、全概率公式与贝叶斯定理

  • 概率:事件X发生的可能性就被称为X发生的概率,用~P(X)来表示
  • 先验概率:通过经验来判断事件发生的概率,或当这个概率分布在进行现场试验或者抽样前就已确定
  • 后验概率:在已知结果的前提下,推测其造成的原因的概率
  • 条件概率:当事件Y已经发生的时候,事件X发生的可能性,称为在Y条件下X发生的条件概率,用~P(X|Y)表示

先验概率分布:
P ( Y = c k ) , k = 1 , 2 , . . . , k P(Y=c_{k}),k=1,2,...,k P(Y=ck)k=12...k
条件概率分布:
P ( X = x ∣ Y = c k ) = P ( X 1 = x 1 , . . . , X n = x n ∣ Y = c k ) , k = 1 , 2 , . . . , k P(X=x|Y=c_{k})=P(X^{1}=x^{1},...,X^{n}=x^{n}|Y=c_{k}),k=1,2,...,k P(X=xY=ck)=P(X1=x1,...,Xn=xnY=ck),k=1,2,...,k

  • 全概率公式:
    P(X) =P(Y1) x P(X | Y1) x P(Y2) x P(X | Y2) x…x P(Yn) x P(X | Yn)
  • 贝叶斯定理:
    p ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) p(Y=c_{k}|X=x)=\frac{P(X=x|Y=c_{k})P(Y=c_{k})}{\sum_{k}^{}P(X=x|Y=c_{k})P(Y=c_{k})} p(Y=ckX=x)=kP(X=xY=ck)P(Y=ck)P(X=xY=ck)P(Y=ck)

区分

2、朴素贝叶斯理论

  • 朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y),也就是说,通过学习类先验概率分布和类条件概率分布来实现。
  • 朴素贝叶斯法对条件概率分布作了条件独立性的假设。其名字来源于贝叶斯定理和一个朴素的假设:所有特征的条件都相互独立于其他给定的响应变量,即特征的条件独立性假设。

条件独立性假设:
P ( X = x ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X=x|Y=c_{k})=\prod_{j=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_{k}) P(X=xY=ck)=j=1nP(X(j)=x(j)Y=ck)

  • 朴素贝叶斯法实际上学习到生成数据的机制,所以属于生成型。条件独立假设等于说明用于分类的特征在类确定的条件下都是条件独立的,该假设使得朴素贝叶斯的学习成为可能。

  • 虽然这一假设使得朴素贝叶斯法变得简单,但难免也会牺牲一定的分类准确率。

  • 朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布 P ( Y = c k ∣ X = x ) P(Y=c_{k}|X=x) P(Y=ckX=x),将后验概率最大的类作为x的类输出。

朴素贝叶斯分类器:
y = f ( x ) = a r g m a x P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y=f(x)=argmax\frac{P(Y=c_{k})\prod_{j}^{}P(X^{(j)}=x^{(j)}|Y=c_{k})}{\sum_{k}^{}P(Y=c_{k})\prod_{j}^{}P(X^{(j)}=x^{(j)}|Y=c_{k})} y=f(x)=argmaxkP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=ck)jP(X(j)=x(j)Y=ck)
分母对所有 c k c_{k} ck都相同:
y = a r g m a x P ( Y = c k ) ∏ j P ( X j = x j ∣ Y = c k ) y=arg maxP(Y=c_{k})\prod_{j}^{}P(X^{j}=x^{j}|Y=c_{k}) y=argmaxP(Y=ck)jP(Xj=xjY=ck)

  • 求X用全概率公式,求Y用贝叶斯定理

  • 朴素贝叶斯的基本方法:在统计数据的基础上,依据条件概率公式,计算当前特征的样本属于某个分类的概率,选最大的概率分类

  • 该模型被称之为朴素是因为它假设对响应变量来说所有的特征都条件独立,但该假设不等同于所有的特征相互独立。

import numpy as np

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])

from sklearn.naive_bayes import GaussianNB

clf = GaussianNB()

# 拟合数据
clf.fit(X, Y)
print("==[-0.8, -1]预测结果==")
print(clf.predict([[-0.8, -1]]))
print("==[3,2]预测结果==")
print(clf.predict([[3, 2]]))

3、贝叶斯决策理论方法

  • 在分类问题中,我们会将未知标签的数据集特征与我们已知标签的特征进行比较。朴素贝叶斯,就是这样一种比较的方法。

基本思想

  • 1、已知类条件概率密度参数表达式和先验概率
  • 2、利用贝叶斯公式转换成后验概率
  • 3、根据后验概率大小进行决策分类

4、朴素贝叶斯分类器实战

  • 朴素⻉叶斯分类最适合的场景就是文本分类、情感分析和垃圾邮件识别。其中情感分析和垃圾 邮件识别都是通过⽂本来进⾏判断。

  • 从这⾥你能看出来,这三个场景本质上都是文本分类,这 也是朴素⻉叶斯最擅⻓的地⽅。所以朴素⻉叶斯也常⽤于⾃然语⾔处理 NLP 的⼯具。

  • sklearn 机器学习包 sklearn 的全称叫 Scikit-learn,它给我们提供了 3 个朴素⻉叶斯分类算法,分别是⾼斯朴 素⻉叶斯(GaussianNB)、多项式朴素⻉叶斯(MultinomialNB)和伯努利朴素⻉叶斯 (BernoulliNB),它们的区别在于特征向量x的分布情况。

根据算法的特征类型将其分成两类。

  • 连续:这意味着最终的标签为实值(可以存在小数)
  • 离散:这以为着最终的结果为分类的类别值(只能为整数)

5、贝叶斯分类算法

  • 贝叶斯分类算法是基于贝叶斯定理和特征条件独立假设的分类方法。

这三种算法适合应⽤在不同的场景下,我们应该根据特征变量的不同选择不同的算法:

高斯朴素贝叶斯
  • 高斯朴素贝叶斯(连续):特征变量是连续变量,符合高斯分布
    • 比如说⼈的身高,物体的长度。
#导入相应的包
import numpy as np
#导入高斯模型
from sklearn.naive_bayes import GaussianNB

#样本X包含三个特征,分别是Red的百分比,Green的百分比,Blue的百分比
#每个特征的值都是(0,1)之间的小数

#首先我们创建一个训练集
X = np.array([[0.5, 0, 0.5], [1, 1, 0], [0, 0, 0]])
#给定我们训练集的分类标签
y = np.array(['Purple', 'Yellow', 'Black'])

#运用高斯模型去训练数据
clf = GaussianNB()
#训练数据集
clf.fit(X, y)

#下面我们运用我们的模型进行测试
#比如我们试一下,red 0.5,green 0.5,blue 0.5
print(clf.predict([[0.5, 0.5, 0.5]]))
多项式朴素贝叶斯
  • 多项式朴素贝叶斯(离散):特征变量是离散变量,符合多项分布,当特征都是分类型特征时,可使用多项式模型。多项分布描述了在样本标签中的概率分布。
  • 可用它来计算特征中分类的出现频率。特别的是,当特征只有两种的时候,将会使用多项式模型中的伯努利模型。
    • 在文档分类中特征变量体现在 ⼀个单词出现的次数
    • 或者是单词的 TF-IDF 值等。
#导入相关的包
import numpy as np
#导入多项式模型
from sklearn.naive_bayes import MultinomialNB

#我们使用文章最开始的水果的数据集作为示例
#水果数据集的样本X具有三个特征[Size, Weight, Color]
#每个特征共有三种分类
#由于python不能直接识别文字
#所以将这个三个特征的不同分类重新编码如下
# Size: 0 = Small, 1 = Moderate, 2 = Large
# Weight: 0 = Light, 1 = Moderate, 2 = Heavy
# Color: 0 = Red, 1 = Blue, 2 = Brown

#用编码好的数据创建训练集
X = np.array([[1, 1, 0], [0, 0, 1], [2, 2, 2]])
#给训练集的数据创建标签
y = np.array(['Apple', 'Blueberry', 'Coconut'])

#运用多项式模型训练数据
clf = MultinomialNB()
#训练水果数据集
clf.fit(X, y)

#预测数据集
#比如我们试一下 size = 1,weight = 2,color = 0
print(clf.predict([[1, 2, 0]]))
伯努利朴素贝叶斯
  • 伯努利朴素贝叶斯(离散):特征变量是布尔变量,符合 0/1 分布,通常来说就是二分类标签。上文中提到,当特征只有两种的时候,我们可以使用伯努利模型。
  • 与多项式模型不同,在这里只计算一个特征是否发生。
    • 比如,本页面是否存在【多项式】这三个字,答案只有两种,存在or不存在。
    • 伯努利模型的条件概率计算方法与多项式模型一致。 在文档分类中特征是单词是否出现。
#导入包
import numpy as np
#导入伯努利模型
from sklearn.naive_bayes import BernoulliNB

#数据集X的特征有三个,分别是
# Walks like a duck
# Talks like a duck
# Is small]
#这三个特征分别有两种分布,是or否
# Walks like a duck: 0 = False, 1 = True
# Talks like a duck: 0 = False, 1 = True
# Is small: 0 = False, 1 = True

#创建训练集
X = np.array([[1, 1, 0], [0, 0, 1], [1, 0, 0]])
#给训练集创建标签
#是鸭子or不是鸭子
y = np.array(['Duck', 'Not a Duck', 'Not a Duck'])

#使用伯努利模型训练数据
clf = BernoulliNB()
#训练数据集
clf.fit(X, y)

#预测数据集
#比如我们试一下 三个特征都为true的时候,到底是不是鸭子
print( clf.predict([[1, 1, 1]]))

有关概率还不会的快看过来《统计学习方法》——第四章、朴素贝叶斯法的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  9. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐