【一起啃书】《机器学习》第六章 支持向量机

文章目录

      • 第六章 支持向量机
        • 6.1 间隔和支持向量
        • 6.2 对偶问题
        • 6.3 核函数
        • 6.4 软间隔与正则化
        • 6.5 支持向量回归
        • 6.6 核方法
        • 6.7 一些问题

第六章 支持向量机

6.1 间隔和支持向量

  给定训练样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , + 1 } D = \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_m},{y_m})\} ,{y_i} \in \{ - 1, + 1\} D={(x1,y1),(x2,y2),...,(xm,ym)},yi{1,+1},分类学习最基本的想法就是基于训练集 D D D在样本空间中找到一个划分超平面,将不同类别的样本分开,但能将训练样本分开的划分超平面可能有很多,如下所示:

  直观上看,应该去找位于两类训练样本“正中间”的划分超平面,该超平面对训练样本局部扰动的“容忍”性最好,也就是该划分超平面所产生的分类结果是最鲁棒的,对未见示例的泛化能力最强。划分超平面的线性方程如下所示:
ω T x + b = 0 {{{\omega }}^T}x + b = 0 ωTx+b=0
  其中 ω = ( ω 1 ; ω 2 ; . . . ; ω d ) \omega = (\omega_1;\omega_2;...;\omega_d) ω=(ω1;ω2;...;ωd)为法向量,决定了超平面的方向; b b b为位移项,决定了超平面与原点之间的距离,下面定义样本空间中任意点 x x x到超平面 ( ω , b ) (\omega,b) (ω,b)的距离,如下所示:
r = ∣ ω T x + b ∣ ∥ ω ∥ r = \frac{{\left| {{\omega ^T}x + b} \right|}}{{\left\| \omega \right\|}} r=ω ωTx+b
  假设超平面 ( ω , b ) (\omega,b) (ω,b)能将训练样本正确分类,有如下定义:
{ ω T x i + b ⩾ + 1 , y i = + 1 ω T x i + b ⩽ − 1 , y i = − 1 \left\{ \begin{aligned} {{\omega ^T}{x_i} + b \geqslant + 1,{y_i} = + 1} \\ {{\omega ^T}{x_i} + b \leqslant - 1,{y_i} = - 1} \\ \end{aligned} \right. {ωTxi+b+1,yi=+1ωTxi+b1,yi=1
  如下图所示,距离超平面最近的这几个训练样本点使上式的等号成立,这些点被称为“支持向量”,两个异类支持向量到超平面的距离之和为 γ = 2 ∥ ω ∥ \gamma = \frac{2}{{\left\| \omega \right\|}} γ=ω2,也被称为“间隔”。

  欲找到具有“最大间隔”的划分超平面,需要找到满足约束条件的参数 ω \omega ω b b b,使得 γ \gamma γ最大,即
max ⁡ ω , b    2 ∥ ω ∥ s . t .     y i ( ω T x i + b ) ⩾ 1 , i = 1 , 2 , . . . , m \begin{aligned} &\mathop {\max }\limits_{\omega ,b}\ \ \frac{2}{{\left\| \omega \right\|}}\\ &s.t.\ \ \ {y_i}({\omega ^T}{x_i} + b) \geqslant 1,i = 1,2,...,m \end{aligned} ω,bmax  ω2s.t.   yi(ωTxi+b)1,i=1,2,...,m
  最大化 ∥ ω ∥ − 1 {\left\| \omega \right\|^{ - 1}} ω1,等价于最小化 ∥ ω ∥ 2 {\left\| \omega \right\|^2} ω2,于是得到如下表达,这也是支持向量机的基本型。
min ⁡ ω , b    1 2 ∥ ω ∥ 2 s . t .     y i ( ω T x i + b ) ⩾ 1 , i = 1 , 2 , . . . , m \begin{aligned} & \mathop {\min }\limits_{\omega ,b}\ \ \frac{1}{2}{\left\| \omega \right\|^2} \\ & s.t.\ \ \ {y_i}({\omega ^T}{x_i} + b) \geqslant 1,i = 1,2,...,m \end{aligned} ω,bmin  21ω2s.t.   yi(ωTxi+b)1,i=1,2,...,m
  虽然间隔看着貌似只与 ω \omega ω有关,但实际上 b b b通过约束隐式地影响着 ω \omega ω的取值,因为这些支持向量是使得等号成立的样本点,所以如果 b b b发生变化,那么 ω \omega ω也会发生变化。

6.2 对偶问题

  SVM基本型的对偶问题是将原始问题的最小化目标函数转换为最大化拉格朗日函数,利用拉格朗日对偶性,求解出拉格朗日乘子,从而得到超平面的参数。首先对原来的约束条件添加拉格朗日乘子 α i ⩾ 0 {\alpha _i} \geqslant 0 αi0,得到如下的拉格朗日函数:
L ( ω , b , α ) = 1 2 ∥ ω ∥ 2 + ∑ i = 1 m α i ( 1 − y i ( ω T x i + b ) ) L(\omega ,b,\alpha ) = \frac{1}{2}{\left\| \omega \right\|^2} + \sum\limits_{i = 1}^m {{\alpha _i}(1 - {y_i}({\omega ^T}{x_i} + b))} L(ω,b,α)=21ω2+i=1mαi(1yi(ωTxi+b))
  下面分别对 ω \omega ω b b b求偏导,得到如下结果:
ω = ∑ i = 1 m α i y i x i     ,      0 = ∑ i = 1 m α i y i \omega = \sum\limits_{i = 1}^m {{\alpha _i}{y_i}{x_i}\ \ \ ,}\ \ \ \ 0 = \sum\limits_{i = 1}^m {{\alpha _i}{y_i}} ω=i=1mαiyixi   ,    0=i=1mαiyi
  将上面求偏导的结果再带入到原来的拉格朗日函数中,就可以得到SVM基本型的对偶问题,如下所示:
max ⁡ α     ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j s . t .      ∑ i = 1 m α i y i = 0 \begin{aligned} & \mathop {\max }\limits_\alpha \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}} - \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\alpha _i}{\alpha _j}{y_i}{y_j}x_i^T{x_j}} } \\ & s.t.\ \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}{y_i} = 0} \end{aligned} αmax   i=1mαi21i=1mj=1mαiαjyiyjxiTxjs.t.    i=1mαiyi=0
  上述问题是一个二次规划问题,但该问题的规模正比于训练样本数,会在实际任务中造成很大的开销,为了避开这个障碍,在这里引入了SMO算法来解决这个问题,SMO算法需要注意以下几点:

  • SMO算法的基本思想是每次选择两个拉格朗日乘子( α i \alpha_i αi α j \alpha_j αj)作为优化变量,固定其他的乘子,将原问题简化进行求解。
  • SMO算法的关键是如何选择合适的 α i \alpha_i αi α j \alpha_j αj,以及如何更新它们的值,一般来说,选择违反KKT条件最严重的 α i \alpha_i αi 作为第一个变量,然后在约束条件下选择第二个变量 α j \alpha_j αj,使得目标函数有足够大的变化。
  • SMO算法的终止条件是所有的拉格朗日乘子都满足KKT条件,或者达到最大迭代次数。
  • SMO算法的优点是可以高效地求解SVM对偶问题,避免了矩阵运算和存储,只需要利用核函数计算样本之间的内积,而缺点是需要调整一些启发式的参数,如容错率和最大迭代次数,以及核函数的选择。

6.3 核函数

  在现实任务中,原始样本空间内也许并不存在一个能正确划分两类样本的超平面,如下左图所示,对这样的问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,如下右图所示。

  令 ϕ ( x ) \phi (x) ϕ(x)表示将 x x x映射后的特征向量,于是,在特征空间中划分超平面所对应的模型可表示为
f ( x ) = ω T ϕ ( x ) + b f(x) = {\omega ^T}\phi (x) + b f(x)=ωTϕ(x)+b
  以下为其基本型
min ⁡ ω , b    1 2 ∥ ω ∥ 2 s . t .     y i ( ω T ϕ ( x i ) + b ) ⩾ 1 , i = 1 , 2 , . . . , m \begin{aligned} & \mathop {\min }\limits_{\omega ,b}\ \ \frac{1}{2}{\left\| \omega \right\|^2} \\ & s.t.\ \ \ {y_i}({\omega ^T}{\phi(x_i)} + b) \geqslant 1,i = 1,2,...,m \end{aligned} ω,bmin  21ω2s.t.   yi(ωTϕ(xi)+b)1,i=1,2,...,m
  以下为对应的对偶问题
max ⁡ α     ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j ϕ ( x i ) T ϕ ( x j ) s . t .      ∑ i = 1 m α i y i = 0 \begin{aligned} & \mathop {\max }\limits_\alpha \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}} - \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\alpha _i}{\alpha _j}{y_i}{y_j}\phi(x_i)^T{\phi(x_j)}} } \\ & s.t.\ \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}{y_i} = 0} \end{aligned} αmax   i=1mαi21i=1mj=1mαiαjyiyjϕ(xi)Tϕ(xj)s.t.    i=1mαiyi=0
  求解上述式子涉及到 ϕ ( x i ) T ϕ ( x j ) \phi(x_i)^T\phi(x_j) ϕ(xi)Tϕ(xj),这是样本 x i x_i xi x j x_j xj映射到特征空间之后的内积。由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算 ϕ ( x i ) T ϕ ( x j ) \phi(x_i)^T\phi(x_j) ϕ(xi)Tϕ(xj)通常是困难的。为了避开这个障碍,可以设想这样一个函数:
κ ( x i , x j ) ⩽ ϕ ( x i ) , ϕ ( x j ) ⩾ ϕ ( x i ) T ϕ ( x j ) \kappa ({x_i},{x_j}) \leqslant \phi ({x_i}),\phi ({x_j}) \geqslant \phi {({x_i})^T}\phi ({x_j}) κ(xi,xj)ϕ(xi),ϕ(xj)ϕ(xi)Tϕ(xj)
  即 x i x_i xi x j x_j xj在特征空间的内积等于它们在原始样本空间中通过函数 κ ( ⋅ , ⋅ ) \kappa ( \cdot , \cdot ) κ(,)计算的结果,于是可以得到如下式子:
max ⁡ α     ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j κ ( x i , x j ) s . t .      ∑ i = 1 m α i y i = 0 \begin{aligned} & \mathop {\max }\limits_\alpha \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}} - \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\alpha _i}{\alpha _j}{y_i}{y_j}\kappa ({x_i},{x_j})} } \\ & s.t.\ \ \ \ \sum\limits_{i = 1}^m {{\alpha _i}{y_i} = 0} \end{aligned} αmax   i=1mαi21i=1mj=1mαiαjyiyjκ(xi,xj)s.t.    i=1mαiyi=0
  求解后即可得到 f ( x ) = ∑ i = 1 m α i y i κ ( x i , x j ) + b f(x) = \sum\limits_{i = 1}^m {{\alpha _i}{y_i}\kappa ({x_i},{x_j}) + b} f(x)=i=1mαiyiκ(xi,xj)+b,这里的 κ ( x i , x j ) \kappa ({x_i},{x_j}) κ(xi,xj)被称为“核函数”,这一展开式也被称为“支持向量展开”。下面为判断核函数的一个定理。

  以下为常见的核函数。

  对于核函数的选择,可以参考以下规则:

  • 如果数据是线性可分的,或者特征的数量很大,接近于样本的数量,可以选择线性核函数,因为线性核函数参数少,速度快,而且可以得到很好的效果。
  • 如果数据是非线性的,或者特征的数量比较小,而样本的数量一般,可以选择高斯核函数(也叫RBF核函数),因为高斯核函数可以将数据映射到一个无限维的特征空间,具有很强的拟合能力。不过高斯核函数的分类结果非常依赖于参数的选择,需要通过交叉验证等方法来寻找合适的参数。
  • 如果数据是非线性的,而且有明显的结构特征,例如图像、文本等,可以选择与数据结构相匹配的核函数,例如多项式核函数、字符串核函数、图核函数等。这些核函数可以利用数据的先验知识,提取更有效的特征,提高分类或回归的准确性。

6.4 软间隔与正则化

  在现实任务中往往很难确定合适的核函数使得训练样本在特征空间中线性可分,即便恰好找到了某个核函数使训练集在特征空间中线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合所造成的,缓解这个问题的一个办法是允许支持向量机在一些样本上出错,如下为软间隔示例图,红色圈出了一些不满足约束的样本。

  若要求所有样本都必须划分正确,这称为“硬间隔”,而软间隔则是允许某些样本不满足约束 y i ( ω T x i + b ) ⩾ 1 {y_i}({\omega ^T}{x_i} + b) \geqslant 1 yi(ωTxi+b)1,而在最大化间隔的同时,不满足约束的样本应尽可能少,于是就有了如下优化目标:
min ⁡ ω , b 1 2 ∥ ω ∥ 2 + C ∑ i = 1 m ℓ 0 / 1 ( y i ( ω T x i + b ) − 1 ) \mathop {\min }\limits_{\omega ,b} \frac{1}{2}{\left\| \omega \right\|^2} + C\sum\limits_{i = 1}^m {{\ell _{0/1}}({y_i}({\omega ^T}{x_i} + b) - 1)} ω,bmin21ω2+Ci=1m0/1(yi(ωTxi+b)1)
  其中类似 ℓ 0 / 1 \ell _{0/1} 0/1的函数被称为“替代损失”,常见的替代函数以及它们的图像如下所示:

  下面引入松弛变量 ξ i ⩾ 0 {\xi _i} \geqslant 0 ξi0,即可得到如下的软间隔支持向量机:
min ⁡ ω , b , ξ     1 2 ∥ ω ∥ 2 + C ∑ i = 1 m ξ i s . t .      y i ( ω T x i + b ) ⩾ 1 − ξ i \begin{aligned} & \mathop {\min }\limits_{\omega ,b,\xi }\ \ \ \frac{1}{2}{\left\| \omega \right\|^2} + C\sum\limits_{i = 1}^m {{\xi _i}} \\ & s.t.\ \ \ \ {y_i}({\omega ^T}{x_i} + b) \geqslant 1 - {\xi _i} \end{aligned} ω,b,ξmin   21ω2+Ci=1mξis.t.    yi(ωTxi+b)1ξi
  松弛变量 ξ i \xi _i ξi表示第 i i i个样本违反约束条件的程度, C C C是一个正的常数,表示对松弛变量的惩罚系数。可以看到,当 C C C很大时,相当于对松弛变量的惩罚很大,要求所有样本都满足约束条件,这就退化为硬间隔的情况;当 C C C很小时,相当于对松弛变量的惩罚很小,允许一些样本不满足约束条件,这就增加了模型的泛化能力。因此, C C C的大小决定了svm对分类错误的容忍程度和模型的复杂度。

  而这里需要注意, C C C比较大会增加松弛变量的值,是因为要最小化整个目标函数,而不是只最小化间隔。目标函数由两部分组成,一部分是 1 2 ∥ ω ∥ 2 \frac{1}{2}{\left\| \omega \right\|^2} 21ω2,表示间隔的倒数;另一部分是 C ∑ i = 1 n ξ i C \sum_{i=1}^n \xi_i Ci=1nξi,表示对松弛变量的惩罚。当 C C C比较大时,表示对松弛变量的惩罚比较大,也就是要求所有样本都满足约束条件,即 y i ( ω T x i + b ) ≥ 1 − ξ i y_i({\omega ^T}{x_i} + b) \geq 1 - \xi_i yi(ωTxi+b)1ξi。这样的话,如果有一些样本本来不满足约束条件,那么就要增加它们的松弛变量的值,让它们满足约束条件。这样做的好处是可以减少分类错误,提高模型在训练集上的准确率。但是,这样做的坏处是可能导致过拟合,降低模型在测试集上的泛化能力。

  同时这里的 C C C也是正则化尝试,正则化可以理解为一种“罚函数法”,即对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标,从贝叶斯估计的角度来看,正则化项可认为是提供了模型的先验概率。

6.5 支持向量回归

  对于样本 ( x , y ) (x,y) (x,y),传统回归模型通常直接基于模型输出 f ( x ) f(x) f(x)与真实输出 y y y之间的差别来计算损失,当且仅当 f ( x ) f(x) f(x) y y y完全相同时,损失才为零。与此不同,支持向量回归假设我们能容忍 f ( x ) f(x) f(x) y y y之间最多有 ε \varepsilon ε的偏差,即仅当 f ( x ) f(x) f(x) y y y之间的差别绝对值大于 ε \varepsilon ε时才计算损失,如下图所示,相当于以 f ( x ) f(x) f(x)为中心,构建了一个宽度为 2 ε 2\varepsilon 2ε的间隔带,若训练样本落入此间隔带,则认为是被预测正确的。

  引入松弛变量,得到如下优化问题,这里引入两个松弛变量是因为间隔带两侧的松弛程度可以不同。
min ⁡ ω , b , ξ , ξ ∗     1 2 ∥ ω ∥ 2 + C ∑ i = 1 m ξ i + ξ ∗ i s . t .       f ( x i ) − y i ⩽ ε + ξ i ,              y i − f ( x i ) ⩽ ε + ξ i ∗ ,              ξ i ⩾ 0 , ξ i ∗ ⩾ 0 \begin{aligned} & \mathop {\min }\limits_{\omega ,b,\xi ,\mathop \xi \limits^* }\ \ \ \frac{1}{2}{\left\| \omega \right\|^2} + C\sum\limits_{i = 1}^m {{\xi _i} + {{\mathop \xi \limits^* }_i}} \\ & s.t.\ \ \ \ \ f({x_i}) - {y_i} \leqslant \varepsilon + {\xi _i}, \\ & \ \ \ \ \ \ \ \ \ \ \ \ {y_i} - f({x_i}) \leqslant \varepsilon + {\mathop \xi \limits^* _i}, \\ & \ \ \ \ \ \ \ \ \ \ \ \ {\xi _i} \geqslant 0,{\mathop \xi \limits^* _i} \geqslant 0 \end{aligned} ω,b,ξ,ξmin   21ω2+Ci=1mξi+ξis.t.     f(xi)yiε+ξi,            yif(xi)ε+iξ,            ξi0,iξ0
  同样的,需要引入拉格朗日乘子进行优化求解,最后得到对偶问题,同时也可以引入核函数。

6.6 核方法

  给定训练样本 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_m},{y_m})\} {(x1,y1),(x2,y2),...,(xm,ym)},若不考虑偏移项 b b b,则无论SVM还是SVR,学得的模型总能表示成核函数 κ ( x , x i ) \kappa ({\bf{x}},{x_i}) κ(x,xi)的线性组合,同时可以得到如下被称为“表示定理”的更一般的结论。

  表示定理 H \mathbb{H} H为核函数 κ \kappa κ对应的再生核希尔伯特空间, ∥ h ∥ H \left\| h \right\|_\mathbb{H} hH表示 H \mathbb{H} H空间中关于 h h h的范数,对于任意单调递增函数 Ω : [ 0 , ∞ ] ↦ R \Omega :[0,\infty ] \mapsto {\R} Ω:[0,]R和任意非负损失函数 ℓ : R m ↦ [ 0 , ∞ ] \ell :{{\R}^m} \mapsto [0,\infty ] :Rm[0,],优化问题
min ⁡ h ∈ H F ( h ) = Ω ( ∥ h ∥ H ) + ℓ ( h ( x 1 ) , h ( x 2 ) , . . . , h ( x m ) ) \mathop {\min }\limits_{h \in \mathbb{H}} F(h) = \Omega ({\left\| h \right\|_\mathbb{H}}) + \ell (h({x_1}),h({x_2}),...,h({x_m})) hHminF(h)=Ω(hH)+(h(x1),h(x2),...,h(xm))
  的解总可写为
h ∗ ( x ) = ∑ i = 1 m α i κ ( x , x i ) {h^*}(x) = \sum\limits_{i = 1}^m {{\alpha _i}\kappa ({\bf{x}},{x_i})} h(x)=i=1mαiκ(x,xi)
  表示定理对损失函数没有限制,对正则化项 Ω \Omega Ω仅要求单调递增,甚至不要求 Ω \Omega Ω是凸函数,意味着对于一般的损失函数和正则化项,上述优化问题的最优解都可以表示为核函数的线性组合。

  因此人们发展出一系列基于核函数的学习方法,统称为“核函数”。最常见的是通过“核化”(即引入核方法)来将线性学习器拓展为非线性学习器,比如SVM、PCA、LDA、聚类等等都可以引入核方法。

6.7 一些问题

(1)SVM、BP神经网络和C4.5决策树的异同?

  • SVM是一种基于核函数和凸优化的算法,它的目标是在特征空间中寻找一个最大间隔超平面来分割两个类别。SVM的优点是能够处理非线性可分问题,泛化能力强,不容易过拟合。SVM的缺点是计算复杂度高,对参数和核函数的选择敏感,难以解释。

  • BP神经网络是一种多层人工神经网络,它的目标是通过反向传播算法来调整网络权重,使得网络输出和期望输出之间的误差最小。BP神经网络的优点是结构灵活,能够拟合复杂的非线性函数,适用于语音、图像、自然语言等领域。BP神经网络的缺点是训练速度慢,容易陷入局部最优解,需要大量数据进行训练。

  • 决策树是一种基于信息论和递归划分的算法,它的目标是构建一棵树状结构,每个内部节点表示一个特征判断,每个叶子节点表示一个类别或回归值。决策树的优点是易于理解和解释,非参数型,适合处理离散特征。决策树的缺点是容易过拟合,对噪声数据敏感,可能不稳定。

(2)线性判别分析与线性核SVM在什么条件下等价?

  • 数据集是线性可分的,即存在一个超平面可以完美地分割两个类别;
  • 数据集服从高斯分布,即每个类别的数据都符合一个多元正态分布;
  • 数据集的协方差矩阵相同,即每个类别的数据都有相同的方差和相关性。

  如果数据集是线性可分的,那么LDA和线性核SVM都可以找到一个超平面来完美地分割两个类别,但这个超平面不一定是唯一的。其次,如果数据集服从高斯分布,那么LDA可以通过最大化两个类别均值之差来得到一个最优的投影方向,而线性核SVM可以通过最大化两个类别支持向量之间的距离来得到一个最优的分类器。最后,如果数据集的协方差矩阵相同,那么LDA和线性核SVM的目标函数都可以化简为两个类别均值之差的函数,从而得到相同的超平面。

(3)高斯核SVM与RBF神经网络之间的联系?

  高斯核SVM与RBF神经网络都使用了高斯核函数作为非线性映射的工具,将低维空间中的数据映射到高维空间中,从而实现线性可分或近似线性可分,当RBF神经网络的隐层神经元数设置为训练样本数,且每个训练样本对应一个神经元中心时,RBF神经网络与高斯核SVM的预测函数是相同的。

(4)SVM对噪声敏感的原因?

  SVM的目的是求出与支持向量有最大距离的超平面,以每个样本为圆心,该距离为半径作圆,可以近似认为圆内所有的点都与该样本属于相同分类,若圆内出现了噪声,那么该噪声所造成的错误分类也将最大化,因此SVM对噪声是敏感的。为了克服SVM对噪声敏感的问题,可以引入松弛变量和惩罚因子,构造软间隔分类器,允许一些样本不满足硬间隔约束条件,从而避免过拟合和模型过于复杂。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day 1 认识软件测试——(软件测试定义、目的、原则)

Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…

《我命由我不由天》蔡志忠——笔记一

目录 简介 经典摘录 三岁决定一生 父母该什么时候放手 确定将来要成为什么 积极主动为目标而努力 叛逆是最伟大的创意 父亲给蔡志忠最大的影响是教会他两件事 价值观缺陷导致的后果 人有三个阶段 简介 作者 蔡志忠,李虹。 蔡志忠:漫画家、哲…

Vue加SpringBoot实现项目前后端分离

首先需要搭建一个Vue的脚手架项目(已经放在gitee里面了,下面是gitee网址,可以直接拉) (vue-web: 这个是Vue项目模板,没有后台数据) 那么接下来就是实现前后端分离的步骤 首先我们需要有一个登录页面 登录的点击事件利用…

图神经网络:(节点分类)在KarateClub数据集上动手实现图神经网络

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读:代码实操: 文献阅读: 参考文…

【Hello Algorithm】归并排序及其面试题

作者:小萌新 专栏:算法 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:介绍归并排序和几道面试题 归并排序及其面试题 归并排序归并排序是什么归并排序的实际运用归并排序的迭代写法归并排序的时间复杂度 归并排序算法题小…

(十一)地理数据库创建——创建新的地理数据库

地理数据库创建——创建新的地理数据库 目录 地理数据库创建——创建新的地理数据库 1.地理数据库概述2.地理数据库建立一般过程2.1地理数据库设计2.2地理数据库建立2.2.1从头开始建立一个新的地理数据库2.2.2移植已经存在数据到地理数据库2.2.3用CASE工具建立地理数据库 2.3建…

Python 科研绘图可视化(后处理)Matplotlib - 2D彩图

Introduction 科研可视化是将数据和信息转化为可视化形式的过程,旨在通过图形化展示数据和信息,使得科研工作者能够更好地理解和分析数据,并从中发现新的知识和洞见。科研可视化可以应用于各种领域,如生物学、物理学、计算机科学…

C++类和对象再探

文章目录 const成员再谈构造函数成员变量的定义函数体内赋值初始化列表 隐式类型转换explicitstatic成员 const成员 我们知道在调用类的成员函数时,会有一个默认的this指针且这个this指针时不可以被修改的,例如在日期类中,会有隐式的Date * const this;注意这里默认会在this前…

一五一、web+小程序骨架屏整理

骨架屏介绍 请点击查看智能小程序骨架屏 车载小程序骨架屏 车载小程序为方便开发者设置骨架屏,在智能小程序的基础上抽取出骨架屏模板,开发者只需要在 skeleton 文件夹下配置config.json(page 和骨架屏的映射关系文件)即可生效骨…

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日)

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日) 编程题 第 1 题 问答题 二进制位数 十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。 十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。 请问十进制整数2022在二进制中是几位数? 第2题问…

Pr 拍立得风格图片展示

哈喽,各位小伙伴!今天我们来学习一下如何制作拍立得风格的照片展示效果? 新建三个序列 在开始之前,我们需要新建三个序列 序列1:总合成-尺寸1902*1080序列2:照片合成-尺寸1920*1080序列3:照片…

自动驾驶TPM技术杂谈 ———— I-vista验收标准(试验规程)

文章目录 术语介绍试验准备场地要求环境要求精度要求边界车辆&路沿石 试验方法能力试验双边界车辆平行车位白色标线平行车位双边界车辆垂直车位白色标线垂直车位方柱垂直车位双边界车辆斜向车位白色标线斜向车位 新功能评价平行车位远程操控泊入泊出试验垂直车位远程操控泊…

能伸展脖子的机器人?东京大学最新研究成果:基于鸵鸟肌肉骨骼结构和行为,具有高度灵活性的新型机械臂—RobOstrich(附论文)

原创 | 文 BFT机器人 得益于高度灵活的颈部,鸟类可以做很多事情,无论是转过头梳理自己的后背,在飞行过程中“眼观六路”,还是在地面或树上难以触及的角落和缝隙寻找食物。而在所有鸟类中,鸵鸟以其结实灵巧的颈部脱颖而…

​ NISP一级备考知识总结之信息安全概述、信息安全基础

参加每年的大学生网络安全精英赛通过初赛就可以嫖一张 nisp(国家信息安全水平考试) 一级证书,nisp 一级本身没啥考的价值,能白嫖自然很香 1.信息安全概述 信息与信息技术 信息概述 信息奠基人香农认为:信息是用来消…

【Linux】如何实现单机版QQ,来看进程间通信之管道

学会了管道,就可以实现简单的qq哦~ 文章目录 前言一、匿名管道总结 前言 为什么要进行进程间通信呢?因为需要以下这些事: 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 …

ChatGPT实现旅行安排

工作之余,出门旅行一趟放松放松身心,是对自己辛勤工作最好的犒劳方式之一。旅行可以近郊游、可以远游,可以穷游,可以自驾游,可以一言不合打飞的喂鸽子,方式多种多样。但是多数情况,我们是到一个…

论文解析-基于 Unity3D 游戏人工智能的研究与应用

1.重写 AgentAction 方法 1.1 重写 AgentAction 方法 这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释: ①public override void AgentAction(float[] vectorAction) 这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受…

Java版本工程管理系统源码企业工程项目管理系统简介

一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…

Vue收集表单数据和过滤器

目录 收集表单数据 收集表单数据总结 过滤器 过滤器小结 收集表单数据 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--vue--><script src"https://cdn.sta…

C++ ---- 类和对象(下)

目录 初始化列表 初始化列表的语法 初始化列表的特性 explicit关键字 构造函数的隐式转换 explicit的作用 static修饰成员变量和成员函数 static修饰成员变量 static修饰成员函数 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 初始化列表 …