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

news2024/9/23 15:27:11

文章目录

      • 第六章 支持向量机
        • 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对噪声敏感的问题,可以引入松弛变量和惩罚因子,构造软间隔分类器,允许一些样本不满足硬间隔约束条件,从而避免过拟合和模型过于复杂。

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

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

相关文章

Echarts 自定义y轴value值

在CSDN问答区,碰到一个有意思的问题,解决思路在这里记录一下。 需求为:进行四等份展示,即中间价差值 (最大值 - 最小值) / 4,左侧数据从上到下分别为:最大值、最大值 - (最大值 - 最小值) / 4、最大值 - …

测试工程师用了3个月从月薪8k涨到12k,我是这么做到的?

先说一下自己的个人情况,大专生,18年通过校招进入湖南金蝶软件公司,干了接近3年的测试工程师,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企…

MySQL知识学习04(MySQL事务隔离级别详解)

1、事务隔离级别总结? SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交) : 允许…

剧本杀游戏app开发

剧本杀游戏app开发通常会涉及以下技术: 开发语言:剧本杀游戏app可以使用各种编程语言进行开发,例如Java、Kotlin、Swift等。 游戏引擎开发:为了实现游戏过程中的角色扮演、对话、动画等效果,需要使用适当的游戏…

Docker-Compose介绍

文章目录 一、Docker-compose 简介二、YAML 文件格式及编写注意事项三、Docker Compose配置常用字段四、Docker Compose 常用命令五、Docker Compose 文件结构六、compose 部署1、Docker Compose 环境安装2、compose部署nginx3、compose部署lnmp 一、Docker-compose 简介 Dock…

odoo 常用小部件及其用法

文章目录 1) 显示百分比2) 标签组件3) handle组件(拖拽排序)4) 状态栏组件5) binary组件6) 货币组件7) tatinfo组件8) 日期型字段只显示年月 odoo的一些小部件主要定义在:模块/static/src/js下 1) 显示百分比 模型字段execution_percent定义…

api接口如何有效对接

一、背景 在平时工作中,经常会遇到的一种场景是:A公司要对接B公司的API方法,这时,A公司就要阅读B公司的接口文档,从接口文档中找到自己需要对接的API,并根据接口文档的要求,完成编码工作&#…

为什么要建数据仓库,而不是直连数据源?

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 今天和大家聊一个话题:为什么BI软件要用构建数据仓库,而不是直连数据源的方式开发报表?&…

docker的底层原理,带你上天

1、docker的层级怎么看 先查看当前机器上有哪些镜像 docker images 这里选看mysql的层级 docker image inspect mysql:5.7.29 命令。其中RootFS部分则是表示了分层信息。 2、查看docker的系统信息 因为这台机器的docker不是我安装的,所以不知道具体的根目录在哪里…

redis之benchmark工具:benchmark是redis自带的性能测试工具

从本篇文章开始,博主将开始对redis的探索,今天的咱们先来聊聊benchmark性能测试工具,通过此工具来检查以下redis的读写能能力以及环境问题。通过此工具可以让我们更清楚的认识到redis具有怎样的能力,是否要进行其他的配置例如&…

【css】CSS层叠样式表二

目录 一、Emmet语法 1、快速生成HTML结构语法 2、快速生成CSS样式语法 3、vscode自动格式化代码 二、CSS的复合选择器 1、什么是复合选择器 1.1后代选择器(重要) 1.2子选择器(重要) 1.3并集选择器(重要&…

Downie 4 4.6.16 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

SLAM中将地图映射到谷歌地图上的方法——完美运行

文章目录 前言一、rviz_satellite二、mapviz 前言 老是看到论文中有将地图映射到谷歌地图上的图,实在是泰裤辣!!(武汉大学) 搜索了很久,发现有两种可视化软件,分别为rviz_satellite和mapviz。…

换脸ai的方法分享!这几个换脸APP巨好用。​

换脸ai的方法分享!换脸AI是一种基于人工智能技术的图像处理应用,它可以将一个人的面部特征和表情应用到另一张照片或视频中,实现快速、高效的人脸替换。这种技术利用机器学习模型分析和学习大量的人脸数据,训练出一种“生成对抗网…

GPU基础与CUDA编程入门

文章目录 一、GPU和CPU的区别GPU: 高吞吐量导向设计CPU: 低延迟导向设计GPU适合什么场景:什么是Prefetch? 二、CUDA与OpenCL三、CUDA编程并行计算整体流程内存模型线程块网格Grid:并行线程块组合线程束SIMD 四、CUDA编程实例&…

ModuleNotFoundError: No module named ‘allennlp‘解决方法

1. 准备工作 由于本人复现论文要安装allennlp的包但是遇到些问题,所以特地记录一下 需求:在SBN环境下安装allennlp的包 1.创建环境 创建一个环境名为SBN的环境名字 python版本为3.8.5 可以根据自己需求指定, conda create -n SBN python3.8.5conda a…

企业微信-构造网页授权链接实现登录

文档地址:构造网页授权链接 - 接口文档 - 企业微信开发者中心 注意: 1.redirect_uri:回调链接地址,需要使用urlencode对链接进行处理 2.scope:如果需要获取成员的头像、手机号等信息需要设为snsapi_privateinfo 例如前…

ChatGPT4.0火爆全球,是什么让它独领风骚?

ChatGPT造就了互联网历史上又一个神话,仅用两个月时间就成功吸引了1亿用户,成为全球互联网应用中增长速度最快的一个。连比尔盖茨都称:ChatGPT的历史意义重大,不亚于PC或互联网诞生。这个热度以至于ChatGPT官网长期都处于满负荷运…

射频功率放大器在S180肿瘤细胞膜研究中的应用

实验名称:聚焦超声对S180肿瘤细胞膜理化性质的影响 研究方向:生物医疗 测试目的: 细胞膜是细胞生命活动中有着复杂功能的重要结构其基本作用在于维持细胞内外环境的相对稳定而其通透性、完整性及流动性等理化性质则与胞内外信息传递、物质…

Unity——Mirror学习(01)

1.下载 Mirror是一个简单高效的开源的unity多人游戏网络框架,Mirror在Unity商店中是免费的,因此直接加入自己的资源库并在导入即可。 官方API地址:https://mirror-networking.gitbook.io/docs 2.使用 1.创建场景的网络管理器 网络管理器…