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

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 = 0countB = 0countAll = len(dataSet)for item in dataSet:if item[-1] == "好瓜":countG += 1for 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 = 0countB = 0for item in dataSet:if item[-1] == "好瓜":countG += 1for item in dataSet:if item[-1] == "坏瓜":countB += 1lst = [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_GisBad = P_B * P0_B * P1_B * P2_B * P3_B * P4_B * P5_B * p_density_B * p_sugar_Btotal_probability = isGood + isBadnormalized_isGood = isGood / total_probabilitynormalized_isBad = isBad / total_probabilityreturn isGood, isBad, normalized_isGood, normalized_isBadif __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.mzph.cn/news/881973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

哪科竞赛含金量更高?五大学科竞赛含金量排名

2024年五大学科竞赛赛事已经渐渐拉开帷幕&#xff0c;本月底国内不少地区即将举行生物竞赛预赛的赛事。今天我们一起来看看五大学科竞赛哪科竞赛含金量更高。 高中五大学科竞赛&#xff08;数物化生信&#xff09;是升学路上的硬通货&#xff0c;比如说在强基破格中需要五大竞赛…

揭秘提升3DMAX效率的6款必备神级插件!

对于3DMax新手来说,掌握一些高效、实用的插件能够大大提升工作效率和创作质量。以下是6个不能错过的神级插件推荐: 第1个:3DMAX造山地形插件Mountain是一款专为3dMax设计的插件,旨在帮助用户轻松快速地创建逼真的山脉地形。以下是对该插件的详细介绍: 一、插件概述 Mou…

Xilinx远程固件升级(一)——QuickBoot方案

Xilinx 7系FPGA远程更新方案——QuickBoot方式远程更新bit 一、远程更新背景和架构 对于非ZYNQ系列的常规FPGA来说&#xff0c;对于bit的更新一般使用JTAG进行烧录。而作为商用产品&#xff0c;想要进行OTA升级时&#xff0c;使用JTAG的升级方式显然不适合&#xff0c;因此&a…

Java | Leetcode Java题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; class Solution {public boolean PredictTheWinner(int[] nums) {int length nums.length;int[] dp new int[length];for (int i 0; i < length; i) {dp[i] nums[i];}for (int i length - 2; i > 0; i--) {for (int j i 1; j …

计算机毕业设计Python动漫视频分析可视化 动漫影视可视化 动漫情感分析 动漫爬虫 机器学习 深度学习 Tensorflow PyTorch LSTM模型

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系名片 &#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系名片 &#xff01; 温馨提示&#xff1a;文末有SDN 平台官方提供的学长联系名片 &#xff01; 基于Python的B站排行榜大数据分析与可视化系统…

最短路问题之dijikstra算法

//根据bfs修改而来 #include<stdio.h> #include<stdlib.h> typedef struct queue {int data;struct queue* next; }queue, * linklist; float dist_list[9]; //出发点为0 int forward_point_list[9] { -1 }; linklist front NULL; linklist rear NULL; float ma…

计算机的错误计算(一百二十五)

摘要 探讨算式 的计算精度问题。 例1. 已知 计算 不妨在 Excel 的单元格中计算&#xff0c;则有&#xff1a; 若在 Python 中计算&#xff0c;则似乎有更为精确的结果&#xff1a; 然而&#xff0c;16位的正确值是 0.3499999999999998e1&#xff08;ISRealsoft 提供&a…

前后端请求一致性学习

在进行前后端分离开发项目的过程中&#xff0c;前后端同学往往需要依照接口文档的基本信息以及相应的响应格式进行接口请求的开发&#xff0c;在这个过程中涉及到常见的Get、Post、Put、Patch等等的请求&#xff0c;相应的前后端的书写格式是什么&#xff0c;这篇文章进行一个记…

数据链中常见电磁干扰matlab仿真,对比噪声调频,线性调频,噪声,扫频,灵巧五种干扰模型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 噪声调频干扰 4.2 线性调频干扰 4.3 噪声干扰 4.4 扫频干扰 4.5 灵巧干扰 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3…

Go语言中的时间比较与时区处理

文章目录 问题背景问题分析验证时区问题 解决方案方法 1&#xff1a;使用本地时区解析时间方法 2&#xff1a;将 time.Now() 转换为 UTC 最终结果总结 在后端开发中&#xff0c;时间处理往往是不可避免的&#xff0c;尤其是涉及到跨时区的应用时&#xff0c;时区问题常常会引发…

【黑马redis高级篇】持久化

//来源[01,05]分布式缓存 除了黑马&#xff0c;还参考了别的。 目录 1.单点redis问题及解决方案2.为什么需要持久化&#xff1f;3.Redis持久化有哪些方式呢&#xff1f;为什么我们需要重点学RDB和AOF&#xff1f;4.RDB4.1 定义4.2 触发方式4.2.1手动触发save4.2.2被动触发bgsa…

开源项目 - yolo v5 物体检测 手检测 深度学习

开源项目 - yolo v5 物体检测 手检测 深度学习 开源项目地址&#xff1a;https://gitcode.net/EricLee/yolo_v5 ​​ 助力快速掌握数据集的信息和使用方式。 数据可以如此美好&#xff01;

数据结构 ——— 顺序表oj题:验证回文串

目录 题目要求 代码实现 题目要求 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xf…

JavaSE——集合4:List接口实现类—LinkedList

目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…

Vue 3 和 Vue Router 使用 createWebHistory 配置

在 Vue 3 项目中&#xff0c;如果使用 Vue Router 并希望启用 HTML5 History 模式&#xff0c;需要在创建路由器实例时传入 createWebHistory 作为历史模式的配置。此外&#xff0c;还需要确保在生产环境中设置正确的基本路径&#xff08;base&#xff09;&#xff0c;这样才能…

数据结构——顺序表的基本操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建&#xff0c;并没有使用顺序表指针的方法&#xff0c;具体两个…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…

vue elementui table编辑表单时,弹框增加编辑明细数据

需求: 前端进行新增表单时&#xff0c;同时增加表单的明细数据。明细数据部分&#xff0c;通过弹框方式增加或者编辑。 效果图&#xff1a; 代码&#xff1a; <!-- 新增主表弹窗 Begin --><el-dialog:title"titleInfo"top"5vh"centerwidth"…