首页 > 其他分享 >朴素贝叶斯分类

朴素贝叶斯分类

时间:2023-01-27 22:23:44浏览次数:36  
标签:right frac 分类 贝叶斯 train 朴素 left

一、朴素贝叶斯法原理

1.基本原理

  朴素贝叶斯法(Naive Bayes)是一种基础分类算法,它的核心是贝叶斯定理+条件独立性假设。贝叶斯定理描述的是两个条件概率之间的关系,对两个事件A和B,由乘法法则易知$$(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.

标签:right,frac,分类,贝叶斯,train,朴素,left
From: https://www.cnblogs.com/flyup/p/17069434.html

相关文章

  • PyTorch图像分类全流程实战--训练得到的模型预测图像04
    教程同济子豪兄https://space.bilibili.com/1900783https://www.bilibili.com/video/BV1qe4y1D7zDGithub:Train_Custom_Dataset/图像分类/4配置环境数据处理:numpyp......
  • 【推荐系统】利用FM模型进行分类回归任务
    如果需要完整代码可以关注下方公众号,后台回复“代码”即可获取,阿光期待着您的光临~文章目录​​一、FM回归任务​​​​1.导库​​​​2.加载数据​​​​3.获取数据​​......
  • 前端小技巧之 --- 【对象数组分类并排序】
    当前需求是:把下面的数组,按照index值分类,再按照字母顺序排序exportconstsingerList=[{id:0,index:'Z',name:'周杰伦'},{id:1,index:'X',......
  • 多分类问题
    目录Softmax多分类损失函数实现手写数字识别Softmax二分类问题给定一系列特征,输出为0或1,表示是否满足某个条件。具体做法是输出一个概率,表示给定特征满足这个条件的概率......
  • Serverless架构下用Python轻松实现图像分类和预测
    Serverless架构下用Python轻松实现图像分类和预测图像分类是人工智能领域的一个热门话题。通俗解释就是,图像分类是一种根据各自在图像信息中所反映的不同特征,把不同类别的......
  • IP地址分类
    这学期学习计算机网络,写这篇文章,权当复习之用,这里说的IP地址为IPV4,不是IPV6。1)IP地址的组成一个IP地址由32位二进制数组成,如10000000000010110000001100011111为了方便......
  • RFID系统架构及分类
    RFID系统架构及分类  从全球产业格局来看,目前RFID产业主要集中在RFID技术应用比较成熟的欧美市场。-飞利浦、西门子、ST、TI等半导体厂商基本垄断了RFID芯片市场;-IB......
  • PyTorch图像分类全流程实战--迁移学习训练图像分类模型03
    教程同济子豪兄:https://space.bilibili.com/1900783斯坦福CS231N【迁移学习】中文精讲:https://www.bilibili.com/video/BV1K7411W7So斯坦福CS231N【迁移学习】官方笔记:h......
  • 多表查询的分类new
    多表查询可以分为​ 什么是join​ join具有连接的作用,即当两个以上的表有关系时,需要用join来连接这些相关的表,来处理或分析数据。join的作用:连接这里有两张表,使用join......
  • 多表查询的分类
    角度1:等值连接与非等值连接角度2:自连接与 非自连接角度3:内连接与外连接等值连接(使用=号连接)非等值连接(不使用=号连接(如<,>,<=,>=,!=))​ selec......