SVM —— 理论推导

news2024/12/24 7:40:44

SVM

  • 支持向量
    • 线性可分
    • 最大间隔超平面
    • 最大间隔超平面的推导
    • 支持向量
    • 分类间隔的推导
    • 最优化问题
  • 对偶问题
    • 拉格朗日乘子法
    • 强对偶性
  • SVM 优化
  • 软间隔
    • 解决问题
    • 优化目标及求解
  • 核函数
    • 线性不可分
    • 核函数的作用
    • 常见核函数
  • SVM 算法优缺点

支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,主要用于分类和回归任务。它的核心思想是找到一个最优的超平面或者曲面,将不同类别的样本点分开。

在二分类问题中,SVM 试图找到一个超平面来将两个类别的样本点分隔开,并使得两个类别距离超平面的最小间隔最大化。这个超平面被称为最大间隔超平面。对于非线性可分的情况,SVM 可以通过使用核函数将输入空间映射到高维特征空间,从而使数据在新的特征空间中线性可分。

训练 SVM 模型的过程包括以下步骤:

  1. 收集和准备训练数据集,确保数据集中的标签已知。
  2. 选择合适的核函数,并确定相应的参数。
  3. 构建目标函数,即最大化间隔的优化问题。
  4. 使用优化算法求解目标函数,找到最优的超平面或者曲面。
  5. 根据训练好的模型进行预测和分类。

支持向量

线性可分

通俗的讲:在二维空间中,如果两类点能够被一条直线完全分开,那么这两类点就是线性可分的。

严格的讲: D 0 D_0 D0 D 1 D_1 D1 n n n 维欧式空间中的两个点集,如果存在 n n n 维向量 w w w 和实数 b b b,使得所有属于 D 0 D_0 D0 x i x_i xi 都有 w x i + b > 0 wx_i + b > 0 wxi+b>0,而所有属于 D 1 D_1 D1 的点 x j x_j xj 都有 w x j + b < 0 wx_j + b < 0 wxj+b<0,则称 D 0 D_0 D0 D 1 D_1 D1 线性可分。

在这里插入图片描述

我们从线性可分的二分类问题入手,如下图所示:

在这里插入图片描述

上述图中,红点和蓝点分别表示两个不同的类别,数据显然是线性可分的,但是能够将两类数据分开的直线也显然不止一条。中间那条黑色实线为分界线,我们称之为决策面,一个决策面对应一个线性分类器。从分类结果上看,分类器 A 和分类器 B 的分类效果是相同的,都能把两个类别完全分开。

实际上,分类器 A 和分类器 B 的分类性能是有差距的,如下图所示:

在这里插入图片描述

在决策面不变的情况下,添加了一个红点数据。可以看到,分类器 A 依然能够很好的对其进行分类,而分类器 B 则出现了分类错误,显然分类器 A 的决策面更加稳健。

最大间隔超平面

在决策面不变且不会错分样本的情况下,移动决策面,可以在原决策面两侧分别找到一个极限位置,越过该位置就会导致错分,如上图中的虚线所示。虚线的位置由距离原决策面最近的样本点决定,两条虚线之间的垂直距离就是决策面的分类间隔。

显然,每一个能把两类数据正确分开的方向都有一个最优决策面,这些最优决策面都有各自的分类间隔,其中具有最大间隔的决策面就是 SVM 算法要寻找的最优解。最优解对应的两条虚线穿过的样本点,就是 SVM 中的支持样本点,称之为支持向量。

从二维扩展到多维空间时,能将 D 0 D_0 D0 D 1 D_1 D1 完全分开的 w x + b = 0 wx + b = 0 wx+b=0 就成了一个超平面。为了使这个超平面更具鲁棒性,我们会寻找出一个最佳超平面(即以最大间隔把两类样本分开的超平面),也称之为最大间隔超平面。

最大间隔超平面的推导

我们知道二维空间中的直线方程可写成如下:
y = a x + b y = ax + b y=ax+b
我们做个小改动,将 x x x 轴变成 x 1 x_1 x1,将 y y y 轴变成 x 2 x_2 x2,则有:
x 2 = a x 1 + b    ⟹    a x 1 − x 2 + b = 0 x_2 = ax_1 + b \implies ax_1 - x_2 + b = 0 x2=ax1+bax1x2+b=0
将上述公式向量化,得:
[ a − 1 ] [ x 1 x 2 ] + b = 0    ⟹    w T x + b = 0 \begin{bmatrix}a & -1\end{bmatrix}\begin{bmatrix}x_1 \\ x_2\end{bmatrix}+ b = 0 \implies w^Tx + b = 0 [a1][x1x2]+b=0wTx+b=0
将上述公式从二维空间推广到 n n n 维空间,就变成了超平面方程(一个超平面在二维空间中的实例就是一条直线)。

因此,超平面可以用下式表示:
w T x + b = 0 w^Tx + b = 0 wTx+b=0
其中, w = [ w 1 , w 2 , . . . , w n ] T w=[w_1, w_2, ..., w_n]^T w=[w1,w2,...,wn]T x = [ x 1 , x 2 , . . . , x n ] T x=[x_1, x_2, ..., x_n]^T x=[x1,x2,...,xn]T

支持向量

在这里插入图片描述

距离超平面最近的样本点,就叫做支持向量。

分类间隔的推导

在二维空间中,点 ( x , y ) (x, y) (x,y) 到直线 A x + B y + C = 0 Ax + By + C = 0 Ax+By+C=0 的距离公式可以写成如下:
d = ∣ A x + B y + C ∣ A 2 + B 2 d = \frac{|Ax+By+C|}{\sqrt {A^2 + B^2}} d=A2+B2 Ax+By+C
将直线方程扩展到 n n n 维空间,点 x = ( x 1 , x 2 , . . . , x n ) x=(x_1, x_2, ..., x_n) x=(x1,x2,...,xn) 到超平面 w T x + b = 0 w^Tx + b = 0 wTx+b=0 的距离公式可以写成如下:
d = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ d = \frac{|w^Tx + b|}{||w||} d=∣∣w∣∣wTx+b
其中, ∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 + ⋅ ⋅ ⋅ + w n 2 ||w||=\sqrt {w_1^2 + w_2^2 + ··· + w_n^2} ∣∣w∣∣=w12+w22+⋅⋅⋅+wn2

上式中的 d d d 就是分类间隔,分类间隔越大,我们就认为这个超平面的分类效果越好。此时,求解超平面的问题就转化成了求解分类间隔最大化的问题。

最优化问题

求解最佳超平面(最大间隔超平面)的过程,就叫做最优化。一个最优化问题通常考虑两个基本要素,目标函数与优化对象。在求解最佳超平面的过程中,分类间隔就是目标函数,超平面就是优化对象。我们需要对分类间隔与超平面进行数学建模。

超平面方程在上文中已推导得出,即为 w T x + b = 0 w^Tx + b = 0 wTx+b=0。其中 w w w 是超平面的法向量, b b b 是截距。假设有一个超平面能够将正例和负例完全分开,正例的标签为 1,负例的标签为 -1,那么我们的目标就是要找到最优的 w w w b b b,使得所有正例点满足 w T x + b > = 1 w^Tx + b >= 1 wTx+b>=1,所有负例点满足 w T x + b < = − 1 w^Tx + b <= -1 wTx+b<=1,并且最大化间隔(即正例点和负例点到超平面的距离之和)。

分类间隔方程在上文中也已推导得出,即为 d = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ d = \frac{|w^Tx + b|}{||w||} d=∣∣w∣∣wTx+b,这个就是目标函数。根据支持向量的定义我们知道,支持向量到超平面的距离为 d d d,其他样本点到超平面的距离大于 d d d

在这里插入图片描述

于是,我们可以得出:
{ w T x + b ∣ ∣ w ∣ ∣ ≥ d y = 1 w T x + b ∣ ∣ w ∣ ∣ ≤ − d y = − 1 \left\{\begin{matrix}\frac{w^Tx + b}{||w||} \ge d & y = 1 \\ \frac{w^Tx + b}{||w||} \leq -d & y = -1\end{matrix}\right. {∣∣w∣∣wTx+bd∣∣w∣∣wTx+bdy=1y=1
两边同时除以 d d d,得到:
{ w T x + b ∣ ∣ w ∣ ∣ d ≥ 1 y = 1 w T x + b ∣ ∣ w ∣ ∣ d ≤ − 1 y = − 1 \left\{\begin{matrix}\frac{w^Tx + b}{||w||d} \ge 1 & y = 1 \\ \frac{w^Tx + b}{||w||d} \leq -1 & y = -1\end{matrix}\right. {∣∣w∣∣dwTx+b1∣∣w∣∣dwTx+b1y=1y=1
由于 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ d d d 都是标量,都为正数,因此我们可以令 ∣ ∣ w ∣ ∣ d ||w||d ∣∣w∣∣d 1 1 1(之所以令它为 1 1 1,是为了方便后续的推导和优化,且这个做法对目标函数的优化并无影响),得到:
{ w T x + b ≥ 1 y = 1 w T x + b ≤ − 1 y = − 1 \left\{\begin{matrix}w^Tx + b \ge 1 & y = 1 \\ w^Tx + b \leq -1 & y = -1\end{matrix}\right. {wTx+b1wTx+b1y=1y=1
将两个方程合并(两边同乘以 y y y),得到:
y ( w T x + b ) ≥ 1 y(w^Tx + b) \ge 1 y(wTx+b)1
至此,我们可以得到超平面两侧的经过支持向量且与超平面平行的平面方程,如下图所示:

在这里插入图片描述

每个支持向量到超平面的距离可以写成如下:
d = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ d = \frac{|w^Tx + b|}{||w||} d=∣∣w∣∣wTx+b
由上述 y ( w T x + b ) ≥ 1 > 0 y(w^Tx + b) \ge 1 > 0 y(wTx+b)1>0,可以得到 y ( w T x + b ) = ∣ w T x + b ∣ y(w^Tx + b) = |w^Tx + b| y(wTx+b)=wTx+b y = ± 1 y = \pm 1 y=±1,进而得到:
d = y ( w T x + b ) ∣ ∣ w ∣ ∣ d = \frac{y(w^Tx + b)}{||w||} d=∣∣w∣∣y(wTx+b)
我们可以最大化这个距离:
m a x   2 ∗ y ( w T x + b ) ∣ ∣ w ∣ ∣ max \ 2*\frac{y(w^Tx + b)}{||w||} max 2∣∣w∣∣y(wTx+b)
这里乘上 2 2 2 是为了方便后续的推导,对目标函数没有影响。支持向量样本点有 y ( w T x + b ) = ∣ w T x + b ∣ = 1 y(w^Tx + b) = |w^Tx + b| = 1 y(wTx+b)=wTx+b=1,因此得到最大化距离:
m a x   2 ∣ ∣ w ∣ ∣ max \ \frac{2}{||w||} max ∣∣w∣∣2
将求解 d d d 的最大化问题转化为最小化问题,之所以这样做是为了方便对目标函数进行求导,不影响求解最优化问题,上述式子等效于下式:
m i n   1 2 ∣ ∣ w ∣ ∣ min \ \frac{1}{2}||w|| min 21∣∣w∣∣
去除 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ 的根号,便于后续计算,得到:
m i n   1 2 ∣ ∣ w ∣ ∣ 2 min \ \frac{1}{2}||w||^2 min 21∣∣w2
将目标函数与约束条件放在一起进行描述,得到最优化模型:
m i n   1 2 ∣ ∣ w ∣ ∣ 2    s . t .    y i ( w T x i + b ) ≥ 1    i = 1 , 2 , . . . , n min \ \frac{1}{2}||w||^2 \ \ s.t. \ \ y_i(w^Tx_i + b) \ge 1 \ \ i = 1, 2, ..., n min 21∣∣w2  s.t.  yi(wTxi+b)1  i=1,2,...,n
上述公式描述的是一个典型的不等式约束条件下的二次型函数优化问题,同时也是支持向量机的基本数学模型。

对偶问题

拉格朗日乘子法

如果集合中任意两个元素连线上的点也在集合中,那么这个集合就是凸集。

假设 f ( x ) f(x) f(x) 是定义在区间 L L L 上的函数,若对任意两点 x 1 , x 2 x_1, x_2 x1,x2 和任意的实数 λ ∈ ( 0 , 1 ) \lambda \in (0, 1) λ(0,1),总有 f ( λ x 1 + ( 1 − λ ) x 2 ) ≤ λ f ( x 1 ) + ( 1 − λ ) f ( x 2 ) f(\lambda x_1 + (1 - \lambda)x_2) \leq \lambda f(x_1) + (1 - \lambda)f(x_2) f(λx1+(1λ)x2)λf(x1)+(1λ)f(x2),则称 f ( x ) f(x) f(x) L L L 上的凸函数。

通常,我们求解的最优化问题有如下几类:

  • 无约束的优化问题,可以写成如下:
    m i n   f ( x 1 , x 2 , . . . , x n ) min \ f(x_1, x_2, ..., x_n) min f(x1,x2,...,xn)
    对于此类问题,最常使用的方法便是费马定理,即求导,令导数为零,求出极值点。如果是凸函数,则能保证求出来的解是最优解。

  • 有等式约束的优化问题,可以写成如下:
    m i n   f ( x 1 , x 2 , . . . , x n ) s . t .    h i ( x 1 , x 2 , . . . , x n ) = 0    i = 1 , 2 , . . . , m min \ f(x_1, x_2, ..., x_n) \\ s.t. \ \ h_i(x_1, x_2, ..., x_n) = 0 \ \ i = 1, 2, ..., m min f(x1,x2,...,xn)s.t.  hi(x1,x2,...,xn)=0  i=1,2,...,m
    对于此类问题,最常使用的方法便是拉格朗日乘子法(Lagrange Multiplier),即用一个系数将等式约束与目标函数写在一起,形如 L ( x , λ ) = f ( x ) + ∑ i = 1 m λ i h i ( x ) L(x, \lambda) = f(x) + \displaystyle\sum_{i=1}^{m}\lambda _ih_i(x) L(x,λ)=f(x)+i=1mλihi(x) L ( x , λ ) L(x, \lambda) L(x,λ) 称为拉格朗日函数,系数 λ \lambda λ 称为拉格朗日乘子。

    对拉格朗日函数中的各变量进行求导,令其为零,可求得候选值集合,最后通过验证求得最优值。

    利用必要条件找到可能的极值点,判断是否为极值点,需要根据问题本身的具体情况进行检验,式子如下:
    { ∂ L ∂ x i = 0 i = 1 , 2 , . . . , n ∂ L ∂ λ i = 0 i = 1 , 2 , . . . , m \left\{\begin{matrix}\frac{\partial L}{\partial x_i} = 0 & i = 1, 2, ..., n\\ \frac{\partial L}{\partial \lambda _i} = 0 & i = 1, 2, ..., m \end{matrix}\right. {xiL=0λiL=0i=1,2,...,ni=1,2,...,m
    上述方程组称为等式约束的极值必要条件。等式约束下的拉格朗日乘子法引入了 m m m 个拉个朗日乘子,我们将 x i x_i xi λ i \lambda _i λi 都视作优化变量,因此共有 ( n + m ) (n + m) (n+m) 个优化变量。

  • 有不等式约束的优化问题,可以写成如下:
    m i n   f ( x 1 , x 2 , . . . , x n ) s . t .    g i ( x 1 , x 2 , . . . , x n ) ≤ 0    i = 1 , 2 , . . . , m min \ f(x_1, x_2, ..., x_n) \\s.t. \ \ g_i(x_1, x_2, ..., x_n) \leq 0 \ \ i = 1, 2, ..., m min f(x1,x2,...,xn)s.t.  gi(x1,x2,...,xn)0  i=1,2,...,m
    对于此类问题,最常使用的方法便是 KKT 条件法。同样地,用系数将所有的等式、不等式约束与目标函数写在一起,写在一起的函数也称为拉格朗日函数,系数也叫拉格朗日乘子。

本文中的优化问题属于有不等式约束的优化,针对这种情况,主要思想是通过引入松弛变量将不等式约束转化为等式约束。

在这里插入图片描述

我们的最优化模型如下:
m i n   1 2 ∣ ∣ w ∣ ∣ 2 s . t .    g i ( w ) = 1 − y i ( w T x i + b ) ≤ 0    i = 1 , 2 , . . . , n min \ \frac{1}{2}||w||^2 \\ s.t. \ \ g_i(w) = 1 - y_i(w^Tx_i + b) \leq 0 \ \ i = 1, 2, ..., n min 21∣∣w2s.t.  gi(w)=1yi(wTxi+b)0  i=1,2,...,n
引入松弛变量 a i 2 a_i^2 ai2,得到 h i ( w , a i ) = g i ( w ) + a i 2 = 0 h_i(w, a_i) = g_i(w) + a_i^2 = 0 hi(w,ai)=gi(w)+ai2=0。这里加平方主要是为了不再引入新的约束条件,如果引入的松弛变量为 a i a_i ai,那我们必须要保证 a i ≥ 0 a_i \ge 0 ai0,才能使得 h i ( w , a i ) = 0 h_i(w, a_i) = 0 hi(w,ai)=0

由此,我们将不等式约束转化为了等式约束,并得到拉格朗日函数:
L ( w , λ , a ) = f ( w ) + ∑ i = 1 n λ i h i ( w ) = f ( w ) + ∑ i = 1 n λ i [ g i ( w ) + a i 2 ]      λ i ≥ 0 L(w, \lambda , a) = f(w) + \displaystyle\sum_{i=1}^{n}\lambda _ih_i(w) = f(w) + \displaystyle\sum_{i=1}^{n}\lambda _i[g_i(w) + a_i^2] \ \ \ \ \lambda _i \ge 0 L(w,λ,a)=f(w)+i=1nλihi(w)=f(w)+i=1nλi[gi(w)+ai2]    λi0
根据等式约束优化问题的极值必要条件,联立方程:
{ ∂ L ∂ w i = ∂ f ∂ w i + ∑ i = 1 n λ i ∂ g i ∂ w i = 0 ∂ L ∂ a i = 2 λ i a i = 0 ∂ L ∂ λ i = g i ( w ) + a i 2 = 0 λ i ≥ 0 \left\{\begin{matrix}\frac{\partial L}{\partial w_i} = \frac{\partial f}{\partial w_i} + \displaystyle\sum_{i=1}^{n}\lambda _i\frac{\partial g_i}{\partial w_i} = 0 \\ \frac{\partial L}{\partial a_i} = 2\lambda _ia_i = 0 \\ \frac{\partial L}{\partial \lambda _i} = g_i(w) + a_i^2 = 0 \\ \lambda _i \ge 0\end{matrix}\right. wiL=wif+i=1nλiwigi=0aiL=2λiai=0λiL=gi(w)+ai2=0λi0
针对 λ i = 0 \lambda _i = 0 λi=0,有两种情况:

  • λ i = 0 , a i ≠ 0 \lambda _i = 0, a_i \ne 0 λi=0,ai=0。由于 λ i = 0 \lambda _i = 0 λi=0,因此约束条件 g i ( w ) g_i(w) gi(w) 不起作用,且 g i ( w ) < 0 g_i(w) < 0 gi(w)<0
  • λ i ≠ 0 , a i = 0 \lambda _i \ne 0, a_i = 0 λi=0,ai=0。此时, g i ( w ) = 0 g_i(w) = 0 gi(w)=0 λ i > 0 \lambda _i > 0 λi>0,可以理解为约束条件 g i ( w ) g_i(w) gi(w) 起作用了,且 g i ( w ) = 0 g_i(w) = 0 gi(w)=0
  • 综合可得, λ i g i ( w ) = 0 \lambda _ig_i(w) = 0 λigi(w)=0,且在约束条件起作用时,有 λ i > 0 , g i ( w ) = 0 \lambda _i > 0, g_i(w) = 0 λi>0,gi(w)=0;在约束条件不起作用时,有 λ i = 0 , g i ( w ) < 0 \lambda _i = 0, g_i(w) < 0 λi=0,gi(w)<0

由此,上述方程组转换为:
{ ∂ L ∂ w i = ∂ f ∂ w i + ∑ i = 1 n λ i ∂ g i ∂ w i = 0 λ i g i ( w ) = 0 g i ( w ) ≤ 0 λ i ≥ 0 \left\{\begin{matrix}\frac{\partial L}{\partial w_i} = \frac{\partial f}{\partial w_i} + \displaystyle\sum_{i=1}^{n}\lambda _i\frac{\partial g_i}{\partial w_i} = 0 \\ \lambda _ig_i(w) = 0 \\ g_i(w) \leq 0 \\ \lambda _i \ge 0\end{matrix}\right. wiL=wif+i=1nλiwigi=0λigi(w)=0gi(w)0λi0
以上便是不等式约束优化问题的 KKT(Karush-Kuhn-Tucker)条件, λ i \lambda _i λi 称为 KKT 乘子。上述式子直观地告诉我们,支持向量 g i ( w ) = 0 g_i(w) = 0 gi(w)=0,满足 λ i > 0 \lambda _i > 0 λi>0 即可;其他向量 g i ( w ) < 0 g_i(w) < 0 gi(w)<0,需满足 λ i = 0 \lambda _i = 0 λi=0

根据最优化模型,我们要求的是:
m i n   1 2 ∣ ∣ w ∣ ∣ 2 s . t .    g i ( w ) = 1 − y i ( w T x i + b ) ≤ 0    i = 1 , 2 , . . . , n min \ \frac{1}{2}||w||^2 \\ s.t. \ \ g_i(w) = 1 - y_i(w^Tx_i + b) \leq 0 \ \ i = 1, 2, ..., n min 21∣∣w2s.t.  gi(w)=1yi(wTxi+b)0  i=1,2,...,n
即求 m i n   L ( w , λ , a ) min \ L(w, \lambda, a) min L(w,λ,a) L ( w , λ , a ) L(w, \lambda, a) L(w,λ,a) 写成如下:
L ( w , λ , a ) = f ( w ) + ∑ i = 1 n λ i [ g i ( w ) + a i 2 ] = f ( w ) + ∑ i = 1 n λ i g i ( w ) + ∑ i = 1 n λ i a i 2 L(w, \lambda , a) = f(w) + \displaystyle\sum_{i=1}^{n}\lambda _i[g_i(w) + a_i^2] = f(w) + \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) + \displaystyle\sum_{i=1}^{n}\lambda _ia_i^2 L(w,λ,a)=f(w)+i=1nλi[gi(w)+ai2]=f(w)+i=1nλigi(w)+i=1nλiai2
由于 ∑ i = 1 n λ i a i 2 ≥ 0 \displaystyle\sum_{i=1}^{n}\lambda _ia_i^2 \ge 0 i=1nλiai20,故我们可以将上述问题转化为求 m i n   L ( w , λ ) min \ L(w, \lambda) min L(w,λ),如下所示:
L ( w , λ ) = f ( w ) + ∑ i = 1 n λ i g i ( w ) L(w, \lambda) = f(w) + \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) L(w,λ)=f(w)+i=1nλigi(w)
假设目标函数找到了最佳参数,并取得了最小值 p > 0 p > 0 p>0,即 m i n   1 2 ∣ ∣ w ∣ ∣ 2 = p min \ \frac{1}{2}||w||^2 = p min 21∣∣w2=p。根据上述可知, λ i ≥ 0 , g i ( w ) ≤ 0 , ∑ i = 1 n λ i g i ( w ) ≤ 0 \lambda _i \ge 0, g_i(w) \leq 0, \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) \leq 0 λi0,gi(w)0,i=1nλigi(w)0,因此 m i n   L ( w , λ ) = m i n   f ( w ) + m i n   ∑ i = 1 n λ i g i ( w ) = p + m i n   ∑ i = 1 n λ i g i ( w ) min \ L(w, \lambda) = min \ f(w) + min \ \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) = p + min \ \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) min L(w,λ)=min f(w)+min i=1nλigi(w)=p+min i=1nλigi(w)。而要使得 ∑ i = 1 n λ i g i ( w ) \displaystyle\sum_{i=1}^{n}\lambda _ig_i(w) i=1nλigi(w) 最小,就要使得 λ i \lambda_i λi 最大。故最优化问题可转化为如下:
m i n   L ( w , λ ) = min ⁡ w max ⁡ λ L ( w , λ )    s . t .    λ i ≥ 0 min \ L(w, \lambda) = \min_{w}{\max_{\lambda}{L(w, \lambda)}} \ \ s.t. \ \ \lambda _i \ge 0 min L(w,λ)=wminλmaxL(w,λ)  s.t.  λi0

强对偶性

对偶问题就是将以下式子:
min ⁡ w max ⁡ λ L ( w , λ )    s . t .    λ i ≥ 0 \min_{w}{\max_{\lambda}{L(w, \lambda)}} \ \ s.t. \ \ \lambda _i \ge 0 wminλmaxL(w,λ)  s.t.  λi0
变成了以下式子:
max ⁡ λ min ⁡ w L ( w , λ )    s . t .    λ i ≥ 0 \max_{\lambda}{\min_{w}{L(w, \lambda)}} \ \ s.t. \ \ \lambda _i \ge 0 λmaxwminL(w,λ)  s.t.  λi0
假设对于函数 f ( x ) f(x) f(x),有:
m i n   m a x   f ( x ) ≥ m a x   m i n   f ( x ) min \ max \ f(x) \ge max \ min \ f(x) min max f(x)max min f(x)
也就是说,从最大的里面挑出来最小的也要比从最小的里面挑出来最大的大,这就是弱对偶关系,当且仅当等号成立时,满足强对偶关系。

满足以下两点,强对偶关系便能成立:

  • 对目标函数进行的优化属于凸优化问题。凸优化问题的定义:求取最小值的目标函数为凸函数的一类优化问题。
  • 满足 KKT 条件,KKT 条件是强对偶性的充要条件。

SVM 优化

我们已知 SVM 的优化问题为:
min ⁡ w   1 2 ∣ ∣ w ∣ ∣ 2 s . t .    g i ( w , b ) = 1 − y i ( w T x i + b ) ≤ 0      i = 1 , 2 , . . . , n \min_w \ \frac{1}{2}||w||^2 \\ s.t. \ \ g_i(w, b) = 1 - y_i(w^Tx_i + b) \leq 0 \ \ \ \ i = 1, 2, ..., n wmin 21∣∣w2s.t.  gi(w,b)=1yi(wTxi+b)0    i=1,2,...,n
求解线性可分的 SVM 分类器的步骤为:

  1. 构造拉格朗日函数:
    min ⁡ w , b max ⁡ λ L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 n λ i [ 1 − y i ( w T x i + b ) ]    s . t .    λ i ≥ 0 \min_{w, b}{\max_{\lambda}{L(w, b, \lambda)}} = \frac{1}{2}||w||^2 + \displaystyle\sum_{i=1}^{n}\lambda _i[1 - y_i(w^Tx_i + b)] \ \ s.t. \ \ \lambda _i \ge 0 w,bminλmaxL(w,b,λ)=21∣∣w2+i=1nλi[1yi(wTxi+b)]  s.t.  λi0

  2. 利用强对偶性进行转化(便于后续求导等操作):
    min ⁡ w , b max ⁡ λ L ( w , b , λ ) = max ⁡ λ min ⁡ w , b L ( w , b , λ ) \min_{w, b}{\max_{\lambda}{L(w, b, \lambda)}} = \max_{\lambda}{\min_{w, b}{L(w, b, \lambda)}} w,bminλmaxL(w,b,λ)=λmaxw,bminL(w,b,λ)

  3. 固定 λ \lambda λ,分别对参数 w w w 和参数 b b b 求偏导( L ( w , b , λ ) L(w, b, \lambda) L(w,b,λ) 关于 w 、 b w、b wb 最小化):
    ∂ L ∂ w = w − ∑ i = 1 n λ i x i y i = 0 ∂ L ∂ b = ∑ i = 1 n λ i y i = 0 \frac{\partial L}{\partial w} = w - \displaystyle\sum_{i=1}^{n}\lambda _ix_iy_i = 0 \\\frac{\partial L}{\partial b} = \displaystyle\sum_{i=1}^{n}\lambda _iy_i = 0 wL=wi=1nλixiyi=0bL=i=1nλiyi=0

  4. 将上述结果带回到拉格朗日函数:
    L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 n λ i [ 1 − y i ( w T x i + b ) ] = 1 2 w T w + ∑ i = 1 n λ i − w T ∑ i = 1 n λ i y i x i − b ∑ i = 1 n λ i y i = 1 2 w T ∑ i = 1 n λ i y i x i − w T ∑ i = 1 n λ i y i x i − b ⋅ 0 + ∑ i = 1 n λ i = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j L(w, b, \lambda) = \frac{1}{2}||w||^2 + \displaystyle\sum_{i=1}^{n}\lambda _i[1 - y_i(w^Tx_i + b)] \\ = \frac{1}{2}w^Tw + \displaystyle\sum_{i=1}^{n}\lambda _i - w^T\displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i - b\displaystyle\sum_{i=1}^{n}\lambda _iy_i \\ = \frac{1}{2}w^T\displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i - w^T\displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i - b · 0 + \displaystyle\sum_{i=1}^{n}\lambda _i \\ = \displaystyle\sum_{i=1}^{n}\lambda _i - \frac{1}{2}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\lambda_i\lambda_jy_iy_jx_i^Tx_j L(w,b,λ)=21∣∣w2+i=1nλi[1yi(wTxi+b)]=21wTw+i=1nλiwTi=1nλiyixibi=1nλiyi=21wTi=1nλiyixiwTi=1nλiyixib0+i=1nλi=i=1nλi21i=1nj=1nλiλjyiyjxiTxj
    此时, L ( w , b , λ ) L(w, b, \lambda) L(w,b,λ) 只存在一个变量,即 λ \lambda λ

  5. 内部的最小值求解完成,接着求解外部的最大值:
    max ⁡ λ   [ ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j ] s . t .    ∑ i = 1 n λ i y i = 0 λ i ≥ 0 \max_\lambda \ [\displaystyle\sum_{i=1}^{n}\lambda _i - \frac{1}{2}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\lambda_i\lambda_jy_iy_jx_i^Tx_j] \\s.t. \ \ \displaystyle\sum_{i=1}^{n}\lambda _iy_i = 0 \\\lambda _i \ge 0 λmax [i=1nλi21i=1nj=1nλiλjyiyjxiTxj]s.t.  i=1nλiyi=0λi0
    优化问题变成了上述形式,这是一个二次规划问题,对于此类问题,常用序列最小优化(Sequential Minimal Optimization,SMO)算法进行求解。

    SMO 算法的核心思想非常简单,每次只优化一个参数,而固定住其他参数,仅求解当前这个优化参数的极值。

    SMO 算法每次只优化一个参数,但我们的目标函数有约束条件 ∑ i = 1 n λ i y i = 0 \displaystyle\sum_{i=1}^{n}\lambda _iy_i = 0 i=1nλiyi=0,没法一次只变动一个参数,所以我们选择一次变动两个参数。具体步骤如下:

    • 选择两个需要更新的参数 λ i 、 λ j \lambda _i、\lambda _j λiλj,固定其他参数,于是得到以下约束:
      λ i y i + λ j y j = c      λ i ≥ 0 ,   λ j ≥ 0 \lambda _iy_i + \lambda_jy_j = c \ \ \ \ \lambda _i \ge 0, \ \lambda _j \ge 0 λiyi+λjyj=c    λi0, λj0
      其中 c = − ∑ k ≠ i , j λ k y k c = -\displaystyle\sum_{k \ne {i, j}}\lambda _ky_k c=k=i,jλkyk,由此得出 λ j = c − λ i y i y i \lambda_j = \frac{c - \lambda_iy_i}{y_i} λj=yicλiyi,也就是说,我们可以用 λ i \lambda _i λi 的表达式替代 λ j \lambda _j λj,这样就相当于把目标问题转化成了仅有一个约束条件 λ i ≥ 0 \lambda_i \ge 0 λi0 的最优化问题。

    • 对于仅有一个约束条件的最优化问题,可以对 λ i \lambda _i λi 进行求偏导,令导数为零,求出变量值 λ i _ n e w \lambda _{i\_{new}} λi_new,然后根据 λ i _ n e w \lambda _{i\_{new}} λi_new 求出 λ j _ n e w \lambda _{j\_{new}} λj_new

    • 多次迭代,直至收敛。

    通过 SMO 算法求得最优解 λ ∗ \lambda ^* λ

  6. 构造最大间隔超平面:
    w = ∑ i = 1 n λ i y i x i 1 − y i ( w T x i + b ) = 0 w = \displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i \\1 - y_i(w^Tx_i + b) = 0 w=i=1nλiyixi1yi(wTxi+b)=0
    w w w 是已经求得的。我们知道所有 λ i > 0 \lambda _i > 0 λi>0 对应的点都是支持向量,那么我们可以随便找个支持向量,将其代入式子 1 − y s ( w T x s + b ) = 0 1 - y_s(w^Tx_s + b) = 0 1ys(wTxs+b)=0,两边同乘 y s y_s ys,因为 y s 2 = 1 y_s^2 = 1 ys2=1,因此得到 b = y s − w T x s b = y_s - w^Tx_s b=yswTxs。为了更具鲁棒性,可以求得支持向量的均值:
    b = 1 ∣ S ∣ ∑ s ∈ S ( y s − w T x s ) b = \frac{1}{|S|}\displaystyle\sum_{s \in S}(y_s - w^Tx_s) b=S1sS(yswTxs)
    至此, w w w b b b 均已求出。

    进而构造出最大间隔超平面 w T x + b = 0 w^Tx + b = 0 wTx+b=0

    分类决策函数 f ( x ) = s i g n ( w T x + b ) f(x) = sign(w^Tx + b) f(x)=sign(wTx+b),其中 s i g n ( ⋅ ) sign(·) sign() 为阶跃函数:
    s i g n ( x ) = { − 1 x < 0 0 x = 0 1 x > 0 sign(x) = \left\{\begin{matrix} -1 & x < 0 \\ 0 & x = 0 \\ 1 & x > 0 \end{matrix}\right. sign(x)= 101x<0x=0x>0
    将新样本点导入到决策函数中,即可得到样本的分类结果。

软间隔

解决问题

在实际应用中,完全线性可分的样本集是很少的,如果遇到了无法实现完全线性可分的样本集,该怎么办?如下图所示:

在这里插入图片描述

为了解决上述问题,就提出了软间隔,相比于硬间隔的苛刻条件,软间隔允许个别样本点出现在间隔带里面。也就是说,我们允许部分样本点不满足约束条件 1 − y i ( w T x i + b ) ≤ 0 1 - y_i(w^Tx_i + b) \leq 0 1yi(wTxi+b)0。为了度量这个间隔软到何种程度,我们为每个样本引入了一个松弛变量 ξ i \xi _i ξi,令 ξ i ≥ 0 \xi _i \ge 0 ξi0,且 1 − y i ( w T x i + b ) − ξ i ≤ 0 1 - y_i(w^Tx_i + b) - \xi _i \leq 0 1yi(wTxi+b)ξi0。如下图所示:

在这里插入图片描述

优化目标及求解

增加软间隔后,优化目标就变成了如下:
min ⁡ w   1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i s . t .    g i ( w , b ) = 1 − y i ( w T x i + b ) − ξ i ≤ 0      ξ i ≥ 0 ,    i = 1 , 2 , . . . , n \min_w \ \frac{1}{2}||w||^2 + C\displaystyle\sum_{i=1}^{n}\xi _i \\ s.t. \ \ g_i(w, b) = 1 - y_i(w^Tx_i + b) - \xi _i \leq 0 \ \ \ \ \xi _i \ge 0, \ \ i = 1, 2, ..., n wmin 21∣∣w2+Ci=1nξis.t.  gi(w,b)=1yi(wTxi+b)ξi0    ξi0,  i=1,2,...,n
其中, C C C 是一个大于 0 0 0 的常数(惩罚参数),可以理解为对错误样本的惩罚程度。若 C C C 为无穷大, ξ i \xi _i ξi 必然为无穷小,如此一来线性 SVM 就又变成了线性可分,当 C C C 为有限值时,才会允许部分样本不遵循约束条件。

接下来,我们将针对新的优化目标进行最优化问题求解,求解步骤如下:

  1. 构造拉个朗日函数:
    min ⁡ w , b , ξ max ⁡ λ , μ L ( w , b , ξ , λ , μ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i + ∑ i = 1 n λ i [ 1 − ξ i − y i ( w T x i + b ) ] − ∑ i = 1 n μ i ξ i s . t .    λ i ≥ 0      μ i ≥ 0 \min_{w, b, \xi}{\max_{\lambda, \mu}{L(w, b, \xi, \lambda, \mu)}} = \frac{1}{2}||w||^2 + C\displaystyle\sum_{i=1}^{n}\xi _i + \displaystyle\sum_{i=1}^{n}\lambda _i[1 - \xi _i - y_i(w^Tx_i + b)] - \displaystyle\sum_{i=1}^{n}\mu _i\xi _i \\ s.t. \ \ \lambda _i \ge 0 \ \ \ \ \mu _i \ge 0 w,b,ξminλ,μmaxL(w,b,ξ,λ,μ)=21∣∣w2+Ci=1nξi+i=1nλi[1ξiyi(wTxi+b)]i=1nμiξis.t.  λi0    μi0
    其中, λ i 、 μ i \lambda_i、\mu_i λiμi 是拉格朗日乘子, w 、 b 、 μ i w、b、\mu_i wbμi 是优化问题的参数。

  2. 利用强对偶性进行转化:
    min ⁡ w , b , ξ max ⁡ λ , μ L ( w , b , ξ , λ , μ ) = max ⁡ λ , μ min ⁡ w , b , ξ L ( w , b , ξ , λ , μ ) \min_{w, b, \xi}{\max_{\lambda, \mu}{L(w, b, \xi, \lambda, \mu)}} = \max_{\lambda, \mu}{\min_{w, b, \xi}{L(w, b, \xi, \lambda, \mu)}} w,b,ξminλ,μmaxL(w,b,ξ,λ,μ)=λ,μmaxw,b,ξminL(w,b,ξ,λ,μ)

  3. 分别对参数 w 、 b 、 ξ i w、b、\xi_i wbξi 求偏导,并令偏导为零,得到如下关系:
    w = ∑ i = 1 n λ i y i x i 0 = ∑ i = 1 n λ i y i C = λ i + μ i w = \displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i \\ 0 = \displaystyle\sum_{i=1}^{n}\lambda _iy_i \\ C = \lambda_i + \mu_i w=i=1nλiyixi0=i=1nλiyiC=λi+μi

  4. 将上述结果带回到拉格朗日函数:
    min ⁡ w , b , ξ   L ( w , b , ξ , λ , μ ) = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j \min _{w, b, \xi} \ L(w, b, \xi, \lambda, \mu) = \displaystyle\sum_{i=1}^{n}\lambda _i - \frac{1}{2}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\lambda_i\lambda_jy_iy_jx_i^Tx_j w,b,ξmin L(w,b,ξ,λ,μ)=i=1nλi21i=1nj=1nλiλjyiyjxiTxj
    最小化结果只有 λ \lambda λ,而没有 μ \mu μ,所以只需要最大化 λ \lambda λ 就好。

  5. 内部的最小值求解完成,接着求解外部的最大值:
    max ⁡ λ   [ ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j ] s . t .    ∑ i = 1 n λ i y i = 0 λ i ≥ 0 C − λ i − μ i = 0 \max_\lambda \ [\displaystyle\sum_{i=1}^{n}\lambda _i - \frac{1}{2}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\lambda_i\lambda_jy_iy_jx_i^Tx_j] \\s.t. \ \ \displaystyle\sum_{i=1}^{n}\lambda _iy_i = 0 \\\lambda _i \ge 0 \\C - \lambda_i - \mu_i = 0 λmax [i=1nλi21i=1nj=1nλiλjyiyjxiTxj]s.t.  i=1nλiyi=0λi0Cλiμi=0
    可以发现,软间隔与硬间隔相似,只是多了个约束条件。

    利用 SMO 算法求解最优拉格朗日乘子 λ ∗ \lambda ^* λ

  6. 构造最大间隔超平面:
    w = ∑ i = 1 n λ i y i x i b = 1 ∣ S ∣ ∑ s ∈ S ( y s − w T x s ) w = \displaystyle\sum_{i=1}^{n}\lambda _iy_ix_i \\b = \frac{1}{|S|}\displaystyle\sum_{s \in S}(y_s - w^Tx_s) w=i=1nλiyixib=S1sS(yswTxs)
    将求得的 λ i \lambda_i λi 代入上式,得到 w w w b b b,最终求得超平面 w T x + b = 0 w^Tx + b = 0 wTx+b=0

核函数

线性不可分

上述讨论的硬间隔和软间隔都是在说样本集的完全线性可分或大部分线性可分,但是我们可能会碰到的一种情况是样本点不是线性可分的,如下图所示:

在这里插入图片描述

这种情况的解决办法就是,将二维空间中线性不可分的样本点映射到高维空间中,让样本点在高维空间中实现线性可分,如下图所示:

在这里插入图片描述

对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到的支持向量机,就是非线性 SVM。

我们用 x x x 表示原来的样本点,用 ϕ ( x ) \phi (x) ϕ(x) 表示 x x x 映射到新的特征空间后得到的新向量,那么分隔的超平面可以表示为 f ( x ) = w ϕ ( x ) + b f(x) = w\phi (x) + b f(x)=(x)+b

对于非线性 SVM,对偶问题就变成了如下:
min ⁡ λ   [ 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( ϕ ( x i ) ⋅ ϕ ( x j ) ) − ∑ i = 1 n λ i ] s . t .    ∑ i = 1 n λ i y i = 0 λ i ≥ 0 C − λ i − μ i = 0 \min_\lambda \ [\frac{1}{2}\displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{n}\lambda _i\lambda _jy_iy_j(\phi (x_i) · \phi (x_j)) - \displaystyle\sum_{i=1}^{n}\lambda _i] \\s.t. \ \ \displaystyle\sum_{i=1}^{n}\lambda _iy_i = 0 \\\lambda _i \ge 0 \\C - \lambda_i - \mu_i = 0 λmin [21i=1nj=1nλiλjyiyj(ϕ(xi)ϕ(xj))i=1nλi]s.t.  i=1nλiyi=0λi0Cλiμi=0
可以看到非线性 SVM 与线性 SVM 唯一的不同之处,就是之前的 ( x i ⋅ x j ) (x_i · x_j) (xixj) 变成了 ( ϕ ( x i ) ⋅ ϕ ( x j ) ) (\phi (x_i) · \phi (x_j)) (ϕ(xi)ϕ(xj))

核函数的作用

为什么需要核函数呢?这是因为低维空间映射到高维空间后,维度可能会很大,如果对全部样本进行点乘计算,可能会耗费很大的计算量。

但如果存在这样的一个核函数 k ( x , y ) = ( ϕ ( x i ) , ϕ ( x j ) ) k(x, y) = (\phi (x_i), \phi (x_j)) k(x,y)=(ϕ(xi),ϕ(xj)),使得 x i x_i xi x j x_j xj 在特征空间的内积等于它们在原始样本空间中通过函数 k ( x , y ) k(x, y) k(x,y) 计算得到的结果,我们就不需要计算高维甚至无穷维空间的内积了。

举个例子,假设我们有一个多项式核函数:
k ( x , y ) = ( x ⋅ y + 1 ) 2 k(x, y) = (x · y + 1)^2 k(x,y)=(xy+1)2
将样本点代入:
k ( x , y ) = ( ∑ i = 1 n ( x i ⋅ y i ) + 1 ) 2 k(x, y) = (\displaystyle\sum_{i=1}^{n}(x_i · y_i) + 1)^2 k(x,y)=(i=1n(xiyi)+1)2
展开后:
∑ i = 1 n x i 2 y i 2 + ∑ i = 2 n ∑ j = 1 i − 1 ( 2 x i x j ) ( 2 y i y j ) + ∑ i = 1 n ( 2 x i ) ( 2 y i ) + 1 \displaystyle\sum_{i=1}^{n}x_i^2y_i^2 + \displaystyle\sum_{i=2}^{n}\displaystyle\sum_{j=1}^{i-1}(\sqrt 2x_ix_j)(\sqrt 2y_iy_j) + \displaystyle\sum_{i=1}^{n}(\sqrt 2x_i)(\sqrt 2y_i) + 1 i=1nxi2yi2+i=2nj=1i1(2 xixj)(2 yiyj)+i=1n(2 xi)(2 yi)+1
如果没有核函数,则需要把原样本点向量映射为:
x ′ = ( x 1 2 , . . . , x n 2 , . . . , 2 x 1 , . . . , 2 x n , 1 ) x' = (x_1^2, ..., x_n^2, ..., \sqrt 2x_1, ..., \sqrt 2x_n, 1) x=(x12,...,xn2,...,2 x1,...,2 xn,1)
再将其运用于内积计算,才能与多项式核函数达到相同的效果。

可见核函数的引入一方面减少了计算量,另一方面也减少了存储数据时的内存消耗。

常见核函数

常用的核函数有如下:

  • 线性核函数:
    k ( x i , x j ) = x i T x j k(x_i, x_j) = x_i^Tx_j k(xi,xj)=xiTxj

  • 多项式核函数:
    k ( x i , x j ) = ( x i T x j ) d k(x_i, x_j) = (x_i^Tx_j)^d k(xi,xj)=(xiTxj)d

  • 高斯核函数:
    k ( x i , x j ) = e − ∣ ∣ x i − x J ∣ ∣ 2 σ 2 k(x_i, x_j) = e^{-\frac{||x_i - x_J||}{2\sigma ^2}} k(xi,xj)=e2σ2∣∣xixJ∣∣

上述是三个常用的核函数,其中只有高斯核函数是需要调参的。

SVM 算法优缺点

优点

  • 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;
  • 能找出对任务至关重要的关键样本(即支持向量);
  • 采用核技巧之后,可以处理非线性分类/回归任务;
  • 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

缺点

  • 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为 O ( N 2 ) O(N^2) O(N2),其中 N N N 为训练样本的数量;

  • 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 O ( N 2 ) O(N^2) O(N2)

  • 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

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

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

相关文章

一、Java基础语法

注意&#xff1a; ​ 用记事本打开本文档&#xff0c;格式较差。 ​ 可安装typora软件后再次打开。 ​ 安装包位于&#xff1a;day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exe day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作…

BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-软件定时器)

简介 RT-Thread 软件定时器的简单使用步骤 创建项目 参考 BearPi RT-Thread项目创建 定时器管理接口 定时器时钟节拍 定时器管理相关函数 定时器类型 #define RT_TIMER_FLAG_ONE_SHOT 0x0 //一次性计时器 #define RT_TIMER_FLAG_PERIODIC 0x2 // 周期性定时器 #…

博特激光:紫外激光打标机在玻璃行业的应用

随着科技的飞速发展&#xff0c;紫外激光打标机在玻璃行业的应用日益广泛。这种高效、高精度的打标设备为玻璃制品的标识和加工带来了革命性的变革&#xff0c;助力企业提升生产效率和产品质量。 ​ ​ 一、玻璃制品标识 紫外激光打标机采用高能量密度的激光束&#xff0c;能够…

Postman接口自动化测试之——批量执行(集合操作)

集合定义&#xff1a;在接口自动化测试过程中将一组请求&#xff08;多条请求&#xff09;保存到一起进行集中管理。方便执行过程中的维护、导出和执行等。 创建集合 在引导页点击“Collection”&#xff0c;或者在“Collection”标签点击图标&#xff1b; 字段解释 集合描述…

初识Redis缓存,一文掌握Redis重要知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

LazyIDA源码阅读

LazyIDA是一款IDA插件&#xff0c;项目地址GitHub - L4ys/LazyIDA: Make your IDA Lazy! 外部引用 from __future__ import division from __future__ import print_function from struct import unpack import idaapi import idautils import idcfrom PyQt5.Qt import QAppli…

idea过往各版本下载

idea过往各版本下载 https://www.jetbrains.com/zh-cn/idea/download/other.html

动手学深度学习2 安装环境

pytorch环境安装 1. windows 环境安装2. mac环境安装3. linux环境安装1. 申请云服务器 链接机器--Ubuntu2. 环境配置 4. 不安装环境直接使用colabQA 课程链接&#xff1a; https://www.bilibili.com/video/BV18p4y1h7Dr?p1&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 1.…

STM32----HAL库函数

1.STM32系统框架 1.1 Cortex-M内核&芯片 1.2 F1系统框架 4个主动单元4个被动单元 AHB&#xff1a;高级高性能总线 APH&#xff1a;高级外围总线 其中 1 为 主动单元 &#xff0c; 2为被动单元 总线时钟频率&…

计算机网络(3):数据链路层

数据链路层属于计算机网络的低层。 数据链路层使用的信道主要有以下两种类型&#xff1a; (1)点对点信道。这种信道使用一对一的点对点通信方式。 (2)广播信道。这种信道使用一对多的广播通信方式。广播信道上连接的主机很多&#xff0c;因此必须使用专用的共享信道协议来协调这…

Springboot项目启动前,使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上

Springboot项目启动前&#xff0c;使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上 效果预览 Mac Os效果图 Windows 10 效果图 需求分析 做这样的一个功能并不适用于所有系统&#xff0c;主要用于交付给用户的产品&#xff0c;这样方便客户自行维护。传统的服务一般…

Scratch:让少儿编程变得简单有趣

在21世纪这个信息化、数字化的时代&#xff0c;编程已经成为一种重要的技能。然而&#xff0c;对于许多孩子来说&#xff0c;编程可能是一种难以理解和掌握的技能。那么&#xff0c;有没有一种方法&#xff0c;可以让孩子们在轻松愉快的环境中学习编程呢&#xff1f;答案是肯定…

2024年电工(初级)证模拟考试题库及电工(初级)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;初级&#xff09;证模拟考试题库及电工&#xff08;初级&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;电工&#xff08;初级&#xff09;证模拟考试题库是根据电工&…

简单的git操作指令

简单的git操作指令 1. git clone2. git add .3. git commit4. git push5. git rm6. git status7. git log8. git pull 1. git clone 如果有小伙伴出现报错的情况&#xff0c;爆出错误fatal: unable to access…not resolve host或者Network is unreachable可以看看这篇文章。 …

第三周:Python能力复盘

资料&#xff1a; 《笨办法学Python》阅读地址&#xff1a;https://www.bookstack.cn/read/LearnPython3TheHardWay 《廖雪峰Python教程》阅读地址&#xff1a;http://t.cn/RK0qGu7 《机器学习numpy与pandas基础》&#xff1a;https://zhuanlan.zhihu.com/p/639733816 《matplo…

手把手教你使用Cypress进行端到端测试

一、引言 Cypress是一个流行的端到端测试框架&#xff0c;它提供了一个全面的解决方案&#xff0c;可以测试任何在浏览器中运行的内容。不论你是想为一个小型项目添加测试&#xff0c;还是在大型企业级应用中进行端到端测试&#xff0c;Cypress都是一个不错的选择。本文将会手…

堆与二叉树(上)

本篇主要讲的是一些概念&#xff0c;推论和堆的实现&#xff08;核心在堆的实现这一块&#xff09; 涉及到的一些结论&#xff0c;证明放到最后&#xff0c;可以选择跳过&#xff0c;知识点过多&#xff0c;当复习一用差不多&#xff0c;如果是刚学这一块的&#xff0c;建议打…

python实现贪吃蛇游戏

文章目录 1、项目说明2、项目预览3、开发必备4、贪吃蛇代码实现4.1、窗口和基本参数实现4.2、绘制背景4.3、绘制墙壁4.4、绘制贪吃蛇4.5、绘制食物4.6、实现长度信息显示4.7、定义游戏暂停界面4.8、定义贪吃蛇死亡界面4.9、实现贪吃蛇碰撞效果4.10、实现添加食物功能4.11、实现…

怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

DC-DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标&#xff0c;电源模块的稳定性直接影响着电源产品和设备的工作稳定性。DC-DC电源模块的稳定性&#xff0c;可以通过检测输出电压、输出电流、负载、波形、效率等参数来评估。 1. 静态测试方法 静态测试是通过直流电压…

理解SwiftUI中的matchedGeometryEffect

matchedGeometryEffect SwiftUI 2.0 引入了一个新的修饰符&#xff1a;matchedGeometryEffect 。使用matchedGeometryEffect可以为整个层次结构中的视图创建过渡动画。只需要将它附加到要进行动画处理的两个视图上&#xff0c;并给它们指定相同的标识符。有了 matchedGeometry…