草庐IT

sklearn学习之朴素贝叶斯分类

托尔金的昨日幻想 2023-09-27 原文

学习目标

  • 说明条件概率与联合概率
  • 说明贝叶斯公式及特征独立的关系
  • 记忆贝叶斯公式
  • 使用贝叶斯对鸢尾花数据进行分类
    %-------------------------------------------------------------------------------------------------------


    2.png

1、概率定义

  • 条件概率:所考虑的事件A已发生的条件下事件B发生的概率p(B|A)
    • 我们能根据今天的天气去预测明天的天气,其实隐含的条件就
      是在知道今天的天气情况下去预测明天的天气的概率
  • 联合概率:包含多个条件,且所有的条件同时成立的概率
  • 相互独立:如果,则称事件A,B相互独立。

2、案例:判断女神对你的喜欢情况

3.png
  • 问题如下:
    • 1、女神喜欢的概率?
    • 2、职业是程序员并且体型匀称的概率?
    • 3、在女神喜欢的条件下,职业是程序员的概率?
    • 4、在女神喜欢的条件下,职业是程序员,体重超重的概率?
  • 计算结果
p(喜欢) = 4/7 (先验概率)
p(程序员,匀称) = 1/7(联合概率)
p(程序员|喜欢) = 2/4 = 1/2(条件概率)
p(程序员,超重|喜欢) = 1/4
  • 思考:在小明是产品经理并且体重超重的情况下,如何计算小明被女神
    喜欢的概率?
    即:p(喜欢|产品,超重) = ?

3、贝叶斯公式

3、1 公式介绍

3.2 案例计算

那么思考题可以套用贝叶斯公式来解决:

p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重)

上式中,

  • p(产品,超重|喜欢)和p(产品,超重)的结果均为0,导致无法计算结
    果,原因是我们的样本太少了,不具备代表性;
  • 现实中,肯定存在产品经理是超重的人的,故p(产品,超重)不可能
    为0;
  • 事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的
    事件,但是根据我们的有限的样本计算“p(产品,超重)= p(产品)p(超重)”不成立。
    而朴素贝叶斯可以解决这个问题。
  • 朴素贝叶斯,简单理解,就是假定了特征与特征之间相互独立的贝
    叶斯公式;
  • 即,朴素贝叶斯,之所以朴素,就在于特征之间相互独立。
    按照朴素贝叶斯思路来计算,就可以是
p(产品,超重) = p(产品)p(超重) = 2/7*3/7 = 6/49
p(产品,超重|喜欢) = p(产品|喜欢)*p(超重|喜欢) = 1/2*1/4 = 1/8
p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重) 
 = 1/8*4/7 /6/49 = 7/12

3.3文本分类计算

需求:通过前面4个训练样本,判断第五篇文章,是否属于china类


4.png
  • 公式运用

    公式分成三个部分:
    • :每个文档类别的概率(= 某类文档的特征个数/总文档特征数)
    • :给定类别下特征(该类别文档中出现的
      词)的概率,计算方法:
      • 在C类中出现的次数
      • 为C类中所有词出现的次数
    • 预测文档中每个词的概率
      计算出结果并进行比较,所以
      我们只需计算分子的大小就可以得出哪个概率大
p(C|chinese,chinese,chinese,Tokyo,Japan) --->
p(chinese,chinese,chinese,Tokyo,Japan|C) *p(C) /p(chinese,chinese,chinese,Tokyo,Japan)
= p(chinese|C)^3*p(Tokyo|C)*p(Japan|C) *p(C) / p(chinese)^3*p(Tokyo)*p(Japan)

# 首先计算是China类的文章
p(chinese|C) = 5/8
p(Tokyo|C) = 0/8
p(Japan|C) = 0/8

# 接着计算不是china类的文章
p(chinese|C) = 1/3
p(Tokyo|C) = 1/3
p(Japan|C) = 1/3

问题:从上面计算中发现,p(Tokyo|C) = 0 和 p(Japan|C) = 0,这是不
合理的。仍然是样本太少造成的,如果词频列表中有很多的话,可以避
免。
解决方法: 拉普拉斯平滑系数

  • 为指定的系数,一般为1
  • m 为训练文档中统计出的特征词个数
# 首先计算是China类的文章
p(chinese|C) = 5/8--->6/14
p(Tokyo|C) = 0/8--->1/14
p(Japan|C) = 0/8--->1/14

# 接着计算不是china类的文章
p(chinese|C) = 1/3--->2/9
p(Tokyo|C) = 1/3--->2/9
p(Japan|C) = 1/3--->2/9

4、认识朴素贝叶斯分类器API

4.1 种类

sklearn 给我们提供了 3 个朴素贝叶斯分类算法,分别是

  • 高斯朴素贝叶斯(GaussianNB)
  • 多项式朴素贝叶斯(MultinomialNB)
  • 伯努利朴素贝叶斯(BernoulliNB)

4.2 应用

特征:

  • 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度;
    class sklearn.naive_bayes.GaussianNB(priors=None)
    
    • : 先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法),。其中为训练集样本总数量,为输出为第类别的训练集样本数。
    • 对象:
      • :每个样本的概率
      • :每个类别的样本数量
      • :每个类别中每个特征的均值
      • :每个类别中每个特征的方差
  • 多项式朴素贝叶斯:特征变量是离散变量,符合多项分布;
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
  • :先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑。

  • :是否去学习类的先验概率,默认是True

  • :各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

  • 对象

  • :每个类别平滑后的先验概率

  • :是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同

  • :给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+)/(指定类下所有特征出现次数之和+类的可能取值个数*

  • : 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同

  • : 训练样本中各类别对应的样本数

  • : 每个类别中各个特征出现的次数

  • 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现
sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
  • :平滑因子,与多项式中的一致。
  • :样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
  • :是否去学习类的先验概率,默认是True
  • :各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

对象

  • :每个类别平滑后的先验对数概率。
  • :给定特征类别的经验对数概率。
  • :拟合过程中每个样本的数量。
  • :拟合过程中每个特征的数量。

方法
贝叶斯的方法和其他模型的方法一致。

  • :在数据集(X,Y)上拟合模型。
  • :对数据集X进行预测。
  • :对数据集X预测,得到每个类别的概率对数值。
  • :对数据集X预测,得到每个类别的概率。
  • :得到模型在数据集(X,Y)的得分情况。

5、鸢尾花数据分类

#导入所需要的包
from sklearn.naive_bayes import GaussianNB
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from matplotlib.colors import ListedColormap
%matplotlib inline
#导入函数
muNB = GaussianNB()
#读取数据
iris = load_iris()
#取出数据中的data
data = iris.data
#取出数据中的target
target = iris.target
#取data中所有行前两列为训练数据
samples = data[:,:2]
#训练数据
muNB.fit(samples,target)
#取出训练数据中第一列中的最大与最小值
xmin,xmax = samples[:,0].min(),samples[:,0].max()
#取出训练数据中第二列中的最大与最小值
ymin,ymax = samples[:,1].min(),samples[:,1].max()
#在最大与最小值的区间分成300个数据
x = np.linspace(xmin,xmax,300)
y = np.linspace(ymin,ymax,300)
#然后使这些数据组成一个平面
xx,yy = np.meshgrid(x,y)
#生成90000个坐标点
X_test = np.c_[xx.ravel(),yy.ravel()]
#预测训练数据
y_ = muNB.predict(X_test)
#导入三种不同的颜色
colormap = ListedColormap(['#00aaff','#aa00ff','#ffaa00'])
#生成三个不同颜色的模块,第一列为x轴坐标,第二列为y轴坐标,预测之后,不同的点分成不同的三类

plt.scatter(X_test[:,0],X_test[:,1],c=y_)
3.png
#生成训练数据生成的点的分布,c=target意思是根据target的值,生成不同的颜色的点
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)
4.png
#一起调用的话使两张图结合起来
plt.scatter(X_test[:,0],X_test[:,1],c=y_)
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)
5.png

有关sklearn学习之朴素贝叶斯分类的更多相关文章

  1. ruby-on-rails - 带有分类器 gem 的无效编码符号 - 2

    当我将项目添加到我的Postgres数据库时,一切似乎都运行良好。在不做任何更改的情况下,只要在我的应用程序中的任何位置启动Madeleine,我的Rails应用程序就会开始失败:EncodingErrorinEventsController#updateinvalidencodingsymbolapp/controllers/events_controller.rb:137:in`update'137是问题行:135defupdate136@event=Event.find(params[:id])137m=SnapshotMadeleine.new("bayes_data")...

  2. ruby - 贝叶斯分类器分数代表什么? - 2

    我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st

  3. 嵌入式学习之QT学习----3 制作简单的QT界面(如:QQ登录界面) - 2

    1、创建一个QT工程newproject—>Application—>QtWidgetsApplication—>choose…(注意不要有中文路径)填写名称(我写的名称为class2)和创建路径(D:\qt\qt_demo\class2)—>填写类名,这里基类要选择“QWidget”,这样一个QT工程就创建好啦。qt的移植性非常强,一套代码我们不用修改太多,直接通用所有的平台。说明:QMainWindow:主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口。QWidget:它是所有具有可视界面的基类,选择QWidget创建的界面对各种界面组件都可以支持。QDialog

  4. ruby - 在 Ruby 中实现贝叶斯分类器? - 2

    我想实现一个简单的贝叶斯分类系统来对短信进行基本的情感分析。欢迎提供在Ruby中实现的实用建议。也欢迎提出除贝叶斯之外的其他方法的建议。 最佳答案 IlyaGrigorik在BayesianClassifiers上的这篇博文中对这个问题给出了很好的答案。此外,您不妨看看ai4rrubygem用于贝叶斯分类器的一些替代方法。ID3是一个不错的选择,因为它提供了即使对机器学习技术没有任何真正了解的人也能“理解”的决策树。 关于ruby-在Ruby中实现贝叶斯分类器?,我们在StackOver

  5. javascript - 多种分类的 Backbone.js 集合 - 2

    我有一个包含名称和日期的待办事项列表。我希望能够使用标题或日期对列表进行排序。我该怎么做?比较器只允许一种类型的排序。谢谢。 最佳答案 可以在比较器中实现更多逻辑,以便您可以抽象出一些排序逻辑:varCollection=Backbone.Collection.extend({model:myModel,order:'name'comparator:function(model){if(this.order==='name'){returnmodel.get('name');}else{returnmodel.get('date')

  6. javascript - 使用分类 ("active"鼠标悬停时 D3 颜色变化,真) - 2

    我是js和D3的新手。我已经生成了各种热图,并想使用D3的on.mouseover更改图block的颜色。我可以显式更改颜色,但想使用CSS事件规则。可能很容易修复。任何帮助将不胜感激。完整代码如下。谢谢。MJ-HeatmapCountryByDistrict_Port_NmeHeatmapbody{font:10pxsans-serif;}.label{font-weight:bold;}.tile{shape-rendering:crispEdges;}.axispath,.axisline{fill:none;stroke:#000;shape-rendering:crispEd

  7. B44 - 基于stm32蓝牙智能语音识别分类播报垃圾桶 - 2

    文章目录任务效果原理图指令编码语音识别模块简介代码设计驱动舵机模块简介驱动主程序源代码任务题目:基于stm32蓝牙智能语音识别分类播报垃圾桶实现功能如下:语音识别根据使用者发出的指令自动对垃圾进行分类根据垃圾的种类实时播报垃圾的类型根据垃圾种类驱动对应的舵机进行转动(模拟垃圾桶打开,并在十秒钟自动复位,模拟垃圾桶关闭)OLED显示屏实时显示四种垃圾桶的状态蓝牙app可以控制垃圾桶开关,同时显示四种垃圾桶状态效果原理图指令编码语音识别模块简介LU-ASR01是一款低成本、低功耗、体积小、高性能的离线语音识别系统。本系统集成了语音识别、语音回复、IO控制(多信号输出)、串口输出、温湿度广播等功能。

  8. javascript - 分支图、生命之树、分支学、JS 或 Canvas 中的分类法? - 2

    好人——我需要一些帮助来找到创建交互式分支图或系统发育树的方法(是的,我已经阅读了所有相关帖子,但没有找到我要找的东西)。问题是,我需要节点可以命名。一个例子是这样的我发现的大多数脚本要么是applets、flash,要么根本不显示节点分类,即在本例中它会跳过“feliformia”。这对我没用,因为我最终会得到食肉动物-匿名节点-匿名节点-匿名节点-老虎,这并不好。这棵树在理论上将覆盖所有生命,因此它可以变得相当大,并从数据库中获取英文和拉丁文的链接和名称。所以:没有Flash,没有小程序。它必须是水平的,没有super树(圆形)。我经历过这个http://bioinfo.unice

  9. javascript - plotly.js 中的分类轴顺序 - 2

    我有一个plotly.js条形图,我试图让分类轴的顺序正确。每个类别都有一个条形图,但有时它们是绿色的,有时它们是黄色的。条形图应按从高到低的顺序排列,但实际上似乎是根据不同的填充量对它们进行排序。数据:vardata=[{"marker":{"color":"#006666"},"x":["A:0122","A:0121","A:0434","A:0838","A:0083","A:0081","A:0687"],"y":[1246.0,1096.0,1000.0,200.0,0.0,0.0,0.0],"name":"Green","type":"bar"},{"marker":{"

  10. javascript - d3js 平行坐标分类数据 - 2

    我正在寻找一种将分类数据添加到d3js平行坐标的方法。D3js对我来说是新手,我能理解一些正在做的事情,但还没有想出这样做的方法。平行集不是一个好的选择,因为我的大部分数据都是连续的。如果您想到汽车示例,我希望能够按轴上的品牌进行过滤(例如,过滤以便仅显示福特的数据)。我假设需要一个变量来定义每辆车(例如Peugeot、Ford、BMW、Audi等...)这是汽车的例子。http://bl.ocks.org/1341281感谢所有回复的人。 最佳答案 实际上,您只需要一个序数标度!轴将处理其余部分。检查一下here.基本上我改变了:

随机推荐