【人工智能与机器学习】——朴素贝叶斯与支持向量机(学习笔记)

news2024/11/15 19:59:45

📖 前言:朴素贝叶斯(Naive Bayes)和支持向量机(Support Vector Machine,SVM)是两种不同的机器学习算法,它们都用于分类。朴素贝叶斯算法基于贝叶斯定理来进行分类,它是一种生成模型,它预测一个样本属于某个类别的概率。相比之下,支持向量机是一种判别模型,它用于寻找数据空间的最大边界来进行分类。

在这里插入图片描述


目录

  • 🕒 1. 概率知识回顾
  • 🕒 2. 训练贝叶斯
  • 🕒 3. 朴素贝叶斯分类器
    • 🕘 3.1 优缺点
    • 🕘 3.2 拉普拉斯平滑技术
    • 🕘 3.3 朴素贝叶斯模型的类型
    • 🕘 3.4 结合不同的特征类型
    • 🕘 3.5 语法
  • 🕒 4. 支持向量机概述
  • 🕒 5. SVM分类
    • 🕘 5.1 SVM对离群值的敏感性
    • 🕘 5.2 语法
  • 🕒 6. 核函数
    • 🕘 6.1 常用核函数
    • 🕘 6.2 案例分析
      • 🕤 6.2.1 多项式核函数
      • 🕤 6.2.2 升维再分类
      • 🕤 6.2.3 高斯核函数
    • 🕘 6.3 语法
      • 🕤 6.3.1 使用核函数的SVM
      • 🕤 6.3.2 快速核转换(了解)
  • 🕒 7. SVM的参数优化
    • 🕘 7.1 正则化参数C
    • 🕘 7.2 gamma参数
  • 🕒 8. 综合案例:垃圾邮件识别
  • 🕒 9. 逻辑回归VS支持向量机
    • 🕘 9.1 选用策略
  • 🕒 10. 课后习题

🕒 1. 概率知识回顾

在这里插入图片描述
贝叶斯公式:
P ( C ∣ X ) = P ( X ∣ C ) ∗ P ( C ) P ( X ) P(C \mid X)=\frac{P(X \mid C) * P(C)}{P(X)} P(CX)=P(X)P(XC)P(C)

下面来了解各个成分的含义:

  • P(C | X),是给定某个对象X,它属于类别C的后验概率。
  • P(C),是类别C的先验概率。
  • P(X | C),是给定类别C的条件下,它是对象X的条件概率。
  • P(X),是对象X的先验概率。

例如,在新冠病毒诊断中,X表示各个症状的情况,C表示诊断的结果,它有两个值,分别是有病和没病。P(C | X)就表示给定当前症状情况的诊断结果,有病和没病的概率分别是多少,对其预测是一件非常困难的事情,于是可以利用一些先验概率来计算和比较。P(X)表示症状发生的先验概率。P©表示有病或没病的先验概率,比如1000个人里面,100个人有病,900个人没病,那么P(C=有病)=0.1,P(C=没病)=0.9。P(X | C)表示在有病或者没病的情况下,具有症状情况X的概率是多少。此外,根据症状程度,我们也可以划分为轻微、中度、严重

 发热   干咳   乏力   鼻塞流涕   咽痛   腹泻   诊断   轻微   严重   轻微   中度   无   无   否   中度   轻微   中度   中度   轻微   无   是   无   轻微   无   轻微   无   无   否   严重   无   严重   中度   轻微   无   是   轻微   无   中度   无   中度   轻微   否  \begin{array}{|c|c|c|c|c|c|c|} \hline \text { 发热 } & \text { 干咳 } & \text { 乏力 } & \text { 鼻塞流涕 } & \text { 咽痛 } & \text { 腹泻 } & \text { 诊断 } \\ \hline \text { 轻微 } & \text { 严重 } & \text { 轻微 } & \text { 中度 } & \text { 无 } & \text { 无 } & \text { 否 } \\ \hline \text { 中度 } & \text { 轻微 } & \text { 中度 } & \text { 中度 } & \text { 轻微 } & \text { 无 } & \text { 是 } \\ \hline \text { 无 } & \text { 轻微 } & \text { 无 } & \text { 轻微 } & \text { 无 } & \text { 无 } & \text { 否 } \\ \hline \text { 严重 } & \text { 无 } & \text { 严重 } & \text { 中度 } & \text { 轻微 } & \text { 无 } & \text { 是 } \\ \hline \text { 轻微 } & \text { 无 } & \text { 中度 } & \text { 无 } & \text { 中度 } & \text { 轻微 } & \text { 否 } \\ \hline \end{array}  发热  轻微  中度    严重  轻微  干咳  严重  轻微  轻微      乏力  轻微  中度    严重  中度  鼻塞流涕  中度  中度  轻微  中度    咽痛    轻微    轻微  中度  腹泻          轻微  诊断           

我们可以把每个症状都单独计算一遍,但实际并不需要这么做
P ( X ) = ∑ Z P ( X , Z ) = ∑ Z P ( X ∣ Z ) ∗ P ( Z ) P(X)=\sum_{Z} P(X, Z)=\sum_{Z} P(X \mid Z) * P(Z) P(X)=ZP(X,Z)=ZP(XZ)P(Z)
P ( C ∣ X ) = P ( X ∣ C ) ∗ P ( C ) P ( X ) P(C \mid X)=\frac{P(X \mid C) * P(C)}{P(X)} P(CX)=P(X)P(XC)P(C)
 posterior  =  likelihood  ∗  prior   evidence  \text { posterior }=\frac{\text { likelihood } * \text { prior }}{\text { evidence }}  posterior = evidence  likelihood  prior 

🕒 2. 训练贝叶斯

给定特征向量(𝑋),计算其属于每个类别(C)的概率
P ( C ∣ X ) = P ( X ∣ C ) ∗ P ( C ) P(C \mid X)=P(X \mid C) * P(C) P(CX)=P(XC)P(C)
很难计算所有特征的联合概率
P ( C ∣ X ) = P ( X 1 , X 2 , … , X n ∣ C ) ∗ P ( C ) = P ( X 1 ∣ X 2 , … , X n , C ) ∗ P ( X 2 , … , X n ∣ C ) ∗ P ( C ) P(C \mid X)=P\left(X_{1}, X_{2}, \ldots, X_{n} \mid C\right) * P(C) \\ \hspace{1.5cm}=P\left(X_{1} \mid X_{2}, \ldots, X_{n}, C\right) * P\left(X_{2}, \ldots, X_{n} \mid C\right) * P(C) P(CX)=P(X1,X2,,XnC)P(C)=P(X1X2,,Xn,C)P(X2,,XnC)P(C)
解决方案:假设给定类别,所有特征相互独立
P ( C ∣ X ) = P ( X 1 ∣ C ) ∗ P ( X 2 ∣ C ) ∗ P ( X n ∣ C ) ∗ P ( C ) P(C \mid X)=P\left(X_{1} \mid C\right) * P\left(X_{2} \mid C\right) * P\left(X_{n} \mid C\right) * P(C) P(CX)=P(X1C)P(X2C)P(XnC)P(C)
这就是“朴素”的假设
P ( C ∣ X ) = P ( C ) ∏ i = 1 n P ( X i ∣ C ) P(C \mid X)=P(C) \prod_{i=1}^{n} P\left(X_{i} \mid C\right) P(CX)=P(C)i=1nP(XiC)
按照最大后验概率规则,把X分入概率最大的类别
argmax ⁡ k ∈ { 1 , … K } P ( C k ) ∏ i = 1 n P ( X i ∣ C k ) \frac{\operatorname{argmax}}{k \in\{1, \ldots K\}} P\left(C_{k}\right) \prod_{i=1}^{n} P\left(X_{i} \mid C_{k}\right) k{1,K}argmaxP(Ck)i=1nP(XiCk)
很多概率值连乘,容易造成浮点计算下界溢出
取对数把乘法转化成加法
log ⁡ ( P ( C k ) ) ∑ i = 1 n log ⁡ ( P ( X i ∣ C k ) ) \log \left(P\left(C_{k}\right)\right) \sum_{i=1}^{n} \log \left(P\left(X_{i} \mid C_{k}\right)\right) log(P(Ck))i=1nlog(P(XiCk))

🕒 3. 朴素贝叶斯分类器

接下来,我们用预测打网球这个案例展开讲解
在这里插入图片描述
使用训练数据构建概率查找表

在这里插入图片描述
预测下面情境下是否打网球:
x’=(Outlook=Sunny, Temperature=Cool, Humidity=High, Wind=Strong)

P (  yes | sunny, cool, high, strong  ) = P (  sunny | yes  ) × P (  cool | yes  ) × P (  high | yes  ) × P (  strong | yes  ) × P (  yes  ) P (  no | sunny, cool, high, strong  ) = P (  sunny | no  ) × P (  cool | no  ) × (  high | no  ) × P (  strong | no  ) × P (  no  ) P(\text { yes | sunny, cool, high, strong })=P(\text { sunny | yes }) \times P(\text { cool | yes }) \times P(\text { high | yes }) \times P(\text { strong | yes }) \times P(\text { yes }) \\ P(\text { no | sunny, cool, high, strong })=P(\text { sunny | no }) \times P(\text { cool | no }) \times (\text { high | no }) \times P(\text { strong | no }) \times P(\text { no }) P( yes | sunny, cool, high, strong )=P( sunny | yes )×P( cool | yes )×P( high | yes )×P( strong | yes )×P( yes )P( no | sunny, cool, high, strong )=P( sunny | no )×P( cool | no )×( high | no )×P( strong | no )×P( no )

在这里插入图片描述
结果是否

🕘 3.1 优缺点

优点:
(1)原理简单,容易实现。
(2)很容易进行模型训练,适合各种规模的数据集。
(3)运行速度快,除二分类问题之外,它在多分类问题上也表现良好。由于运行速度快,可以利用朴素贝叶斯分类器进行实时预测,这在需要实时处理的场景中是非常有用的。
(4)如果各变量之间确实是相互独立的,那么朴素贝叶斯分类器和其他分类器如逻辑回归模型相比,有时候分类的准确性更好,而且需要更少的训练数据。
(5)即便模型包含无关的输人变量,模型的表现(分类准确性)也很好。

缺点:
(1)它假设变量之间是相互独立的,而这在实际中往往不成立。
(2)如果某个类别变量的取值在测试数据集中出现,但是在训练集中没有出现过(比如身高值是个线性值),那么分类器给一个为0的概率,导致整个计算结果是0,就无法进行正确预测了。零概率问题可以通过平滑技术来处理,拉普拉斯平滑技术是常见的一种方法。
(3)对于数值型变量,一般假设是正态分布,这是一个较强的假设,有时候实际情况并非如此。

🕘 3.2 拉普拉斯平滑技术

零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是0。这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该事件的概率为0)。

拉普拉斯平滑(Laplacian smoothing)就是为了解决零概率的问题而产生。方法是在这些条件概率的分子和分母上各加 α α α α ∗ C o u n t ( X i ) α*Count(X_i) αCount(Xi)(α-拉普拉斯平滑系数,常取1,Count(Xi)为特征Xi的不同取值数,比如X1有3个选项,那么Count(X1)为3, n c n_c nc即类别数目)

P ( C ∣ X ) = P ( X 1 ∣ C ) ∗ P ( X 2 ∣ C ) ∗ P ( C ) P(C \mid X)=P\left(X_{1} \mid C\right) * P\left(X_{2} \mid C\right) * P(C) P(CX)=P(X1C)P(X2C)P(C)
假设 P ( X 1 ∣ C ) P(X_{1} \mid C) P(X1C)的值为0,那么公式应该如下:
P ( X 1 ∣ C ) = 0 + 1 Count ⁡ ( X 1 ) + n c P\left(X_{1} \mid C\right)=\frac{0+1}{\operatorname{Count}(X_1)+n_c} P(X1C)=Count(X1)+nc0+1
P ( X 2 ∣ C ) = X 2 + 1 Count ⁡ ( X 2 ) + n c P\left(X_{2} \mid C\right)=\frac{X_2+1}{\operatorname{Count}(X_2)+n_c} P(X2C)=Count(X2)+ncX2+1

🕘 3.3 朴素贝叶斯模型的类型

朴 素 贝 叶 斯 模 型 数 据 类 型 伯 努 利 模 型 二 值 ( T / F ) 多 项 式 模 型 离 散 值 ( 如 , 计 数 ) 高 斯 模 型 连 续 值 \begin{array}{|l|l|} \hline 朴素贝叶斯模型 & 数据类型 \\ \hline 伯努利模型 & 二值 (T/F) \\ \hline 多项式模型 & 离散值 (如, 计数) \\ \hline 高斯模型 & 连续值 \\ \hline \end{array} (T/F)(,)

不同朴素贝叶斯模型的区别,主要在于它们对概率分布 𝑃 ( 𝑋 i ∣ C ) 𝑃(𝑋_i|C) P(XiC)所做的不同假设。

下面是相关类型的介绍,了解即可(来源:普通高中教科书 粤教版 信息技术 选择性必修4 人工智能初步 P60)
在这里插入图片描述

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

🕘 3.4 结合不同的特征类型

问题:模型特征包含不同的数据类型(连续的和类别的)

解决方案:
方案1:将连续特征离散化成类别变量,然后应用多项式模型
方案2:用高斯模型拟合连续特征,用多项式模型拟合分类变量,然后再结合成一个“元模型”(后面章节会讲到)
(如特征 X i X_i Xi取连续值,假设p(Xi | C)~N( μ , σ 2 \mu,\sigma^2 μ,σ2),根据训练样本数据估算 μ , σ 2 \mu,\sigma^2 μ,σ2)

🕘 3.5 语法

导入包含朴素贝叶斯分类方法的类:

from sklearn.naive_bayes import BernoulliNB
# BernoulliNB:假设所有特征都符合BernoulliNB分布,其他还有MultinomialNB,GaussianNB(适用于特征值连续)等

创建该类的一个对象:

BNB = BernoulliNB(alpha=1.0) # 拉普拉斯平滑参数

拟合训练数据,并预测:

BNB = BNB.fit(X_train, y_train)  
y_predict = BNB.predict(X_test)

在线文档:🔎 朴素贝叶斯的文档

BernoulliNB:假设所有特征都符合BernoulliNB分布,其他还有MultinomialNB,GaussianNB(适用于特征值连续)等

🕒 4. 支持向量机概述

在逻辑回归那一篇中,我们提到过癌症病人治疗5年之后的状况的例子

在这里插入图片描述

从样本点数据(含N个特征x,标签y)的几何分布看,假如N维特征样本空间可以用线性平面(隐函数形式为 ω x + b = 0 \omega x+b=0 ωx+b=0,显函数形式 f ( x ) = ω x + b f(x)=\omega x+b f(x)=ωx+b分隔成两部分:

  • f ( x ) < 0 f(x)<0 f(x)<0,其中样本 i i i均为负类(类别 y i = − 1 y_i=-1 yi=1
  • f ( x ) > 0 f(x)>0 f(x)>0,其中样本 i i i均为正类(类别 y i = 1 y_i=1 yi=1

则该平面称为分类超平面,分类任务即可描述为求该超平面(函数参数)问题,为线性可分问题。

而这个例子的特征向量为一维(样本点有1个特征),超平面可用隐函数 x + b = 0 x+b=0 x+b=0((显函数形式 x = b x=b x=b,形状为一个点)定义

在这里插入图片描述
如样本点有两个特征,则超平面可用隐函数 ω 1 x 1 + ω 2 x 2 + b = 0 \omega_1x_1+\omega_2x_2+b=0 ω1x1+ω2x2+b=0(显函数形式 f ( x ) = w 1 x 1 + b f(x)=w_1x_1+b f(x)=w1x1+b)定义。

回到上面的例子,其中第③幅图无分类错误,但是否是最佳的分类位置?
在这里插入图片描述
可以看到结果未必,如果以后有新的样本加入,判断也会出问题。

那么这个分类边界应该怎么划分,才比较可靠呢?

答案就是:最大化类别之间的区域
在这里插入图片描述

Margin(间隔)r:定义为N个样本点到分类超平面的最小距离。根据平面几何知识可推得 X i X_i Xi f ( x ) = ω x + b f(x)=\omega x+b f(x)=ωx+b的距离为 M a r g i n ( x i ) = f ( x i ) ( ∣ ∣ ω ∣ ∣ 2 ) Margin(x_i)=\frac{f(x_i)}{(||\omega||_2)} Margin(xi)=(ω2)f(xi),其中 ∣ ∣ ω ∣ ∣ 2 ||\omega||_2 ω2为向量 ω \omega ω的L2长度(L2长度就是之前讲过的欧氏距离)。为了使得分类置信度高,间隔应最大,分类超平面应在两类正中间。离超平面最近的样本点称为支持向量,故分类器称为支持向量机。而其他样本点称为非支持向量。直观上,Margin越大,即“分类安全距离“越大,根据超平面分类结果越可靠

我们将其推广到一般,假设分类超平面 f ( x ) = ω T x + b f(x)=\omega^T x+b f(x)=ωTx+b,样本空间中任意点 a a a到超平面 ( ω , b ) (\omega,b) (ω,b)的距离可写为:
r = ∣ ω T x + b ∣ ∣ ∣ ω ∣ ∣ r=\frac{\vert \omega^T x+b\vert}{||\omega||} r=ωωTx+b
假设超平面 ( ω , b ) (\omega,b) (ω,b)能将训练样本正确分类,即对于 x i , y i ∈ D x_i,y_i \in D xi,yiD,若 y i + 1 y_i+1 yi+1,则 ω T x i + b > 0 \omega^T x_i+b>0 ωTxi+b>0;若 y i = − 1 y_i=-1 yi=1,则有 ω T x i + b < 0 \omega^T x_i+b<0 ωTxi+b<0。令
{ w T x i + b ⩾ + 1 , y i = + 1 w T x i + b ⩽ − 1 , y i = − 1 \begin{array}{l} \left\{\begin{array}{l} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \geqslant+1, \quad y_{i}=+1 \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \leqslant-1, \quad y_{i}=-1 \end{array}\right. \end{array} {wTxi+b+1,yi=+1wTxi+b1,yi=1
两个异类支持向量到超平面的距离之和为:
γ = 2 ∥ w ∥ \gamma=\frac{2}{\|\boldsymbol{w}\|} γ=w2
它就是间隔,欲找到具有“最大间隔”(maximum margin)的划分超平面,也就是要找到能满足定义式中约束的参数 ω \omega ω b b b,使得 γ \gamma γ最大,即
max ⁡ w , b 2 ∥ w ∥  s.t.  y i ( w T x i + b ) ⩾ 1 , i = 1 , 2 , … , m \max _{\boldsymbol{w}, b} \frac{2}{\|\boldsymbol{w}\|} \\ \text { s.t. } y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1, \quad i=1,2, \ldots, m w,bmaxw2 s.t. yi(wTxi+b)1,i=1,2,,m
显然,为了最大化间隔,仅需最大化 ∥ w ∥ − 1 \|\boldsymbol{w}\|^{-1} w1,这等价于最小化 ∥ w ∥ 2 \|\boldsymbol{w}\|^2 w2。于是,式子可重写为
min ⁡ w , b 1 2 ∥ w ∥ 2  s.t.  y i ( w T x i + b ) ⩾ 1 , i = 1 , 2 , … , m \min _{\boldsymbol{w}, b} \quad \frac{1}{2}\|\boldsymbol{w}\|^{2} \\ \text { s.t. } y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1, \quad i=1,2, \ldots, m w,bmin21w2 s.t. yi(wTxi+b)1,i=1,2,,m
这就是支持向量机的基本型。

求解分类平面参数的问题即为求约束条件下的极小值问题。先后采用拉格朗日乘法子对偶算法,可将上述问题可转为非约束条件下的极值问题和对偶问题。

至于其中数学原理,大脑已宕机,不愿再展开~~

在这里插入图片描述

🕒 5. SVM分类

两个特征(nodes, age)
两类标签(survived, lost)

在这里插入图片描述
划分过程和前面类似
在这里插入图片描述

🕘 5.1 SVM对离群值的敏感性

在这里插入图片描述

实际应用中,这个划分边界可能并非这么好找,万一出现了离群点(outliers),那就变成下面这么划分吗?
在这里插入图片描述
显然是错误的,原来的划分线仍然是最优的选择

在这里插入图片描述
我们引入松弛因子(slack variables)这个概念,简单点说,就是让目标函数的约束不用那么强,即这个离群点不能套用正常的目标函数,其惩罚代价应该更大。

🕘 5.2 语法

导入包含分类方法的类:

from sklearn.svm import LinearSVC

创建该类的一个对象:

linSVC = LinearSVC(penalty='l2', C=10.0)	# 正则化参数,可用交叉验证调节

拟合训练数据,并预测测试数据:

linSVC = linSVC.fit(X_train, y_train)
y_predict = linSVC.predict(X_test)

在线文档:🔎 线性SVM的语法

🕒 6. 核函数

在前面的讨论中,我们假设训练样本是线性可分的,即存在一个划分超平面能将训练样本正确分类,然而在现实任务中,原始样本空间内也许并不存在一个能正确划分两类样本的超平面,我们就需要进行转化。方法是:将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分

在这里插入图片描述
如下图,将原始的二维空间映射到一个合适的三维空间,就能找到一个合适的划分超平面。幸运的是,如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。
在这里插入图片描述

上面的处理方法称为核函数技巧(kernel trick)将数据从低维空间映射到高维空间的过程非常耗时,计算量很大。对低维空间的每个数据点(向量)进行这样的转换代价太大,需要寻找更加简单的处理办法。

举个具体的例子:
在这里插入图片描述
例如样本有特征 x 1 , x 2 x_1, x_2 x1,x2,非线性可分(决策边界为圆形),但升维 z = x 1 2 + x 2 2 z=x^2_1+x^2_2 z=x12+x22后,可用平面 Z = 4 Z=4 Z=4线性可分。

支持向量机模型,并不需要高维空间里的实际向量来进行最优平面的寻找,实际上,它仅仅需要向量之间的点积。这样就可以避免对数据进行实际的升维,想办法计算两个向量在高维空间中的点积即可。

核函数定义:对任意 κ ( x i , x j ) \kappa(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}) κ(xi,xj),如 κ ( x i , x j ) = < Φ ( x i ) , Φ ( y j ) > \kappa(\boldsymbol{x}_{i}, \boldsymbol{x}_{j})=<\Phi(x_i), \Phi(y_j)> κ(xi,xj)=<Φ(xi),Φ(yj)>(向量积)算,则 κ ( x i , x j ) \kappa(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}) κ(xi,xj)为核函数。

🕘 6.1 常用核函数

 名称   表达式   参数   线性核  κ ( x i , x j ) = x i T x j  多项式核  κ ( x i , x j ) = ( x i T x j ) d d ⩾ 1  为多项式的次数   高斯核(RBF核)  κ ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) σ > 0  为高斯核的带宽(width)   拉普拉斯核  κ ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ σ ) σ > 0  Sigmoid 核  κ ( x i , x j ) = tanh ⁡ ( β x i T x j + θ ) tanh ⁡  为双曲正切函数,  β > 0 , θ < 0 \begin{array}{lll} \hline \text { 名称 } & \text { 表达式 } & \text { 参数 } \\ \hline \text { 线性核 } & \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j} & \\ \text { 多项式核 } & \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left(\boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}\right)^{d} & d \geqslant 1 \text { 为多项式的次数 } \\ \text { 高斯核(RBF核) } & \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\exp \left(-\frac{\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|^{2}}{2 \sigma^{2}}\right) & \sigma>0 \text { 为高斯核的带宽(width) } \\ \text { 拉普拉斯核 } & \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\exp \left(-\frac{\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|}{\sigma}\right) & \sigma>0 \\ \text { Sigmoid 核 } & \kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\tanh \left(\beta \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}+\theta\right) & \tanh \text { 为双曲正切函数, } \beta>0, \theta<0 \\ \hline \end{array}  名称  线性核  多项式核  高斯核(RBF核)  拉普拉斯核  Sigmoid   表达式 κ(xi,xj)=xiTxjκ(xi,xj)=(xiTxj)dκ(xi,xj)=exp(2σ2xixj2)κ(xi,xj)=exp(σxixj)κ(xi,xj)=tanh(βxiTxj+θ) 参数 d1 为多项式的次数 σ>0 为高斯核的带宽(width) σ>0tanh 为双曲正切函数β>0,θ<0

🕘 6.2 案例分析

金棕榈奖(Golden Palm Award)是法国戛纳国际电影节的最高奖项,创立于1957年,每年颁发一次。接下来我们需要根据样本分析金棕榈奖得主。
在这里插入图片描述

🕤 6.2.1 多项式核函数

通过提取一些高阶特征来转换数据.
Budget2 + Rating2 +Budget * Rating +…

在这里插入图片描述

🕤 6.2.2 升维再分类

方法:使用高斯分布函数将样本空间(原特征2个)映射到新空间坐标系(新特征3个,原特征舍弃不用)。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

🕤 6.2.3 高斯核函数

高斯(Radial Basis Function,RBF,又叫径向基)核函数
在这里插入图片描述

🕘 6.3 语法

🕤 6.3.1 使用核函数的SVM

导入包含分类方法的类:

from sklearn.svm import SVC

创建该类的一个对象:

rbfSVC = SVC(kernel='rbf', gamma=1.0, C=10.0)	# 设置核函数,及其相应参数(gamma),C是错误项的惩罚力度

其中 γ = 1 𝟐 σ 2 \gamma = \frac{1}{𝟐\sigma^2} γ=2σ21 γ \gamma γ越大,帽子越窄,决策平面附近影响决策平面的向量越少(或者说每个样本点仅产生较近距离的影响),其权重越大,决策边界越崎岖曲折,模型越复杂,过大易过拟合。

拟合训练数据,并预测:

rbfSVC = rbfSVC.fit(X_train, y_train)
y_predict = rbfSVC.predict(X_test)

在线文档:🔎 使用核函数的SVM的语法

用交叉验证调节核函数及其参数

🕤 6.3.2 快速核转换(了解)

问题:使用RBF核函数的SVM,在大量特征或数据时,训练速度非常慢,也就是特征过载

解决:使用Nystroem或RBF sampler构建近似核映射,拟合一个线性分类器

Nystroem
导入包含分类方法的类:

from sklearn.kernel_approximation import Nystroem

创建该类的一个对象:

nystroemSVC = Nystroem(kernel='rbf', gamma=1.0, n_components=100)	# 可以使用多种非线性核函数,kernel和gamma与SVC相同,n_components是样本量

拟合训练数据,并转换:

X_train = nystroemSVC.fit_transform(X_train)
X_test = nystroemSVC.transform(X_test)

使用交叉检验调节核参数和n_components

在线文档:🔎 Nystroem构建核映射的语法

RBF sampler
导入包含分类方法的类:

from sklearn.kernel_approximation import RBFsampler

创建该类的一个对象:

rbfsample = RBFsampler(gamma=1.0, n_components=100)	# RBF 是唯一可用的核函数,参数名与前面的相同

拟合训练数据,并转换:

X_train = rbfsample.fit_transform(X_train)
X_test = rbfsample.transform(X_test)

使用交叉检验调节核参数和n_components
在线文档:🔎 RBFsampler构建核映射的语法

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

🕒 7. SVM的参数优化

🕘 7.1 正则化参数C

正则化参数C,是错误项的惩罚系数,即对误差的宽容度。C越大,说明越不能容忍出现误差,容易过拟合;C越小,越容易欠拟合。C过大或过小,泛化能力均变差。选取恰当的C值,会对决策边界的平滑度和分类器对数据点分类的正确性进行折中平衡。

当采用更大的C时,分类器能够对更多的数据点进行正确分类,也就是对数据点的拟合程度更好,当然分类的决策边界也越来越曲里拐弯了,不是那么平滑。

在这里插入图片描述
所以需要对参数C进行选择,以便在平滑的决策边界和分类正确性之间折中。可以通过实验,在现有的数据集上获得更平滑的分类决策边界,避免过拟合,同时又达到较高的分类正确率。

🕘 7.2 gamma参数

gamma是选择径向基核函数之后,该函数自带的一个参数,隐含地决定了数据映射到新的特征空间后的分布。gamma值越大,支持向量越少;gamma值越小,支持向量越多。

gamma参数定义了在确定决策边界时,各个数据点的影响力到底有多远。如果gamma参数的值较小,则意味着每个数据点产生较远的影响,如果 gamma参数的值较大,意味着每个数据点产生较近距离的影响。

换句话说,如果gamma的值较大,那么决策边界依赖于决策边界附近的数据点,距离较远的数据点的影响力降低,甚至被直接忽略掉。由于更接近决策边界的数据点的权重更大,导致决策边界表现出曲里拐弯的特点。如果gamma参数的值较小,那么在确定决策边界的时候,把较远的数据点也考虑进来,分类的决策边界变得更加平滑。

参数gamma和C
在这里插入图片描述

🕒 8. 综合案例:垃圾邮件识别

导入

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, confusion_matrix, f1_score

读取csv文件,把csv文件读到一个Pandas 的 DataFrame对象里。然后对数据里面的NULL值,用空字符串,即’ '来代替。

原始csv文件如下:

在这里插入图片描述

df1=pd.read_csv("spamham.csv")
df=df1.where((pd.notnull(df1)), '')

对Category列进行变换,将取值ham(垃圾邮件)和 spam(非垃圾邮件)分别改成1或者0,以便进行后续机器学习模型的训练。

df.loc[df["Category"] == 'ham', "Category"]=1
df.loc[df["Category"] == 'spam', "Category"]=0

把Message列作为x,Category 列作为y。

df_x=df['Message']
df_y=df['Category']

把x和y划分成训练集和测试集,分别占原有数据集的80%和20%。

x_train, x_test, y_train, y_test=train_test_split(df_x, df_y, test_size=0.2)

把 Message数据列,也就是x的文本转换成机器学习的特征值。在这里采用文本的TF-IDF特征,TF表示单个文档里的某个词项的频率,IDF表示整个文集中词项的逆文档频率。IDF把在很多文档中都出现的但对于文档的类别划分没有太多贡献的词项的重要性降低。

tfvec=TfidfVectorizer(min_df=1, stop_words='english', lowercase=True)	# 最小是一个单词、文本是英文、全部转为小写
x_trainFeat=tfvec.fit_transform(x_train)
x_testFeat=tfvec.transform(x_test)

创建朴素贝叶斯分类模型,对其进行训练,并且利用模型对测试集进行预测。

# 多项式模型,x_trainFeat中特征(词)元素值表示词频信息,假设其满足多项式分布
y_trainGnb=y_train.astype('int')
classifierModel=MultinomialNB()
classifierModel.fit(x_trainFeat, y_trainGnb)
y_pred=classifierModel.predict(x_testFeat)

把测试集的y转换成整数形式,对上述模型的预测值进行比较,显示分类器的精度、F1分数,以及混淆矩阵。

y_test=y_test.astype('int')
print("Accuracy Score: {0:.4f}".format(accuracy_score(y_test, y_pred)*100))
print("F1 Score:{0: .4f}".format(f1_score(y_test, y_pred, average='macro')*100))
print("Confusion matrix:")
print(confusion_matrix(y_test, y_pred))

Accuracy Score : 97.2197 F1 Score : 93.2741 Confusion matrix : [   [   115 31   ]    [   0    969   ]   ] \text{Accuracy Score}:97.2197 \\ \text{F1 Score}: 93.2741 \\ \text{Confusion matrix}: \\ [ \ [ \ 115 \quad 31 \ ] \\ \ \ [ \quad \ 0 \ \ 969 \ ] \ ] Accuracy Score97.2197F1 Score:93.2741Confusion matrix:[ [ 11531 ]  [ 0  969 ] ]

可以从两个方面改善上述模型,进一步提高分类器的分类准确率:
(1)词形还原。把一个单词的不同词形还原为基本形式。比如election,elections,elected 等,应该还原成elect,从而把它们看作相同的单词,有利于文本的正确分析。
(2)使用N-Gram作为文本分类的特征(分类器的输入)。连在一起的两个单词称为2-Gram;连在一起的三个单词称为3-Gram,它们携带了语句中单词的前后关系。可以使用连在一起的两个单词,比如“clean match”"close election”的频率作为文档特征。

我们可以再试一下高斯模型

# 高斯模型,与多项式模型比较,结果相同
from sklearn.naive_bayes import GaussianNB
classifierModel2=GaussianNB()
classifierModel2.fit(x_trainFeat.toarray),y_trainGnb)
# GaussianNB(priors=None)
y _pred2=classifierModel.predict(x_testFeat)
print("Accuracy Score: {0:.4f}".format(accuracy_score(y_test,y _pred2)*100))
print("F1 Score:{0:.4f}".format(fl_score(y_test,y _pred2,average='macro')*100))
print("Confusion matrix:")
print (confusion_matrix(y_test,y_pred2))

Accuracy Score : 97.2197 F1 Score : 93.7645 Confusion matrix : [   [   127 31   ]    [   0    957   ]   ] \text{Accuracy Score}:97.2197 \\ \text{F1 Score}: 93.7645 \\ \text{Confusion matrix}: \\ [ \ [ \ 127 \quad 31 \ ] \\ \ \ [ \quad \ 0 \ \ 957 \ ] \ ] Accuracy Score97.2197F1 Score:93.7645Confusion matrix:[ [ 12731 ]  [ 0  957 ] ]

为了把文本进行向量化,首先建立一个字典表,字典表的大小为N。然后针对每个文本,把它转换成N维向量,向量的每个分量根据文本里出现单词的频率来决定。出现某个单词,相应的分量就记为单词的频率;如果不出现,相应的分量就记为0。这种方法把每个文本看作a Bag of Words(称为BOW方法),对于每个出现的单词,都看作文本的一个特征,每个特征的具体取值为单词的频率。比如,对于句子“AlImonkeys are primates but not all primates are monkeys”,单词monkeys出现的频率为2/10,单词but出现的频率为1/10。

使用词频表示每个单词会带来一系列问题,更为合理的是TF-IDF表示法,即不仅考虑单词在文档中出现的频率,还用逆文档频率来衡量每个单词的重要程度。

为了提高分类器的正确率、召回率等关键指标,有时候需要对文本进行预处理,包括剔除停用词、词干分析、词根分析、使用n-gram特征等,更加详细的信息请参考相关资料。

现在每个文本被转换成一个向量,这个向量具有成千甚至上万个分量,每个分量表示文本中出现某个单词的频率。一系列的文本经过这种转换后,形成了一系列的样本,加上文本的标注信息,比如文本是否垃圾邮件、文本是正面情感还是负面情感等,就可以用来训练支持向量机分类模型。

创建支持向量机模型,对其进行训练,并且利用模型对测试集进行预测。

from sklearn.svm import LinearSVC
y_trainSvm=y_train.astype('int')
classifierModel=LinearSVC()
classifierModel.fit(x_trainFeat, y_trainSvm)
predResult=classifierModel.predict(x_testFeat)

把测试集的y转换成整数形式,对上述模型的预测值进行比较,显示分类器的精度、F1,以及混淆矩阵。

y_test=y_test.astype('int')
print("Accuracy Score:{0:.4f}".format(accuracy_score(y_test, predResult)*100))

print("F1 Score:{0: .4f}".format(f1_score(y_test, predResult, average='macro')*100))
cmMNb=confusion_matrix(y_test, predResult)
print("Confusion matrix:")
print(cmMNb)

Accuracy Score : 98.2960 F1 Score : 95.7351 Confusion matrix : [   [   116 13   ]    [   6    980   ]   ] \text{Accuracy Score}:98.2960 \\ \text{F1 Score}: 95.7351 \\ \text{Confusion matrix}: \\ [ \ [ \ 116 \quad 13 \ ] \\ \ \ [ \quad \ 6 \ \ 980 \ ] \ ] Accuracy Score98.2960F1 Score:95.7351Confusion matrix:[ [ 11613 ]  [ 6  980 ] ]

可以看到,在这个垃圾邮件识别任务中,支持向量机模型获得了比朴素贝叶斯模型更好的预测效果。

🕒 9. 逻辑回归VS支持向量机

联系:

  • 都是监督的分类算法。
  • 都是线性分类方法 (不考虑核函数时)。
  • 都是判别模型

区别:

  • 损失函数的不同,LR是对数损失函数,SVM是hinge损失函数
  • SVM不能产生概率,LR可以产生概率。
  • SVM自带结构风险最小化,LR则是经验风险最小化。
  • SVM可以用核函数,而LR一般不用核函数。
  • 判别模型:由数据直接学习决策函数Y=f(X),或者由条件概率分布P(Y|X)作为预测模型。判别方法关心的是给定输入X,应该预测出什么样的输出Y。SVM、LR、KNN、决策树都是判别模型。
  • 生成模型:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)。生成方法关心的是给定输入X产生输出Y的生成关系。朴素贝叶斯、隐马尔可夫模型等是生成模型。
  • 经验风险:对所有训练样本都求一次损失函数,再累加求平均。即模型对训练样本中所有样本的预测能力。
  • 期望风险:对所有样本(包含未知样本和已知的训练样本)的预测能力,是全局概念。(经验风险则是局部概念,仅表示决策函数对训练数据集里样本的预测能力。)
  • 结构风险:对经验风险和期望风险的折中。结构风险在经验风险的基础上加上表示模型复杂度的正则化项或惩罚项。

🕘 9.1 选用策略

 特征   数据   选择模型   大量 ( 10K特征)   少量 (1K 行)   简单, 逻辑回归或LinearSVC   少量  ( < 100  特征  )  中等  ( ∼ 10 k  行  )  带RBF核函数的SVC   少量  ( < 100  特征)   大量 (  > 100   K  行)   增加特征, 逻辑回归, LinearSVC 或者核近似  \begin{array}{|l|l|l|} \hline \text { 特征 } & \text { 数据 } & \text { 选择模型 } \\ \hline \text { 大量 ( 10K特征) } & \text { 少量 (1K 行) } & \text { 简单, 逻辑回归或LinearSVC } \\ \hline \text { 少量 }(<100 \text { 特征 }) & \text { 中等 }(\sim 10 \mathrm{k} \text { 行 }) & \text { 带RBF核函数的SVC } \\ \hline \text { 少量 }(<100 \text { 特征) } & \text { 大量 ( }>100 \mathrm{~K} \text { 行) } & \text { 增加特征, 逻辑回归, LinearSVC 或者核近似 } \\ \hline \end{array}  特征  大量 ( 10K特征 少量 (<100 特征 ) 少量 (<100 特征 数据  少量 (1K  中等 (10k  ) 大量 ( >100 K  选择模型  简单逻辑回归或LinearSVC  RBF核函数的SVC  增加特征逻辑回归, LinearSVC 或者核近似 

🕒 10. 课后习题

  1. 【单选题】关于朴素贝叶斯分类器的说法,以下说法错误的是()
    A. 朴素贝叶斯分类器需假设特征变量间相互独立(即样本的所有特征之间相互不相关)。
    B. 如某测试样本的特征变量的取值未在训练集中出现,依朴素贝叶斯算法所有可能分类的概率均为0。对此类零概率问题,朴素贝叶斯分类器一般通过平滑技术(如拉普拉斯平滑技术)加以处理。
    C. 朴素贝叶斯分类器无法对含有连续数值型特征的样本数据进行分类。
    D. 朴素贝叶斯分类器是基于贝叶斯定理的机器学习算法。贝叶斯定理: P ( C ∣ X ) = P ( X ∣ C ) P ( C ) / P ( X ) P(C|X)=P(X|C)P(C)/P(X) P(CX)=P(XC)P(C)/P(X),在实际应用中,对输入样本 X X X,要比较 X X X对每一个可能类型 C i C_i Ci的后验概率 P i P_i Pi,取其中 P i P_i Pi最大的类型 C i C_i Ci为其预测结果。

  2. 【单选题】有一批训练样本数据如下,从训练样本训练朴素贝叶斯分类器,分类器学习采用了拉普拉斯平滑技术(拉普拉斯平滑系数=1)。
     肤色   脸型   身高   体重   入选   白   长条   高   中等   否   较白   方形   较高   重   否  黑 圆 形 较 矮 较 重 是  白   鹅蛋形   中等   重   否  较 黑 圆 形 矮 较 重 是  白   圆形   高   重   否   黄   方形   较高   较轻   否  白 圆 形 较 矮 重 是  较黄   鹅蛋形   中等   轻   否  \begin{array}{|c|c|c|c|c|} \hline \text { 肤色 } & \text { 脸型 } & \text { 身高 } & \text { 体重 } & \text { 入选 } \\ \hline \text { 白 } & \text { 长条 } & \text { 高 } & \text { 中等 } & \text { 否 } \\ \hline \text { 较白 } & \text { 方形 } & \text { 较高 } & \text { 重 } & \text { 否 } \\ \hline \textcolor{Red} { 黑 } & \textcolor{Red} { 圆形 } & \textcolor{Red} { 较矮 } & \textcolor{Red} { 较重 } & \textcolor{Red} { 是 } \\ \hline \text { 白 } & \text { 鹅蛋形 } & \text { 中等 } & \text { 重 } & \text { 否 } \\ \hline \textcolor{Red} { 较黑 } & \textcolor{Red} { 圆形 } & \textcolor{Red} { 矮 } & \textcolor{Red} { 较重 } & \textcolor{Red} { 是 } \\ \hline \text { 白 } & \text { 圆形 } & \text { 高 } & \text { 重 } & \text { 否 } \\ \hline \text { 黄 } & \text { 方形 } & \text { 较高 } & \text { 较轻 } & \text { 否 } \\ \hline \textcolor{Red} { 白 } & \textcolor{Red} { 圆形 } & \textcolor{Red} { 较矮 } & \textcolor{Red} { 重 } & \textcolor{Red} { 是 } \\ \hline \text { 较黄 } & \text { 鹅蛋形 } & \text { 中等 } & \text { 轻 } & \text { 否 } \\ \hline \end{array}  肤色    较白        较黄  脸型  长条  方形  鹅蛋形  圆形  方形  鹅蛋形  身高    较高  中等    较高  中等  体重  中等        较轻    入选             
    现根据某待测样本的特征(肤色=较黑,脸型=圆形,身高=中等,体重=重)预测该样本是否能入选,以下对分类器预测该样本入选结果的描述,正确的是( )
    A. 入选=是
    B. 入选=否
    C. 入选=是与入选=否的可能性均不为0,无法判定哪个可能性更大
    D. 入选=是与入选=否的可能性均为0

  3. 【单选题】收集到一批(共1000个)水果样本数据,每个样本数据包括水果类型(香蕉、橘子、其他水果)和水果特征(是否长条、味道是否甜、颜色是否黄色)信息。现将这1000个样本的数据分特征和类别统计汇总,记录如下:
     水果类型   总个数   形状为长条(个,L)   味道甜(个,S)   颜色为黄色(个,Y)   香蕉(B)  500 400 350 450  橘子(O)  300 0 150 250  其他(T)  200 100 150 50  合计  1000 500 650 750 \begin{array}{|c|c|c|c|c|} \hline \text { 水果类型 } & \text { 总个数 } & \text { 形状为长条(个,L) } & \text { 味道甜(个,S) } & \text { 颜色为黄色(个,Y) } \\ \hline \text { 香蕉(B) } & 500 & 400 & 350 & 450 \\ \hline \text { 橘子(O) } & 300 & 0 & 150 & 250 \\ \hline \text { 其他(T) } & 200 & 100 & 150 & 50 \\ \hline \text { 合计 } & 1000 & 500 & 650 & 750 \\ \hline \end{array}  水果类型  香蕉(B  橘子(O  其他(T  合计  总个数 5003002001000 形状为长条(个,L 4000100500 味道甜(个,S 350150150650 颜色为黄色(个,Y 45025050750
    以该批数据训练一个朴素贝叶斯分类器对水果分类。现有一个水果,形状为非长条、味道甜且颜色为非黄色,如用以上训练出的朴素贝叶斯分类器预测其类别,预测结果应为( )
    A. 香蕉
    B. 橘子
    C. 其他水果
    D. 无法判定

1.C(解析:如高斯模型) 2.A(解析: P ( 是 ) = 1 + 1 6 + 3 × 3 + 1 4 + 3 × 0 + 1 5 + 3 × 1 + 1 5 + 3 = 1 252 ≈ 0.00397 P(是)=\frac{1+1}{6+3} \times \frac{3+1}{4+3} \times \frac{0+1}{5+3} \times \frac{1+1}{5+3} = \frac{1}{252} \approx 0.00397 P()=6+31+1×4+33+1×5+30+1×5+31+1=25210.00397 P ( 否 ) = 0 + 1 6 + 6 × 1 + 1 4 + 6 × 2 + 1 5 + 6 × 3 + 1 5 + 6 = 1 605 ≈ 0.00165 P(否)=\frac{0+1}{6+6} \times \frac{1+1}{4+6} \times \frac{2+1}{5+6} \times \frac{3+1}{5+6} = \frac{1}{605} \approx 0.00165 P()=6+60+1×4+61+1×5+62+1×5+63+1=60510.00165,因此,结果是入选)
3.C(解析:参考上面的打网球案例计算  非长条   甜   非黄色   概率   香蕉(B)  100 350 50 0.014  橘子(O)  300 150 50 0.083333  其他(T)  100 150 150 0.28125 \begin{array}{|c|c|c|c|c|} \hline & \text { 非长条 } & \text { 甜 } & \text { 非黄色 } & \text { 概率 } \\ \hline \text { 香蕉(B) } & 100 & 350 & 50 & 0.014 \\ \hline \text { 橘子(O) } & 300 & 150 & 50 & 0.083333 \\ \hline \text { 其他(T) } & 100 & 150 & 150 & {\color{Red} 0.28125} \\ \hline \end{array}  香蕉(B  橘子(O  其他(T  非长条 100300100  350150150 非黄色 5050150 概率 0.0140.0833330.28125


OK,以上就是本期知识点“朴素贝叶斯与支持向量机”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78776.html

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

相关文章

内存优化之掌握 APP 运行时的内存模型

在上一章&#xff0c;我们已经从操作系统的维度了解了一个进程的内存模型。这一节&#xff0c;我们将维度继续上升&#xff0c;从应用层出发看看一个 App 运行时的内存模型是怎样的。从 App 运行时的内存模型中我们可以知道导致内存增长的源头&#xff0c;从源头出发&#xff0…

【RCNN系列】Faster RCNN论文总结及源码

目标检测论文总结 【RCNN系列】 RCNN Fast RCNN Faster RCNN 文章目录目标检测论文总结前言一、Pipeline二、模型设计1.RPNHead2.Anchors3.RPN&#xff08;Region Proposal Networks&#xff09;4.RPN正负样本划分阈值5.训练策略三、总结前言 一些经典论文的总结。 一、Pipel…

RK3568平台开发系列讲解(驱动基础篇)Linux内核面向对象思想之继承

🚀返回专栏总目录 文章目录 一、私有指针二、抽象类三、接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在面向对象编程中,封装和继承其实是不分开的:封装就是为了更好地继承。我们将几个类共同的一些属性和方法抽取出来,封装成一个类,就是为了通过继承最大化…

【云原生】devops之jenkins中pipeline语法(2)

前言&#xff1a; pipeline语法分类一般来说&#xff0c;有四种。分别是环境配置、阶段步骤、行为动作、逻辑判断。 二、阶段步骤 &#xff08;1&#xff09;post 根据pipeline块或者stage块&#xff08;阶段&#xff09;完成的状态来进行一个或者多个附加步骤&#xff08;取决…

搭建高性能数据库服务⭐《Sharding-JDBC+Canal》⭐

本文主要记录本周的学习内容&#xff0c;搭建mysql的高性能数据库服务 源于 现最多被使用的数据库还是Msql&#xff0c;而MySQL本身不是一种分布式型数据库&#xff0c;在高性能要求下&#xff0c;简单的主从、复制已无法满足高性能要求。 而本文主要在提供读者一种高性能方案…

Java学习之equals方法练习

目录 第一题 题目要求 我的代码 创建Person类 main类 结果 重写equals 重写后的结果 老师代码 思路 结果 总结 Interger类 源代码 String类 源代码 第二题 运行结果 第三题 知识点 运行结果 第一题 题目要求 判断两个 Person 对象的内容是否相等&#xff0c;…

SQL开窗函数之基本用法和聚合函数

开窗函数 当我们需要进行一些比较复杂的子查询时&#xff0c;聚合函数就会非常的麻烦&#xff0c;因此可以使用开窗函数进行分组再运用函数查询。窗口函数既可以显示聚集前的数据&#xff0c;也可以显示聚集后的数据&#xff0c;可以在同一行中返回基础行的列值和聚合后的结果…

python之模块使用

目录 一、模块 二、标准模块 collections模块 三、异常处理 四、文件操作 一、模块 Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 新建util…

day17【代码随想录】找出字符串中第一个匹配项的下标 、重复的子字符串

文章目录前言一、找出字符串中第一个匹配项的下标&#xff08;力扣28&#xff09;二、重复的子字符串&#xff08;力扣459&#xff09;前言 1、找出字符串中第一个匹配项的下标 2、重复的子字符串 一、找出字符串中第一个匹配项的下标&#xff08;力扣28&#xff09; 给你两个…

LeetCode HOT 100 —— 200 .岛屿问题

题目 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该…

有意思,圣诞节自己做一个装饰圣诞帽头像的APP!

话说又到了一年一度到别人到节日&#xff0c;圣诞节&#xff0c;还记得去年的时候&#xff0c;朋友圈疯狂转发到圣诞帽嘛&#xff0c;在圣诞节为自己到头像增加一款圣诞帽还是蛮应景的。 我们的目标就是是这样的 ❝ 当然&#xff0c;如果你对过程不感兴趣&#xff0c;那么直接到…

总结本人学习b站黑马前端课程,各部分案例汇总

目录 1.Ajax&#xff1a; 对应课程&#xff1a; b站黑马JavaScript的Ajax案例代码——新闻列表案例 b站黑马JavaScript的Ajax案例代码——评论列表案例 b站黑马JavaScript的Ajax案例代码——聊天机器人案例 b站黑马JavaScript的Ajax案例代码——图书管理案例 2.ES6面向对…

HTML-如何让网站变成灰色?

在某些特定的时候&#xff0c;我们经常会看到网站会将整体布局设置成灰色色调&#xff0c;以示哀悼。 那么这是怎么实现的呢&#xff1f; 我去查了下相关的文章&#xff0c;发现是通过CSS的 过滤器函数 实现的&#xff0c;详见&#xff1a;grayscale()。 grayscale:对图片进…

MySql性能优化(三)执行计划详解

执行计划 执行计划执行计划概述idselect_typetabletypepossible_keyskeykey_lenrefrowsextra官网地址 在具体的应用当中&#xff0c;我们排查sql有没有走索引&#xff0c;性能如何&#xff0c;需要查看Sql语句具体的执行过程&#xff0c;以方便我们调整sql来加快sql的执行效率。…

如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

小新再次推荐一篇 &#xff0c;主要是讲如何通过 IntelliJ IDEA 来提升 Stream 的编码效率&#xff0c;算是一个小技巧&#xff0c;经常使用 Java8 Stream 流的小伙伴们&#xff0c;可以试下&#xff0c;能够提升工作效率哦&#xff01; 一、Java8 Stream API 的不友好性 Java…

02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

文章目录1 概述1.1 需求1.2 优先队列特点1.3 优先队列分类1.4 应用场景1.5 相关延伸2 说明3 索引优先队列3.1 实现思路3.2 API设计3.2 代码实现及简单测试5 主要方法讲解5.1 exch()5.2 insert()5.2 poll()6 分析7 后记1 概述 普通的队列是一种先进先出的数据结构&#xff0c;元…

JMeter连接Oracle过程及常见问题总结

如果被测试系统使用的数据库不是MySQL而是Oracle&#xff0c;如何用JMeter进行连接呢&#xff1f; 一、下载数据库驱动 需要确认数据库的版本&#xff0c;可以上网站下载驱动&#xff1a;https://www.oracle.com/database/technologies/jdbc-ucp-122-downloads.html。 或者直…

【Linux】进程间通信-共享内存

前言 我们知道&#xff0c;在Linux中&#xff0c;进程是相互独立存在的&#xff0c;不存在直接让进程之间互相通信的方式。但是如果我们能让不同进程之间见到同一块内存&#xff0c;也就是都能读写这片区域是不是就能够达到进程间通信呢&#xff1f; 事实证明确实如此。在之前我…

【springboot进阶】基于starter项目构建(二)构建starter项目-fastjson

目录 一、创建 fastjson-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父项目 parent 和 自定义 starter 结合。项目使用最新的 springboot3 和 jdk19。本系列的…

kinect v2安装iai_kinect2

目前已完成 前期已经安装了libfreenect2 使用的系统为ubuntu 18.04 使用的相机为kinect v2 已经安装好了orb_slam3&#xff0c;已经完成使用stereo在euroc数据集和使用RGB-D在tum数据集上的测试 目的 想要完成使用深度相机进行在线测试 步骤 step1 经过查阅资料发现目前仅…