草庐IT

朴素贝叶斯分类

归去_来兮 2023-03-28 原文

一、朴素贝叶斯法原理

1.基本原理

  朴素贝叶斯法(Naive Bayes)是一种基础分类算法,它的核心是贝叶斯定理+条件独立性假设。贝叶斯定理描述的是两个条件概率之间的关系,对两个事件A和B,由乘法法则易知$$P(A∩B)=P(A)P(B│A)=P(B)P(A│B)$$
  贝叶斯定理就是对这个关系式的变形,即

\[P(B│A)=\frac{P(B)P(A|B)}{P(A)} \]

  若把样本特征和类别作为对应的条件和条件概率,则贝叶斯定理可以用来解决分类问题。如对样本\(x=\left( x_1,x_2,...,x_n \right)\),所属类别为\(y\),那么该特征下对应该类别的概率代入贝叶斯公式就是$$P(y|x_1,x_2,...,x_n)=\frac{P(y)P(x_1,x_2,...,x_n|y)}{P(x_1,x_2,...,x_n)}$$
  贝叶斯分类法的思想就是计算样本特征对应于各类别的概率,以概率最大的作为分类输出。分母部分是特征的联合概率,可以进一步由全概率公式展开;分子部分由于含复杂的条件概率,使得直接的计算较复杂,因此这里做一个条件独立性假设,即认为样本的各维特征间是相互独立的,这是一个较强的假设,朴素贝叶斯也由此得名。在该条件之下,分子便可化为$$P(y)\prod_{i=1}^{n}P(x_i|y)$$
  注意到,在用于分类决策时,分母部分的值对于所有的类别都是相同的,要找出最大概率对应的类别,只考察分子即可。因此,朴素贝叶斯分类器表示为$$\hat{y}=\arg max_{y_k}{P(y_k)\prod_{i=1}^{n}P(x_i|y_k)}$$

2.平滑处理

  在离散特征的情形之下进行分类输出的概率计算,可能会出现概率为0的情况,如随机变量观测值的某一维并未在训练集中出现,那么它所属的条件概率为0,致使对应类别的后验概率为0,从而使分类产生偏差,这是不合理的,因此需进行一定的平滑处理。具体,就是在频率计算时,对每组统计的频数加上一个常数。
先验概率:\(P(y_k)=\frac{\sum_{i=1}^{N}{I(y_i=y_k)+\lambda}}{N+K\lambda}\)
条件概率:\(P(x_i|y_k)=\frac{\sum_{i=1}^{N}{I(x_i,y_i=y_k)+\lambda}}{\sum_{i=1}^{N}{I(y_i=y_k)+S\lambda}}\)
  当\(\lambda=1\)时,称为拉普拉斯平滑(Laplace smoothing)。

3.三个基本模型

  根据特征随机变量的类型,分为伯努利朴素贝叶斯、多项式朴素贝叶斯、高斯朴素贝叶斯三种基本模型。
(1) 伯努利朴素贝叶斯
  若特征随机变量符合的是离散型的二项分布,也就是仅布尔值,那么此时的模型称为伯努利朴素贝叶斯。从统计的角度,分类器表达式分子中的连乘运算对应于n次独立试验。
(2) 多项式朴素贝叶斯
  若特征随机变量符合的是离散型的多项分布,那么此时的模型称为多项式朴素贝叶斯。同样地,分类器表达式分子中的连乘运算对应于n次独立试验。
(3) 高斯朴素贝叶斯
  若特征随机变量是连续型的(如身高、体重),即假定它是符合高斯分布的(正态分布),概率的计算就是由已知的数据计算出高斯分布的两个参数(均值、标准差),进而由密度函数确定对应的取值,代入公式计算。同样地,分类器表达式分子中的连乘运算对应于n次独立试验。

二、示例

  这里对多项式朴素贝叶斯分类模型举例。
训练集:

样本特征向量X 类别Y
[1, 1, 2, 3] 1
[1, 2, 2, 4] 2
[1, 2, 3, 3] 2
[1, 2, 4, 4] 3
[1, 3, 3, 4] 3
[2, 2, 3, 4] 1
[2, 1, 3, 3] 3

测试样本:[1, 2, 3, 4]

则类别集合为\(Y\in\left\{ 1,2,3 \right\}\) ,
\(P(Y=1)=\frac{2}{7}\),\(P(Y=2)=\frac{2}{7}\),\(P(Y=3)=\frac{3}{7}\),
\(P\left( X_1=1|Y=1 \right)=\frac{1}{2}\),\(P\left( X_2=2|Y=1 \right)=\frac{1}{2}\),\(P\left( X_3=3|Y=1 \right)=\frac{1}{2}\),
\(P\left( X_4=4|Y=1 \right)=\frac{1}{2}\),\(P\left( X_1=1|Y=2 \right)=1\),\(P\left( X_2=2|Y=2 \right)=1\),
\(P\left( X_3=3|Y=2 \right)=\frac{1}{2}\),\(P\left( X_4=4|Y=2 \right)=\frac{1}{2}\),\(P\left( X_1=1|Y=3 \right)=\frac{2}{3}\),
\(P\left( X_2=2|Y=3 \right)=\frac{1}{3}\),\(P\left( X_3=3|Y=3 \right)=\frac{2}{3}\),\(P\left( X_4=4|Y=3 \right)=\frac{2}{3}\),

归属于类别1的概率:

\[\begin{equation*} \begin{aligned} &P(Y=1)P(X_1=1|Y=1)P(X_2=2|Y=1)P(X_3=3|Y=1)P(X_4=4|Y=1)\\ &=\frac{2}{7}\cdot\frac{1}{2}\cdot\frac{1}{2}\cdot\frac{1}{2}\cdot\frac{1}{2}\\ &=\frac{1}{56} \end{aligned} \end{equation*} \]

归属于类别2的概率:

\[\begin{equation*} \begin{aligned} &P(Y=2)P(X_1=1|Y=2)P(X_2=2|Y=2)P(X_3=3|Y=2)P(X_4=4|Y=2)\\ &=\frac{2}{7}\cdot1\cdot1\cdot\frac{1}{2}\cdot\frac{1}{2}\\ &=\frac{1}{14} \end{aligned} \end{equation*} \]

归属于类别3的概率:

\[\begin{equation*} \begin{aligned} &P(Y=3)P(X_1=1|Y=3)P(X_2=2|Y=3)P(X_3=3|Y=3)P(X_4=4|Y=3)\\ &=\frac{3}{7}\cdot\frac{2}{3}\cdot\frac{1}{3}\cdot\frac{2}{3}\cdot\frac{2}{3}\\ &=\frac{8}{189} \end{aligned} \end{equation*} \]

归属于类别2的概率最大,因此分类输出为2。

三、Python实现

(1) 伯努利朴素贝叶斯

'''
sklearn实现伯努利朴素贝叶斯分类。
'''

import numpy as np
from sklearn.naive_bayes import BernoulliNB

## 1.构造训练集和待测样本
#训练集数据
train_x=[
    [1, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 0],
    [1, 1, 0, 0],
    [1, 0, 0, 0],
    [0, 0, 0, 0]
]
#训练集数据标签
train_y=[
    1,
    2,
    2,
    3,
    3,
    1
]

#待测样本
test_x = [
    [1, 2, 1, 2],
    [1, 1, 2, 2]
]

#转为array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定义分类器
bnbClf = BernoulliNB()

## 3.训练
Fit_bnbClf = bnbClf.fit(train_x,train_y)

## 4.预测
pre_y = Fit_bnbClf.predict(test_x)

print('预测类别:')
print(pre_y)

(2) 多项式朴素贝叶斯

'''
sklearn实现多项式朴素贝叶斯分类。
'''

import numpy as np
from sklearn.naive_bayes import ComplementNB

## 1.构造训练集和待测样本
#训练集数据
train_x=[
    [1, 1, 2, 3],
    [1, 2, 2, 4],
    [1, 2, 3, 3],
    [1, 2, 4, 4],
    [1, 3, 3, 4],
    [2, 2, 3, 4],
    [2, 1, 3, 3]
]
#训练集数据标签
train_y=[
    1,
    2,
    2,
    3,
    3,
    1,
    3
]


#待测样本
test_x = [
    [1, 2, 3, 4],
    [1, 1, 1, 4]
]

#转为array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定义分类器
cnbClf = ComplementNB()

## 3.训练
Fit_cnbClf = cnbClf.fit(train_x,train_y)

## 4.预测
pre_y = Fit_cnbClf.predict(test_x)

print('预测类别:')
print(pre_y)

(3) 高斯朴素贝叶斯

'''
sklearn实现高斯朴素贝叶斯分类。
'''

import numpy as np
from sklearn.naive_bayes import GaussianNB

#训练集数据
train_x=[
    [1.1, 2, 3, 4],
    [1, 2.2, 3, 4],
    [1, 2, 3.3, 4],
    [1, 2, 3, 4.4],
    [1.1, 2.2, 3, 4],
    [1, 2, 3.3, 4.4]
]
#训练集数据标签
train_y=[
    1,
    2,
    2,
    3,
    3,
    1
]

#待测样本
test_x = [
    [1.2, 2, 3, 4],
    [1, 2.3, 3, 4]
]

#转为array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定义分类器
gnbClf = GaussianNB()

## 3.训练
Fit_gnbClf = gnbClf.fit(train_x,train_y)

## 4.预测
pre_y = Fit_gnbClf.predict(test_x)

print('预测类别:')
print(pre_y)




End.

有关朴素贝叶斯分类的更多相关文章

  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. ruby - 在 Ruby 中实现贝叶斯分类器? - 2

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

  4. 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')

  5. 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

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

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

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

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

  8. 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":{"

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

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

  10. javascript - CoffeeScript 或 JavaScript 中的基本 NLP——Punkt 标记化,简单训练的贝叶斯模型——从哪里开始? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题?更新问题,使其仅关注一个问题editingthispost.3年前关闭。Improvethisquestion我当前的网络应用项目需要一点NLP:通过Punkt等将文本标记为句子;用从句分解较长的句子(通常用逗号,除非不是)贝叶斯模型适合于感觉均匀的分段段落,没有孤儿或寡妇,并且最小的尴尬split(也许)...如果您有NLTK,其中大部分是一项幼稚的简单任务—我这样做了,有点:应用程序后端是Tornado上的Django;你会认为做这些事情不是问题。但是,我必须以交互方式提供需要标记器的用户反馈,因此我需要对数据

随机推荐