当前位置: 首页 > article >正文

【机器学习】深入浅出讲解贝叶斯分类算法

0. 前言

1.贝叶斯分类器介绍

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯(Naive Bayes)分类是贝叶斯分类中最简单,也是常见的一种分类方法。

一些很常见的分类算法(如:KNN,逻辑回归,决策树),这些模型学习目的是学习输出 Y Y Y和特征 X X X之间的关系。它们属于判别方法

但这篇文章所讲的贝叶斯分类算法,它是基于概率论的生成方法,直接找出输出 Y Y Y和输入特征 X X X之间的联合分布 P ( X , Y ) P(X, Y) P(X,Y) ,进而根据贝叶斯公式 P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y\mid X)=\frac{P(X,Y)}{P(X)} P(YX)=P(X)P(X,Y)来进行判定。

那么

2. 概率基础

2.1 贝叶斯公式

p ( w i ∣ x ) = p ( x ∣ w i ) p ( w i ) p ( x ) p(w_i|x)=\frac{p(x|w_i)p(w_i)}{p(x)} p(wix)=p(x)p(xwi)p(wi)

上述这个简洁的公式就算贝叶斯公式,这么简单真的可以用来进行分类吗?

首先上述公式有以下两个创新点:

1. 用概率的形式表示所有形式的不确定性
2. 引入了“先验”和后验的概念

贝叶斯概率基础:描述两个相关的随机事件或随机变量的概率关系:

设试验 𝐸 的样本空间为 𝑆,𝑥 为 𝐸 的事件, 𝒘𝟏 , 𝒘𝟐 ,…, 𝒘𝒄 为 S 的一个划分,且𝑝(𝑥) > 0, 𝑝 𝒘𝒊 > 𝟎(𝒊 = 𝟏, 𝟐, … 𝒄) ,则

① 先验概率𝒑(𝒘𝒊):预先已知的或者可以估计的模式识别系统位于某种类型的概率。根据大量统计确定某类事物出现的比例,如𝑝 (男生) 代表整个教室里面男生的比列,这个是已知的。
② 条件概率𝒑(𝒙|𝒘𝒊):类别状态为𝒘𝒊时,样本𝑥出现的概率
③ 后验概率𝒑(𝒘𝒊|𝒙):一个具体事物属于某种类别的概率. 后验概率涉及一个具体事物,而先验概率是泛指一类事物,因此 𝑝( 男生|𝑥) 和𝑝( 男生) 是两个不同的概念。
④ 全概率:样本𝑥在所有类别里出现的概率之和,也称为𝑥的全概率: p ( x ) = ∑ i = 1 c p ( x ∣ w i )   p ( w i ) p(x)=\sum_{i=1}^cp(x|w_i)\:p(w_i) p(x)=i=1cp(xwi)p(wi)

⑤ 贝叶斯公式: 描述两个有因果关系的随机事件之间的概率关系, p ( w i ∣ x ) = p ( x ∣ w i ) p ( w i ) p ( x ) p(w_i|x)=\frac{p(x|w_i)p(w_i)}{p(x)} p(wix)=p(x)p(xwi)p(wi)

在这里插入图片描述

2.2 不確定性推理

推理可分为以下几种推理:

  1. 确定性推理(非概率推理):
    ➢ 如条件 B 存在,就一定会有结果 A。现在已知条件 B 存在,可以得出结论是结
    果 A 一定也存在。

    真正的确定性推理在真实世界中并不存在!即使条件概率P(A|B)=1 ,条件B存在,也不意味着结果A 就确定一定会发生。

    如果每个类别的样本分布在互不相交的特征空间区域中,也就是说,不同类的样本,其特征向量会落入到特征空间的不同区域中。因此,可以在特征空间中画出类别之间的分类决策边界。在识别一个样本时,如果该样本的特征向量落入了某决策区域中,则它一定属于对应的类。这称为“确定性的统计分类”

  2. 非确定性推理(概率推理):
    ➢ 如条件 B 存在,则结果 A 发生的概率为 P(A|B)。P(A|B)也称为结果 A 发生的条件概率(ConditionalProbability)。

    如果每个类别样本的分布区域无法清晰地分开,也就是说,当样本属于不同类时,也都有可能出现特征空间中的同一个点,即对应到同一个特征向量的取值。那么,虽然样本各不相同,每个样本也都有自己真实所属的类别,但是当抽取出一些特征,将样本映射到特征空间的一个点时,可能会出现多对一的映射。此时,根据特征向量识别一个样本时,就无法确定地判定该样本属于哪一个类,而只能得出它属于某一个类或者某几个类的概率,然后根据概率的大小来做出最终的分类决策。这种统计分类的方式,称为“不确定的统计分类”。

  3. 逆概率推理:
    ➢ 已知条件 B 存在,则结果 A 发生的概率为P(A|B);反之,发现结果 A 出现了,求条件 B 存在的概率 P(B|A)是多少?
    根据所看到的结果,来推测产生这一结果的原因。这种推理的过程我们成为“逆向推理”。贝叶斯公式就算解决逆概率推理,根据后验结果预测先验

一、贝叶斯算法核心思想与原理

1.1 原理介绍

上述什么先验、后验,其实都是从概率的角度去看这个贝叶斯公式。贝叶斯算法的核心思想是通过考虑特征概率(后验结果概率)来预测分类(先验),即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。

在这里插入图片描述
用贝叶斯公式解决分类问题,预测出样本属于每个类的概率:

  1. 贝叶斯公式阐明了两个随机变量之间的因果关系,分类问题中的特征向量取值 x x x和样本所属类型 y y y 之间具有因果关系——因为样本属于类型 y y y,所以具有特征值 x x x

  2. 分类器要做的则是根据这种因果关系,由特征向量进行反推,反推每个样本所属的类别;根据贝叶斯公式,样本属于每个类的后验概率为:
    p ( y i ∣ x ) = p ( x ∣ y i ) p ( y i ) p ( x ) , p(y_i|x)=\frac{p(x|y_i)p(y_i)}{p(x)}, p(yix)=p(x)p(xyi)p(yi),

    p ( y i ) 为每一类出现的概率, p ( x ∣ y i )  是类条件概率,即每一类的样本所服从的概率分布, p ( x ) 为证 据因子,对所有类相同 p(y_i)\text{为每一类出现的概率,}p(x|y_i)\text{ 是类条件概率,即每一类的样本所服从的概率分布,}p(x)\text{为证}\\\text{据因子,对所有类相同} p(yi)为每一类出现的概率,p(xyi) 是类条件概率,即每一类的样本所服从的概率分布,p(x)为证据因子,对所有类相同

  3. 如果只需要分类而不需要得到后验概率的值,则可以忽略证据因子,因为它对所有类都相同,预测函数为: argmax ⁡ y p ( x ∣ y i ) p ( y i ) \underset{y}{\operatorname*{argmax}}p(x|y_i)p(y_i) yargmaxp(xyi)p(yi)

    这是一个求最大值的操作。它遍历所有可能的类别  y ,找到使得  p ( x ∣ y i ) p ( y i )  最大的那个类别 \text{这是一个求最大值的操作。它遍历所有可能的类别 }y\text{,找到使得 }p(x|y_i)p(y_i)\text{ 最大的那个类别} 这是一个求最大值的操作。它遍历所有可能的类别 y,找到使得 p(xyi)p(yi) 最大的那个类别

1.2 实例解析

举例01:

题目:在一个社会中,男性和女性的比例基本是一样的,也就是说如果把男性作为一类,女性作为另一类,那么两个类别的先验概率都是 0.5,也可以说,我们在路上随机遇到一个人,他是男性和女性的概率各为 50%。如果我们在路上看到了一个人的背影,发现他是长发,那么他是男性或女性的概率会发生什么变化吗?

答:把“长发”作为一个样本所具有的特征值,计算后验概率:P(男性|长发)和P(女性|长发)无论这个人识别为男性还是识别为女性,都有可能犯错!----“不确定统计分类”的本质特点。

推理过程:
条件1:男性留长发的概率是5%和女性留长发的概率是70%,则P(长发|男性)=0.05,P(长发|女性)=0.7. ——条件概率1
条件2:设 P(男性)=50%,(女性)=50%——先验概率2
结论1:P(男性|长发)=(0.05 * 0.5)/(0.05 * 0.5 + 0.7 * 0.5)=1/15=0.067;——后验概率

如果我们在一个特殊的环境中,男性女性的先验概率并不相同
条件3: 男性大约占总人群的 75%,女性大约占 25%,
结论2:P(男性|长发)=(0.050.75)/(0.050.75+0.7*0.25)=3/17=0.176;

🚨注意:在各类别先验概率不均等时,后验概率也会发生很大的变化。

1.3 总结

假设在学习阶段通过训练已得到模型的联合概率𝑝(𝒙, 𝑦)(对于生成模型)后验概率𝑝(𝑦|𝒙)(对于判别模型),需要对类型输出做出最终判决,即决策。贝叶斯决策是基于贝叶斯公式

在这里插入图片描述

上述的 p ( x , y ) p(x,y) p(x,y)就是$p(xy);即特征值和类别同时出现的概率。

二、贝叶斯分类器的分类

2.0 前言

➢ 用贝叶斯公式解决分类问题,预测出样本属于每个类的概率,不同的假设导致了不同的贝叶斯分类器

不同的假设主要是对数据分布做出分类决策的特定前提设定

① 最小错误概率贝叶斯分类器
② 最小风险贝叶斯分类器
③ 假设特征向量的各个分量相互独立 - 朴素贝叶斯分类器
④ 假设每个类的特征向量服从多维正态分布 - 正态贝叶斯分类器

2.1:最小错误概率贝叶斯分类器(最大后验概率)

2.1.1:介绍

➢ 对于分类问题,决策准则是使得错误分类率最小,即最小错误分类率(Minimum
Misclassification Rate,MMR)

➢ 对于二分类问题:

前提条件是假设所有错误的代价是平等的

首先,我们有一个二分类问题,这意味着我们要将数据分为两类,分别是 C 1 C_1 C1 C 2 C_2 C2。为了进行分类,我们把特征空间(也就是数据可能出现的所有特征组合所构成的空间)划分成了两个区域 R 1 R_1 R1 R 2 R_2 R2

对于第一个情况:

假设存在一个数据点 x x x,它实际上是属于类别 C 2 C_2 C2 的。但是,我们的分类规则却把它划分到了区域 R 1 R_1 R1 中,这就产生了错误分类。

那么,错误概率 p ( x ∈ R 1 , C 2 ) p(x\in R_1,C_2) p(xR1,C2) 表示的是所有像这样被错误分到 R 1 R_1 R1 区域且实际上属于 C 2 C_2 C2 类别的数据点出现的可能性。

为了计算这个概率,我们需要考虑在区域 R 1 R_1 R1 内,属于类别 C 2 C_2 C2 的概率分布情况。概率分布函数 p ( x , C 2 ) p(x,C_2) p(x,C2) 描述了数据点 x x x 属于类别 C 2 C_2 C2 的概率在整个特征空间中的变化情况。

通过对区域 R 1 R_1 R1 上的这个概率分布函数进行积分 ∫ R 1 p ( x , C 2 )   d x \int_{R_1}p(x,C_2)\:dx R1p(x,C2)dx,我们就能得到数据点实际上属于类别 C 2 C_2 C2 但却被错误分到区域 R 1 R_1 R1 的总体概率。

对于第二个情况:

同理,当一个数据点 x x x 实际上是属于类别 C 1 C_1 C1 的,但被错误地划分到了区域 R 2 R_2 R2 中。

错误概率 p ( x ∈ R 2 , C 1 ) p(x\in R_2,C_1) p(xR2,C1) 表示这种错误分类情况发生的可能性。

通过对区域 R 2 R_2 R2 上属于类别 C 1 C_1 C1 的概率分布函数 p ( x , C 1 ) p(x,C_1) p(x,C1) 进行积分 ∫ R 2 p ( x , C 1 ) d x \int_{R_2}p(x,C_1)dx R2p(x,C1)dx,我们就得到了数据点实际上属于类别 C 1 C_1 C1 但却被错误分到区域 R 2 R_2 R2 的总体概率。

总的来说,这两个公式帮助我们定量地描述在二分类中,由于区域划分不准确导致的错误分类的可能性大小。

将两者合并:

p e = p ( x ∈ R 1 , C 2 ) + p ( x ∈ R 2 , C 1 ) = ∫ R 1 p ( x , C 2 )   d x + ∫ R 2 p ( x , C 1 )   d x p_e=p(x\in R_1,C_2)+p(x\in R_2,C_1)=\int_{R_1}p(x,C_2)\:dx+\int_{R_2}p(x,C_1)\:dx pe=p(xR1,C2)+p(xR2,C1)=R1p(x,C2)dx+R2p(x,C1)dx

这个式子中,𝑝𝑒 表示分类的总错误概率

🍊基于概率 的决策原则:

接下来,当面对一个新的数据点 𝑥 时,如果 𝑝(𝑥, 𝐶1) > 𝑝(𝑥, 𝐶2) ,我们就将其分类为 𝐶1 类别;反之,如果 𝑝(𝑥, 𝐶1) < 𝑝(𝑥, 𝐶2) ,就将其分类为 𝐶2 类别。

基于后验概率 的决策原则:

𝑝(𝐶1|𝑥) 和 𝑝(𝐶2|𝑥) ,分别表示在已知数据点 𝑥 的情况下,它属于类别 𝐶1 和 𝐶2 的条件概率。如果 𝑝(𝐶1|𝑥) > 𝑝(𝐶2|𝑥) ,意味着在给定 𝑥 的条件下,它属于 𝐶1 类别的可能性更大,所以分类为 𝐶1 ;反之则分类为 𝐶2 。

推广到多类情况,设有{𝐶1, 𝐶2, … , 𝐶𝐾}种类型,最后分类结果为 C i ∗ = argmax ⁡ C i p ( C i ∣ x ) C^{*}_{i}=\underset{C_{i}}{\operatorname*{argmax}}p(C_{i}|x) Ci=Ciargmaxp(Cix)后验概率最大的类作为分类输出。

下面我们来正式介绍最小错误概率分类器:


2.1.2:讲解

🚉在模式分类问题中,人们往往希望尽量减少分类错误,使错误率最小的分类规则,称为基于最小错误率的贝叶斯决策。贝叶斯分类器在最小化分类错误率上是最优的。

➢ 在对样本进行决策时,使其错误率最小的决策就是使后验概率最大的决策,所以在无特殊说明下说的贝叶斯决策通常就是指最小错误率贝叶斯决策。最小错误贝叶斯分类器的目的就是 min ⁡ P ( e ) = ∫ P ( e ∣ x ) p ( x ) d x \min P(e)=\int P(e\mid x)p(x)dx minP(e)=P(ex)p(x)dx

➢ 因为𝒑(𝒙)是一致的,简化后分类器的判别函数为: arg ⁡ max ⁡ y p ( x ∣ w i ) p ( w i ) \arg\max_yp(x|w_i)p(w_i) argmaxyp(xwi)p(wi) 即最大后验概率,其中类条件概率可以是均匀分布、指数分布、正态分布等。

➢ 贝叶斯分类器需要知道每类样本的特征向量服从的概率密度,常用正态分布来表示特征向量的概率分布。

在这里插入图片描述
下面我们来讲解这个图像的含义:

  1. 横轴代表特征向量x,y 轴代表基于特征向量得出的后验概率y = P(wi/x) = p(x/wi)*p(wi)

  2. 第一个函数是表示类别1的分布,纵轴此时表示P(C1/x) ; 第二个函数代表2类别的分布

  3. t这条竖线是两个类别的分界点。

  4. 最大后验概率:此时,t会与两个函数有两个交点,每次选择y值高的那个交点类作为预测类;经过这个步骤,t位于两个函数互相的交点处。

  5. 最小错误概率:因为 min ⁡ P ( e ) = ∫ P ( e ∣ x ) p ( x ) d x \min P(e)=\int P(e\mid x)p(x)dx minP(e)=P(ex)p(x)dx,从上图可以看到,红色区域+黄色区域代表分成了2类,但是实际是1类的错误概率;绿色概率代表,分成了1但实际是2类的错误概率;我们发现,如果想要让整个错误概率最小,则必须黄色区域为0,则此时t也位于两个函数的互相交点处。

综上, 错误率最小的决策和使后验概率最大的决策在目的和效果上是一致的,这两种决策方式的本质都是为了在分类任务中尽可能准确地将数据点分配到正确的类别,以达到最优的分类效果。

2.1.3:例题讲解

举例02:

某地发生了一起交通事故肇事逃逸事件,现场有一位目击者,他非常肯定地说,他看见肇事车的车标是右侧的车标,而不是左侧的车标。如果这个目击者的可信度非常99%用最小错误率贝叶斯分类器来算一算:

P(认成左标|实为右标)=0.01, P(认成右标|实为右标)=0.99,
在这里插入图片描述

题目:
(1)设 P(左标)=P(右标)=50%, ——————市场占有率
则P(实为右标|认成右标)=(0.99 * 0.5)/(0.99 * 0.5 + 0.01 * 0.5)=0.99 只有 1%的可能性认错。

(2)设 P(左标)=99%;P(右标)=1%, ——————市场占有率
则P(实为右标|认成右标)= (0.99 * 0.01)/(0.99 * 0.01 + 0.01 * 0.99) = 0.5, 有50%的可能性认错.

举例03

2013 年 3 月底以来,人感染 H7N9 型禽流感的病例开始出现,并造成了一定的社会恐慌。根据目前数据统计,该病的总体发病率大约为 1000 万分之一,对照普通流感的发病率可高达30%。研究发现,易感人群中99%的人感染H7N9型禽流感病例曾出现过发热、咳嗽等急性呼吸道感染症状,而同样的易感人群中 80%的普通流感患者也出现过同样症状。

题目:
现有一位患者属于易感人群,并出现了发热、咳嗽等急性呼吸道感染症状,请问是否应当按照人感染H7N9型禽流感疑似病例对待?该患者实为H7N9禽流感感染的后验概率

答:

P(H7N9)=0.0000001/(0.0000001+0.3); P(流感)=0.3/(0.0000001+0.3)——对样本空间进行划分

P(H7N9|症状)=(0.0000001/(0.0000001+0.3)*0.99)/(0.0000001/(0.0000001+0.3)*0.99+0.3/(0.0000001+0.3)*0.8)=0.000000412

2.2 最小风险贝叶斯分类器

2.2.1:介绍

在前面“最小错误概率贝叶斯分类器”中,各种错误代理的损失我们默认前提都是相等的。但是实施情况并不如此,比如在例题3中,如果我们把一个换了禽流感的人误判为正常,则这个带来的损失是极大的。所以,当使用贝叶斯分类器时,仅仅考虑识别错误率低是不够的,还应当把所采取的分类决策所带来的后果考虑进去,这就是“最小风险贝叶斯分类器”的由来。

  1. 基本概念:最小风险贝叶斯决策就是考虑各种错误造成损失不同时的一种最优决策。
  2. 决策𝜶𝒊:把待识别样本𝑥归为𝐶𝑖类中
  3. 损失𝝀𝒊𝒋:把真实属于𝐶𝑗类的样本𝑥归到𝐶𝑖类中带来的损失
  4. 条件风险𝑹(𝜶𝒊|𝒙):把样本𝑥采取决策𝛼𝑖后可能的总的风险

R ( α i ∣ x ) = E [ λ i j ] = ∑ j = 1 c λ i j P ( C j ∣ x ) , i = 1 , 2 , . . . c {\color{Red} } \mathrm{R}(\alpha_i|x)=E\big[\lambda_{ij}\big]=\sum_{j=1}^c\lambda_{ij}P\big(C_j\big|x\big),i=1,2,...c R(αix)=E[λij]=j=1cλijP(Cj x),i=1,2,...c

  1. 决策规则: 若 R ( α k ∣ x ) = min ⁡ i = 1 , 2 , . . . , c R ( α i ∣ x )  则  x ∈ ω k \text{若}R(\alpha_k|x)=\min_{i=1,2,...,c}R(\alpha_i|x)\text{ 则 }x\in\omega_k R(αkx)=mini=1,2,...,cR(αix)  xωk

🍊预测步骤

(1)已知类条件概率密度𝑝(𝑥|𝐶𝑗)和先验概率𝑃(𝐶𝑗), 𝑗 = 1,2, … , 𝑐以及给出待识别𝑥的情况下,根据贝叶斯公式计算后验概率: 𝑃(𝐶𝑗|𝑥);

(2)利用第1步计算的后验概率决策损失表,计算采取𝛼𝑖, 𝑖 = 1,2, … , 𝑎的条件风险 R ( α i ∣ x ) = ∑ j = 1 c λ ( α i , C j ) P ( C j ∣ x ) ; R(\alpha_i|x)=\sum_{j=1}^c\lambda(\alpha_i,C_j)P(C_j|x); R(αix)=j=1cλ(αi,Cj)P(Cjx);

(3)对第2步得到的𝑎个条件风险值 R ( α i ∣ x ) , i = 1 , 2 , . . . , a R(\alpha_i|x),\quad i=1,2,...,a R(αix),i=1,2,...,a进行比较,找出使条件风险最小的决策 a k a_k ak,即 R ( α k ∣ x ) = min ⁡ i = 1 , 2 , . . . , a R ( α i ∣ x ) R(\alpha_k|x)=\min_{i=1,2,...,a}R(\alpha_i|x) R(αkx)=mini=1,2,...,aR(αix)

2.2.2:例题讲解

举例04:

如果将一名普通流感患者误诊为H7N9型禽流感患者,所浪费的社会资源只有将一名
H7N9 型禽流感患者误诊为普通流感患者所带来的社会资源损失的 300万分之一,请问是否应当将该病例按照人感染H7N9型禽流感疑似病例对待?

答:
当我们将该患者诊断为禽流感患者时,条件风险为:

  • 判决为H7N9 :R=P(普通|症状)*1=(1-0.000000412) *1 =0.999999588
  • 判决为普通:R=P(H7N9|症状)*3000000=(0.000000412)*3000000=1.236

2.3 朴素贝叶斯分类器⭐

2.3.0 总体介绍

假设特征向量的分量之间相互独立,这种假设简化了问题求解的难度

所谓「朴素」,是假定所有输入事件之间是相互独立。进行这个假设是因为独立事件间的概率计算更简单。

该样本属于某一类的概率为 p ( y = c i ∣ x ) = p ( y = c i ) p ( x ∣ y = c i ) p ( x ) p(y=c_i|\mathbf{x})=\frac{p(y=c_i)p(\mathbf{x}|y=c_i)}{p(\mathbf{x})} p(y=cix)=p(x)p(y=ci)p(xy=ci)

🍊朴素贝叶斯模型的基本思想: 对于给定的待分类项 X { a 1 , a 2 , a 3 , ⋯   , a n } X\left\{a_{1},a_{2},a_{3},\cdots,a_{n}\right\} X{a1,a2,a3,,an},求解在此项出现的条件下各个类别 y i y_i yi出现的概率,哪个 P ( y i ∣ X ) P(y_i|X) P(yiX) 最大,就把此待分类项归属于哪个类别(其决策也是基于最大后验概率)。

然而,严格来讲,不能简单地说朴素贝叶斯的本质就是最小错误率贝叶斯。最小错误率贝叶斯决策是一个更通用的理论框架,而朴素贝叶斯是基于 特定假设(特征条件独立性假设) 实现的一种具体的分类方法。

💐朴素贝叶斯模型的定义: X { a 1 , a 2 , a 3 , ⋯   , a n } X\left\{a_{1},a_{2},a_{3},\cdots,a_{n}\right\} X{a1,a2,a3,,an} 为一个待分类项,每个 为 的一个特征属性,且特征属性之间相互独立。设 C { y 1 , y 2 , y 3 , ⋯   , y n } C\left\{y_1,y_2,y_3,\cdots,y_n\right\} C{y1,y2,y3,,yn} 为一个类别集合,计算 P ( y 1 ∣ X ) , P ( y 2 ∣ X ) , P ( y 3 ∣ X ) , … , P ( y n ∣ X ) P\left(y_{1}\mid X\right),P\left(y_{2}\mid X\right),P\left(y_{3}\mid X\right),\ldots,P\left(y_{n}\mid X\right) P(y1X),P(y2X),P(y3X),,P(ynX)

P ( y k ∣ X ) = max ⁡ { P ( y 1 ∣ X ) , P ( y 2 ∣ X ) , P ( y 3 ∣ X ) , … , P ( y n ∣ X ) } , 则 X ∈ y k P\left(y_k\mid X\right)=\max\left\{P\left(y_1\mid X\right),P\left(y_2\mid X\right),P\left(y_3\mid X\right),\ldots,P\left(y_n\mid X\right)\right\},\text{则}X\in y_k P(ykX)=max{P(y1X),P(y2X),P(y3X),,P(ynX)},Xyk

但是在这里求后验概率 P ( y k ∣ X ) P\left(y_{k}\mid X\right) P(ykX) 没有那么简单,它需要利用特征分量之间的独立性:

  1. 找到一个已知分类的待分类项集合,这个集合叫做训练样本集
  2. 统计得到在各类别下各个特征分量的条件概率估计。即
    P ( a 1 ∣ y 1 ) , P ( a 2 ∣ y 1 ) , ⋯   , P ( a n ∣ y 1 ) P ( a 1 ∣ y 2 ) , P ( a 2 ∣ y 2 ) , ⋯   , P ( a n ∣ y 2 ) ⋯ P ( a 1 ∣ y n ) , P ( a 2 ∣ y n ) , ⋯   , P ( a n ∣ y n ) P\left(a_{1}\mid y_{1}\right),P\left(a_{2}\mid y_{1}\right),\cdots,P\left(a_{n}\mid y_{1}\right)\\P\left(a_{1}\mid y_{2}\right),P\left(a_{2}\mid y_{2}\right),\cdots,P\left(a_{n}\mid y_{2}\right)\\\cdots\\P\left(a_{1}\mid y_{n}\right),P\left(a_{2}\mid y_{n}\right),\cdots,P\left(a_{n}\mid y_{n}\right) P(a1y1),P(a2y1),,P(any1)P(a1y2),P(a2y2),,P(any2)P(a1yn),P(a2yn),,P(anyn)

在朴素贝叶斯算法中,待分类项的每个特征属性都是条件独立的,由贝叶斯公式 P ( y i ∣ X ) = P ( X ∣ y i ) P ( y i ) P ( X ) P\left(y_i\mid X\right)=\frac{P\left(X\mid y_i\right)P\left(y_i\right)}{P\left(X\right)} P(yiX)=P(X)P(Xyi)P(yi)

因为分母相当于在数据库中 X X X 存在的概率,所以对于任何一个待分类项 P ( X ) P(X) P(X)来说 都是常数固定的。再求后验概率 P ( y i ∣ X ) P(y_i | X) P(yiX) 的时候只用考虑分子即可。

因为各特征值是独立的所以有:
P ( X ∣ y i ) P ( y i ) = P ( a 1 ∣ y i ) P ( a 2 ∣ y i ) ⋯ P ( a n ∣ y i ) P ( y i ) = P ( y i ) ∏ j = 1 n P ( a j ∣ y i ) P\left(X\mid y_{i}\right)P\left(y_{i}\right)=P\left(a_{1}\mid y_{i}\right)P\left(a_{2}\mid y_{i}\right)\cdots P\left(a_{n}\mid y_{i}\right)P\left(y_{i}\right)\\=P\left(y_{i}\right)\prod_{j=1}^{n}P\left(a_{j}\mid y_{i}\right) P(Xyi)P(yi)=P(a1yi)P(a2yi)P(anyi)P(yi)=P(yi)j=1nP(ajyi)

可以推出:
P ( X ∣ y i ) = ∏ k = 1 n P ( a k ∣ y i ) P\left(X\mid y_i\right)=\prod_{k=1}^nP\left(a_k\mid y_i\right) P(Xyi)=k=1nP(akyi)
对于 P ( y i ) P(y_i) P(yi) 是指在训练样本中 y i y_i yi出现的概率,可以近似的求解为:

P ( y i ) = ∣ y i ∣ D P\left(y_i\right)=\frac{\left|y_i\right|}{D} P(yi)=Dyi

对于先验概率 P ( a j ∣ y i ) P(a_j | y_i) P(ajyi),是指在类别 y i y_i yi 中,特征元素 a j a_j aj 出现的概率,可以求解为:
P ( a j ∣ y i ) = ∣ 在训练样本为 y i 时, a j 出现的次数 ∣ ∣ y i 训练样本数 ∣ P\left(a_j\mid y_i\right)=\frac{\left|\text{在训练样本为}y_i\text{时,}a_j\text{出现的次数}\right|}{\left|y_i\text{训练样本数}\right|} P(ajyi)=yi训练样本数在训练样本为yi,aj出现的次数

总结一下,朴素贝叶斯模型的分类过程如下流程图所示:

在这里插入图片描述

2.3.1 特征为离散的情况

如果特征向量的分量离散型随机变量,可以直接根据训练样本计算出其服从的概率分布统计每一类训练样本中每个特征分量取每个值的频率,作为类条件概率的估计值

p ( x i = v ∣ y = c ) = N x i = v , y = c N y = c p(x_i=v|y=c)=\frac{N_{x_i=v,y=c}}{N_{y=c}} p(xi=vy=c)=Ny=cNxi=v,y=c

类概率是各个类的样本占总样本数的比例: p ( y = c ) = N y = c N p(y=c)=\frac{N_{y=c}}N p(y=c)=NNy=c 其中,𝑝(𝑦 = 𝑐)为第c类样本在整个训练样本集中出现的概率。

分类器的预测函数为: arg ⁡ max ⁡ y p ( y = c ) ∏ i = 1 n p ( x i = v ∣ y = c ) \arg\max_yp(y=c)\prod_{i=1}^np(x_i=v|y=c) argymaxp(y=c)i=1np(xi=vy=c)

2.3.2:特征值连续

如果特征向量的分量是连续型随机变量,可以假设它们服从一维正态分布:

p ( x i = x ∣ y = c ) = 1 2 π σ i exp ⁡ ( − ( x − μ i ) 2 2 σ i 2 ) p(x_i=x|y=c)=\frac1{\sqrt{2\pi}\sigma_i}\exp\left(-\frac{(x-\mu_i)^2}{2\sigma_i^2}\right) p(xi=xy=c)=2π σi1exp(2σi2(xμi)2)
分类器的预测函数为: argmax ⁡ a p ( y = c ) ∏ i = 1 n 1 2 π σ i exp ⁡ ( − ( x i − μ i ) 2 2 σ i 2 ) \operatorname{argmax}_ap\left(y=c\right)\prod_{i=1}^n\frac1{\sqrt{2\pi}\sigma_i}\exp\left(-\frac{(x_i-\mu_i)^2}{2\sigma_i^2}\right) argmaxap(y=c)i=1n2π σi1exp(2σi2(xiμi)2)

均值和方差通过最大似然估计得到对于特征 𝑥,假设某一类所有训练样本该特征的取值
x i , i = 1 , … , l , x_i,i=1,\ldots,l, xi,i=1,,l,

此类样本该特征所服从的正态分布的均值和方差分别为:

μ = 1 l ∑ i = 1 l x i \mu=\frac1l\sum_{i=1}^lx_i μ=l1i=1lxi

σ 2 = 1 l ∑ i = 1 l ( x i − μ ) 2 \sigma^2=\frac1l\sum_{i=1}^l(x_i-\mu)^2 σ2=l1i=1l(xiμ)2

2.3.3:平滑处理

1)为什么需要平滑处理?
使用朴素贝叶斯,有时候会面临零概率问题。零概率问题,指的是在计算实例的概率时,如果某个量 x x x ,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是 0。

在文本分类的问题中,当「一个词语没有在训练样本中出现」时,这个词基于公式统计计算得到的条件概率为 0 ,使用连乘计算文本出现概率时也为 0 。这是不合理的 , 不能因为一个事件没有观察到就武断的认为该事件的概率是 0 0 0

2)拉普拉斯平滑及依据

为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑

假定训练样本很大时,每个分量 的计数加 造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

对应到文本分类的场景中,如果使用多项式朴素贝叶斯,假定特征 x i x_i xi 表示某个词在样本中出现的次数(当然用TF-IDF表示也可以)。拉普拉斯平滑处理后的条件概率计算公式为: P ( x i ∣ y ) = N y i + α N y + n α P\left(x_i\mid y\right)=\frac{N_{yi}+\alpha}{N_y+n\alpha} P(xiy)=Ny+nαNyi+α

  • N y i  表示类  y  的所有样本中特征  x i  的特征值之和。 N_{yi}\text{ 表示类 }y\text{ 的所有样本中特征 }x_i\text{ 的特征值之和。} Nyi 表示类 y 的所有样本中特征 xi 的特征值之和。

  • N y  表示类  y  的所有样本中全部特征的特征值之和。 N_y\text{ 表示类 }y\text{ 的所有样本中全部特征的特征值之和。} Ny 表示类 y 的所有样本中全部特征的特征值之和。

  • α  表示平滑值( α ∈ [ 0 , 1 ] ,主要为了防止训练样本中某个特征没出现而导致  N p i = 0 ,从而导致条件概率 P ( x i ∣ y ) = 0  的情况,如果不加入平滑值,则计算联合概率时由于某一项为 0 导致后验概率为 0 的异常情况出 现。 \begin{aligned}&\alpha\text{ 表示平滑值(}\alpha\in[0,1]\text{,主要为了防止训练样本中某个特征没出现而导致 }N_{pi}=0\text{,从而导致条件概率}\\&P\left(x_{i}\mid y\right)=0\text{ 的情况,如果不加入平滑值,则计算联合概率时由于某一项为}0\text{导致后验概率为}0\text{的异常情况出}\\&\text{现。}\end{aligned} α 表示平滑值(α[0,1],主要为了防止训练样本中某个特征没出现而导致 Npi=0,从而导致条件概率P(xiy)=0 的情况,如果不加入平滑值,则计算联合概率时由于某一项为0导致后验概率为0的异常情况出现。

  • n 表示特征总数。 n表示特征总数。 n表示特征总数。

一般我们取去a1即可:

p ( x i = v ∣ y = c ) = N x i = v , y = c + 1 N y = c + k p(x_i=v|y=c)=\frac{N_{x_i=v,y=c}+1}{N_{y=c}+k} p(xi=vy=c)=Ny=c+kNxi=v,y=c+1

2.3.4:案例练习

举个例子:眼前有17个西瓜,好瓜和坏瓜个数差不多,现在要用这些西瓜来训练一个「坏瓜识别器」,我们要怎么办呢?

一般挑西瓜时通常要「敲一敲」,听听声音,是清脆声、浊响声、还是沉闷声。所以,我们先简单点考虑这个问题,只用敲击的声音来辨别西瓜的好坏。根据经验,敲击声「清脆」说明西瓜还不够熟,敲击声「沉闷」说明西瓜成熟度好,更甜更好吃。

朴素贝叶斯把类似「敲击声」这样的特征概率化,构成一个「西瓜的品质向量」以及对应的「好瓜/坏瓜标签」,训练出一个标准的「基于统计概率的好坏瓜模型」,这些模型都是各个特征概率构成的。
在这里插入图片描述

这样,在面对未知品质的西瓜时,我们迅速获取了特征,分别输入「好瓜模型」和「坏瓜模型」,得到两个概率值。如果「坏瓜模型」输出的概率值大一些,那这个瓜很有可能就是个坏瓜。

下面我们有17个瓜的数据:

编号色泽根蒂敲声纹理脐部触感密度含糖率好瓜
1青绿蜷缩浊响清晰凹陷硬滑0.6970.46
2乌黑蜷缩沉闷清晰凹陷硬滑0.7740.376
3乌黑蜷缩浊响清晰凹陷硬滑0.6340.264
4青绿蜷缩沉闷清晰凹陷硬滑0.6080.318
5浅白蜷缩浊响清晰凹陷硬滑0.5560.215
6青绿稍蜷浊响清晰稍凹软粘0.4030.237
7乌黑稍蜷浊响稍糊稍凹软粘0.4810.149
8乌黑稍蜷浊响清晰稍凹硬滑0.4370.211
9乌黑稍蜷沉闷稍糊稍凹硬滑0.6660.091
10青绿硬挺清脆清晰平坦软粘0.2430.267
11浅白硬挺清脆模糊平坦硬滑0.2450.057
12浅白蜷缩浊响模糊平坦软粘0.3430.099
13青绿稍蜷浊响稍糊凹陷硬滑0.6390.161
14浅白稍蜷沉闷稍糊凹陷硬滑0.6570.198
15乌黑稍蜷浊响清晰稍凹软粘0.360.37
16浅白蜷缩浊响模糊平坦硬滑0.5930.042
17青绿蜷缩沉闷稍糊稍凹硬滑0.7190.103

将其特征数字化如下:
色泽 1-3代表 浅白 青绿 乌黑
根蒂 1-3代表 稍蜷 蜷缩 硬挺
敲声 1-3代表 清脆 浊响 沉闷
纹理 1-3代表 清晰 稍糊 模糊
脐部 1-3代表 平坦 稍凹 凹陷
硬滑用1表示,软粘用2
好瓜 1代表 是 0 代表 不是|

编号色泽根蒂敲声纹理脐部触感密度含糖率好瓜
12221310.6970.461
23231310.7440.3761
33221310.6340.2641
42231310.6080.3181
51221310.5560.2151
62121220.4030.2371
73122220.4810.1491
83121210.4370.2111
93132210.6660.0910
102311120.2430.2670
111313110.2450.0570
121223120.3430.0990
132122310.6390.1610
141132310.6570.1980
153121220.360.370
161223110.5930.0420
172232210.7190.1030

现在我们有一个带判断瓜如下:

色泽根蒂敲声纹理脐部触感密度含糖量好瓜
青绿蜷缩浊响清晰凹陷硬滑0.6970.46

判断其为好瓜or坏瓜:

答:先验概率: 𝑃 (𝐶1) 、𝑃 (𝐶2)
P ( 好瓜 = 是 ) = 8 17 = 0.471 P ( 好瓜 = 否 ) = 9 17 = 0.529 P(\text{好瓜}=\text{是})=\frac8{17}=0.471\\P(\text{好瓜}=\text{否})=\frac9{17}=0.529 P(好瓜=)=178=0.471P(好瓜=)=179=0.529

求:每个属性估计条件概率 P ( x i ∣ C ) : P(x_i| C): P(xiC:

import numpy as np
import math
import pandas as pd


# 构建数据集
def loadDataSet():
    dataSet = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460, '好瓜'],
               ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.774, 0.376, '好瓜'],
               ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.634, 0.264, '好瓜'],
               ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.608, 0.318, '好瓜'],
               ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.556, 0.215, '好瓜'],
               ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.403, 0.237, '好瓜'],
               ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', 0.481, 0.149, '好瓜'],
               ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', 0.437, 0.211, '好瓜'],
               ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', 0.666, 0.091, '坏瓜'],
               ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', 0.243, 0.267, '坏瓜'],
               ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', 0.245, 0.057, '坏瓜'],
               ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', 0.343, 0.099, '坏瓜'],
               ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', 0.639, 0.161, '坏瓜'],
               ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', 0.657, 0.198, '坏瓜'],
               ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.360, 0.370, '坏瓜'],
               ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', 0.593, 0.042, '坏瓜'],
               ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719, 0.103, '坏瓜']]
    testSet = ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460]
    labels = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']

    return dataSet, testSet, labels


# 计算(不同类别中指定连续特征的)均值、标准差
def mean_std(feature, cla):
    dataSet, testSet, labels = loadDataSet()
    lst = [item[labels.index(feature)] for item in dataSet if item[-1] == cla]
    mean = round(np.mean(lst), 3)
    std = round(np.std(lst), 3)

    return mean, std


# 计算先验概率 P(c)
def prior():
    dataSet = loadDataSet()[0]
    countG = 0
    countB = 0
    countAll = len(dataSet)

    for item in dataSet:
        if item[-1] == "好瓜":
            countG += 1
    for item in dataSet:
        if item[-1] == "坏瓜":
            countB += 1

    # 计算先验概率 P(c)
    P_G = round(countG / countAll, 3)
    P_B = round(countB / countAll, 3)
    # 拉普拉斯修正
    # P_G = round((countG + 1)/(countAll + 2), 3)
    # P_B = round((countB + 1)/(countAll + 2), 3)

    return P_G, P_B


# 计算离散属性的条件概率 P(xi|c)
def P(index, cla):
    dataSet, testSet, labels = loadDataSet()
    countG = 0
    countB = 0

    for item in dataSet:
        if item[-1] == "好瓜":
            countG += 1
    for item in dataSet:
        if item[-1] == "坏瓜":
            countB += 1

    lst = [item for item in dataSet if (item[-1] == cla) & (item[index] == testSet[index])]
    P = round(len(lst) / (countG if cla == "好瓜" else countB), 3)
    # P = round((len(lst)+1)/((countG if cla=="好瓜" else countB)+3), 3)

    return P


# 计算连续属性的条件概率 p(xi|c)
def p():
    dataSet, testSet, labels = loadDataSet()
    denG_mean, denG_std = mean_std("密度", "好瓜")
    denB_mean, denB_std = mean_std("密度", "坏瓜")
    sugG_mean, sugG_std = mean_std("含糖率", "好瓜")
    sugB_mean, sugB_std = mean_std("含糖率", "坏瓜")
    print("=======================连续属性条件概率========================")
    # p(密度=0.697|好瓜)
    p_density_G = (1 / (math.sqrt(2 * math.pi) * denG_std)) * np.exp(
        -(((testSet[labels.index("密度")] - denG_mean) ** 2) / (2 * (denG_std ** 2))))
    p_density_G = round(p_density_G, 3)
    print(f"p(密度=0.697|好瓜)={p_density_G}")
    # p(密度=0.697|坏瓜)
    p_density_B = (1 / (math.sqrt(2 * math.pi) * denB_std)) * np.exp(
        -(((testSet[labels.index("密度")] - denB_mean) ** 2) / (2 * (denB_std ** 2))))
    p_density_B = round(p_density_B, 3)
    print(f"p(密度=0.697|坏瓜)={p_density_B}")
    # p(含糖率=0.460|好瓜)
    p_sugar_G = (1 / (math.sqrt(2 * math.pi) * sugG_std)) * np.exp(
        -(((testSet[labels.index("含糖率")] - sugG_mean) ** 2) / (2 * (sugG_std ** 2))))
    p_sugar_G = round(p_sugar_G, 3)
    print(f"p(含糖率=0.460|好瓜)={p_sugar_G}")
    # p(含糖率0,460|坏瓜)
    p_sugar_B = (1 / (math.sqrt(2 * math.pi) * sugB_std)) * np.exp(
        -(((testSet[labels.index("含糖率")] - sugB_mean) ** 2) / (2 * (sugB_std ** 2))))
    p_sugar_B = round(p_sugar_B, 3)
    print(f"p(含糖率=0.460|坏瓜)={p_sugar_B}")

    return p_density_G, p_density_B, p_sugar_G, p_sugar_B


# 预测后验概率 P(c|xi)
def bayes():
    # 计算类先验概率
    P_G, P_B = prior()
    # 计算离散属性的条件概率
    print("=======================离散属性条件概率========================")
    P0_G = P(0, "好瓜")
    print(f"P(青绿|好瓜)={P0_G}")
    P0_B = P(0, "坏瓜")
    print(f"P(青绿|坏瓜)={P0_B}")
    P1_G = P(1, "好瓜")
    print(f"P(蜷缩|好瓜)={P1_G}")
    P1_B = P(1, "坏瓜")
    print(f"P(蜷缩|坏瓜)={P1_B}")
    P2_G = P(2, "好瓜")
    print(f"P(浊响|好瓜)={P2_G}")
    P2_B = P(2, "坏瓜")
    print(f"P(浊响|坏瓜)={P2_B}")
    P3_G = P(3, "好瓜")
    print(f"P(清晰|好瓜)={P3_G}")
    P3_B = P(3, "坏瓜")
    print(f"P(清晰|坏瓜)={P3_B}")
    P4_G = P(4, "好瓜")
    print(f"P(凹陷|好瓜)={P4_G}")
    P4_B = P(4, "坏瓜")
    print(f"P(凹陷|坏瓜)={P4_B}")
    P5_G = P(5, "好瓜")
    print(f"P(硬滑|好瓜)={P5_G}")
    P5_B = P(5, "坏瓜")
    print(f"P(硬滑|坏瓜)={P5_B}")
    # 计算连续属性的条件概率
    p_density_G, p_density_B, p_sugar_G, p_sugar_B = p()

    # 计算后验概率
    isGood = P_G * P0_G * P1_G * P2_G * P3_G * P4_G * P5_G * p_density_G * p_sugar_G
    isBad = P_B * P0_B * P1_B * P2_B * P3_B * P4_B * P5_B * p_density_B * p_sugar_B

    total_probability = isGood + isBad
    normalized_isGood = isGood / total_probability
    normalized_isBad = isBad / total_probability

    return isGood, isBad, normalized_isGood, normalized_isBad


if __name__ == '__main__':
    dataSet, testSet, labels = loadDataSet()
    testSet = [testSet]
    df = pd.DataFrame(testSet, columns=labels, index=[1])
    print("=======================待测样本========================")
    print(f"待测集:\n{df}")

    isGood, isBad, normalized_isGood, normalized_isBad = bayes()
    print("=======================后验概率========================")
    print("后验概率:")
    print(f"好瓜后验概率分子: {isGood}")
    print(f"坏瓜后验概率分子: {isBad}")
    print(f"P(好瓜|xi) = {normalized_isGood}")
    print(f"P(坏瓜|xi) = {normalized_isBad}")
    print("=======================预测结果========================")
    print("predict ---> 好瓜" if (normalized_isGood > normalized_isBad) else "predict ---> 坏瓜")

2.3.5 思维导图总结

在这里插入图片描述


http://www.kler.cn/news/358109.html

相关文章:

  • poisson过程——随机模拟(Python和R实现)
  • Element-ui官方示例(Popover 弹出框)
  • 微信小程序应用echarts和二维表的结合
  • 动态规划-子数组系列——乘积最大子数组
  • 【面试11】嵌入式之模电/数电
  • setState更新状态的2种写法
  • 高级算法设计与分析 学习笔记14 FFT
  • Axure科技感元件:打造可视化大屏设计的得力助手
  • CMake技术细节:解决未定义,提供参数
  • 基于MATLAB的交通标志的识别
  • ARM嵌入式学习--第四天
  • Flutter Column和Row组件
  • java-实例化一个List并添加数据的方法
  • yolov8实例分隔
  • 胤娲科技:AI大模型的隐秘战争——当“智能”成为双刃剑
  • 会议点名人员crud-web前端Vue3多选调用示例
  • docker 数据管理,数据持久化详解 二 数据卷容器
  • git命令使用一览【自用】
  • 《Effective C++》 笔记
  • VLAN虚拟技术