【机器学习】SVM支持向量机(一)
介绍
支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点,并且尽可能地最大化离该超平面最近的数据点(支持向量)之间的间隔。这使得 SVM 具有良好的泛化能力,即能够很好地处理未见过的数据。
SVM 的工作原理
- 线性可分情况:
- 在最简单的情况下,如果数据集是线性可分的,SVM 试图找到一个最佳的直线(在二维空间中)或超平面(在多维空间中),它能将两个类别完全分开。
- 这个超平面的选择不仅取决于它可以正确分类训练数据,还在于它能够使两类样本到超平面的距离最大。这样的决策边界被称为最大间隔超平面。
- 非线性可分情况:
- 当数据不是线性可分时,可以通过核函数(Kernel Function)将原始特征映射到更高维度的空间,在这个新的空间中寻找线性分离的可能性。
- 常见的核函数包括多项式核、径向基函数(RBF Kernel)、Sigmoid 核等。选择合适的核函数对于提高 SVM 的性能至关重要。
- 软间隔与正则化:
- 现实世界的数据往往存在噪声或者异常值,严格的线性分割可能会导致过拟合问题。因此,引入了软间隔的概念,允许一些数据点位于错误的一侧。
- 正则化参数 C 控制着对误分类的惩罚程度;较小的 C 值意味着更宽的间隔但可能更多的容许误差,而较大的 C 则追求更高的准确率但可能导致过拟合。
- 支持向量:
- 决定最终超平面位置的关键数据点称为支持向量。这些点位于间隔边界上,或者是在软间隔设定下违反边界的点。
- 只有支持向量影响了模型的学习过程,其他不在间隔内的点对构建超平面没有贡献。
- 多分类问题:
- 对于多于两个类别的分类任务,可以采用一对多(One-vs-Rest, OvR)或一对一(One-vs-One, OvO)的方法构建多个二分类器,然后根据投票或其他策略确定最终类别标签。
SVM 的优点
- 高效率:在高维空间表现良好,即使当特征数量超过样本数量时也能有效工作。
- 强大的数学基础:基于凸优化理论,保证了全局最优解的存在性和唯一性。
- 适用于小规模数据集:不需要大量的训练数据即可获得较好的效果。
- 灵活性:通过不同的核函数可以适应各种类型的数据分布。
SVM 的局限性
- 计算复杂度:随着训练样本数目的增加,训练时间和内存消耗也会显著增长。
- 对参数敏感:如核函数的选择、正则化参数 C 和核参数(例如 RBF 的 gamma 参数),需要仔细调整以达到最佳性能。
- 解释性差:相比于决策树之类的算法,SVM 提供的模型通常难以直观理解。
1、支持向量机SVM
对两类样本点进行分类,如下图,有a线、b线、c线三条线都可以将两类样本点很好的分开类,我们可以观察到b线将两类样本点分类最好,原因是我们训练出来的分类模型主要应用到未知样本中,虽然a、b、c三条线将训练集都很好的分开类,但是当三个模型应用到新样本中时,b线抗干扰能力最强,也就是泛化能力最好,样本变化一些关系不大,一样能被正确的分类。那么如何确定b线的位置呢?我们可以使用支持向量机SVM来确定b线的位置。
支持向量机(support vector machines,SVM)是一种二分类算法,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,如果对应的样本特征少,一个普通的SVM就是一条线将样本分隔开,但是要求线到两个类别最近样本点的距离要最大。
b线就是我们根据支持向量机要找到的分割线,这条线需要到两个类别最近的样本点最远,图上的距离就是d,由于这条线处于两个类别的中间,所以到两个类别的距离都是d。
支持向量机SVM算法就是在寻找一个最优的决策边界(上图中的两条虚线)来确定分类线b,所说的支持向量(support vector)就是距离决策边界最近的点(上图中p1、p2、p3点,只不过边界穿过了这些点)。如果没有这些支持向量点,b线的位置就要改变,所以 SVM就是根据这些支持向量点来最大化margin,来找到了最优的分类线(machine,分类器) ,这也是SVM分类算法名称的由来。
2、构建SVM目标函数
接着上面的分类问题来分析,假设支持向量机最终要找的线是 l 2 l_2 l2,决策边界两条线是 l 1 l_1 l1和 l 3 l_3 l3,那么假设 l 2 l_2 l2的方程为 w T ⋅ x + b = 0 w^T \cdot x + b =0 wT⋅x+b=0,这里 w w w表示 ( w 1 , w 2 ) T (w_1,w_2)^T (w1,w2)T, x x x表示 ( x 1 , x 2 ) T (x_1,x_2)^T (x1,x2)T,我们想要确定 l 2 l_2 l2直线,只需要确定w和b即可,此外,由于 l 1 l_1 l1和 l 3 l_3 l3线是 l 2 l_2 l2的决策分类边界线,一定与 l 2 l_2 l2是平行的,平行就意味着斜率不变,b变化即可,所以我们可以假设 l 1 l_1 l1线的方程为 w T ⋅ x + b = c w^T \cdot x +b = c wT⋅x+b=c, l 3 l_3 l3线的方位为 w T ⋅ x + b = − c w^T\cdot x + b = -c wT⋅x+b=−c。
【知识补充】:
- 二维空间点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到直线 A x + B y + C = 0 Ax + By + C = 0 Ax+By+C=0的距离公式是:
d = ∣ A x 1 + B y 1 + C ∣ A 2 + B 2 d = \frac{|Ax_1 + By_1 + C|}{\sqrt{A^2 + B^2}} d=A2+B2∣Ax1+By1+C∣
- 两条平行线 A x + B y + C 1 = 0 Ax + By + C_1 = 0 Ax+By+C1=0与 A x + B y + C 2 = 0 Ax + By + C_2= 0 Ax+By+C2=0之间的距离公式为:
d = ∣ C 1 − C 2 ∣ A 2 + B 2 d = \frac{|C_1 - C_2|}{\sqrt{A^2 + B^2}} d=A2+B2∣C1−C2∣
我们希望的是决策边界上的样本点到 l 2 l_2 l2直线的距离d越大越好。我们可以直接计算 l 1 l_1 l1或 l 3 l_3 l3上的点到直线 l 2 l_2 l2的距离,假设将空间点扩展到n维空间后,点 x i = ( x 1 , x 2 , ⋯ , x n ) x_i = (x_1,x_2,\cdots,x_n) xi=(x1,x2,⋯,xn)到直线 w T ⋅ x + b = 0 w^T \cdot x +b = 0 wT⋅x+b=0(严格意义上来说直线变成了超平面)的距离为:
d = ∣ w T ⋅ x i + b ∣ ∣ ∣ w ∣ ∣ d = \frac{|w^T\cdot x_i +b|}{||w||} d=∣∣w∣∣∣wT⋅xi+b∣
以上 ∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 + ⋯ + w n 2 ||w|| = \sqrt{w_1^2 + w_2^2 + \cdots + w_n^2} ∣∣w∣∣=w12+w22+⋯+wn2,读作“w的模”。
由于 l 1 l_1 l1、 l 2 l_2 l2和 l 3 l_3 l3三条直线平行,d也是两条平行线之间的距离,我们可以根据两条平行线之间的距离公式得到d值如下:
d = ∣ C − 0 ∣ ∣ ∣ w ∣ ∣ = ∣ − C − 0 ∣ ∣ ∣ w ∣ ∣ = ∣ C ∣ ∣ ∣ w ∣ ∣ = ∣ w T ⋅ x i + b ∣ ∣ ∣ w ∣ ∣ d = \frac{|C - 0|}{||w||} = \frac{|-C - 0|}{||w||} = \frac{|C|}{||w||} = \frac{|w^T\cdot x_i +b|}{||w||} d=∣∣w∣∣∣C−0∣=∣∣w∣∣∣−C−0∣=∣∣w∣∣∣C∣=∣∣w∣∣∣wT⋅xi+b∣
我们可以看到无论计算点到直线的距离还是两个平行线之间的距离,最终结果是一致的。对于 l 1 l_1 l1直线 w T ⋅ x + b = c w^T\cdot x +b = c wT⋅x+b=c,我们可以相对应成比例的缩小各项的系数,例如变成 w T 2 ⋅ x + b 2 = c 2 \frac{w^T}{2}\cdot x + \frac{b}{2}=\frac{c}{2} 2wT⋅x+2b=2c,这条直线还是原来本身的直线,现在我们可以把它变成 w T c ⋅ x + b c = c c = 1 \frac{w^T}{c}\cdot x + \frac{b}{c}=\frac{c}{c}=1 cwT⋅x+cb=cc=1,即改写后的 l 1 l_1 l1直线 w T ⋅ x + b = 1 w^T\cdot x +b = 1 wT⋅x+b=1还是原来的直线,同理,对于 l 3 l_3 l3直线我们也可以变换成 w T ⋅ x + b = − 1 w^T\cdot x +b = -1 wT⋅x+b=−1,所以上图可以改变成如下:
那么变换之后的d可以根据两条平行线之间的距离得到:
d = 1 ∣ ∣ w ∣ ∣ = 1 ∣ ∣ w ∣ ∣ d = \frac{1}{||w||} = \frac{1}{||w||} d=∣∣w∣∣1=∣∣w∣∣1
我们希望决策边界上的点到超平面 l 2 l_2 l2距离d越大越好。我们将 l 3 l_3 l3上方的点分类标记为“1”类别,将 l 1 l_1 l1下方的点分类标记为“-1”类别,那么我们可以得到如下公式:
{ w T ⋅ x i + b ≥ 1 y = 1 ( 1 ) 式 w T ⋅ x i + b ≤ 1 y = − 1 ( 2 ) 式 \left \{\begin{aligned}&w^T\cdot x_i +b \ge 1 \quad y = 1 \quad (1)式\\\\&w^T\cdot x_i +b \le 1\quad y = -1\quad (2)式 \end{aligned}\right. ⎩ ⎨ ⎧wT⋅xi+b≥1y=1(1)式wT⋅xi+b≤1y=−1(2)式
两式两侧分别乘以对应的类别可以合并为一个式子:
y ⋅ ( w T ⋅ x i + b ) ≥ 1 ( 3 ) 式 y\cdot (w^T\cdot x_i +b) \ge 1 \quad (3)式 y⋅(wT⋅xi+b)≥1(3)式
所以在计算d的最大值时,是有限制条件的,这个限制条件就是(3)式。
所以对于所有样本点我们需要在满足 y ⋅ ( w T ⋅ x i + b ) ≥ 1 y\cdot (w^T\cdot x_i +b) \ge 1 y⋅(wT⋅xi+b)≥1条件下,最大化 d = 1 ∣ ∣ w ∣ ∣ d = \frac{1}{||w||} d=∣∣w∣∣1,就是最小化 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣,等效于最小化 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2,这样转换的目的就是为了后期优化过程中求导时方便操作,不会影响最终的结果,所以在支持向量机SVM中要确定一个分类线,我们要做的就是在 y ⋅ ( w T ⋅ x i + b ) ≥ 1 y\cdot (w^T\cdot x_i +b) \ge 1 y⋅(wT⋅xi+b)≥1条件下最小化 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2,记为:
m i n 1 2 ∣ ∣ w ∣ ∣ s . t y ⋅ ( w T ⋅ x i + b ) ≥ 1 , i = 1 , 2 , ⋯ , n min\frac{1}{2}||w||\quad s.t\quad y\cdot (w^T\cdot x_i +b) \ge 1,\quad i = 1,2,\cdots,n min21∣∣w∣∣s.ty⋅(wT⋅xi+b)≥1,i=1,2,⋯,n
以上n代表样本总数,缩写 s . t s.t s.t表示“Subject to”是“服从某某条件”的意思,上述公式描述的是一个典型的不等式约束条件下的二次型函数优化问题,同时也是支持向量机的基本数学模型,这里我们称支持向量机的目标函数。
3、拉格朗日乘数法、KKT条件、对偶
3.1、拉格朗日乘数法
拉格朗日乘数法主要是将有等式约束条件优化问题转换为无约束优化问题 ,拉格朗日乘数法如下:
假设 x = [ x 1 , x 2 , ⋯ , x n ] x = [x_1,x_2,\cdots,x_n] x=[x1,x2,⋯,xn]是一个n维向量, f ( x ) f(x) f(x)和 h ( x ) h(x) h(x)含有x的函数,我们需要找到满足 h ( x ) = 0 h(x)=0 h(x)=0条件下 f ( x ) f(x) f(x)最小值,如下:
m i n f ( x ) s . t h ( x ) = 0 minf(x)\quad s.t \quad h(x) = 0 minf(x)s.th(x)=0
可以引入一个自变量 λ \lambda λ,其可以取任意值,则上式严格等价于下式:
L ( x , λ ) = f ( x ) + λ h ( x ) L(x,\lambda) = f(x) + \lambda h(x) L(x,λ)=f(x)+λh(x)
L ( x , λ ) L(x,\lambda) L(x,λ)叫做Lagrange函数(拉格朗日函数), λ \lambda λ叫做拉格朗日乘子(其实就是系数)。令 L ( x , λ ) L(x,\lambda) L(x,λ)对x的导数为0,对 λ \lambda λ的导数为0,求解出 x , λ x,\lambda x,λ 的值,那么x就是函数 f ( x ) f(x) f(x)在附加条件 h ( x ) h(x) h(x)下极值点。
以上就是拉格朗日乘数法,通俗理解拉格朗日乘数法就是将含有等式条件约束优化问题转换成了无约束优化问题构造出拉格朗日函数 L ( x , λ ) L(x,\lambda) L(x,λ),让 L ( x , λ ) L(x,\lambda) L(x,λ)对未知数x和 λ \lambda λ进行求导,得到一组方程式,可以计算出对应的x和 λ \lambda λ结果,这个x对应的 f ( x ) f(x) f(x)函数值就是在条件 h ( x ) = 0 h(x) = 0 h(x)=0下的最小值点。
拉格朗日函数转换成等式过程的证明涉及到导数积分等数学知识,这里不再证明。
3.2、KKT条件
假设我们面对的是不等式条件约束优化问题,如下:
假设 x = [ x 1 , x 2 , ⋯ , x n ] x = [x_1,x_2,\cdots,x_n] x=[x1,x2,⋯,xn]是一个n维向量, f ( x ) f(x) f(x)和 h ( x ) h(x) h(x)是含有x的函数,我们需要找到满足 h ( x ) ≤ 0 h(x) \le 0 h(x)≤0条件下 f ( x ) f(x) f(x)最小值,如下:
m i n f ( x ) s . t h ( x ) ≤ 0 − − − 式① minf(x)\quad s.t \quad h(x) \le 0\quad ---式① minf(x)s.th(x)≤0−−−式①
针对上式,显然是一个不等式约束最优化问题,不能再使用拉格朗日乘数法,因为拉格朗日乘数法是针对等式约束最优化问题。
那我们可以考虑加入一个“松弛变量” α 2 \alpha^2 α2让条件 h ( x ) ≤ 0 h(x) \le0 h(x)≤0来达到等式的效果,即使条件变成 h ( x ) + α 2 = 0 h(x) + \alpha^2 =0 h(x)+α2=0,这里加上 α 2 \alpha^2 α2的原因是保证加的一定是非负数,即: α 2 ≥ 0 \alpha^2 \ge 0 α2≥0,但是目前不知道这个 α 2 \alpha^2 α2值是多少,一定会找到一个合适的 α 2 \alpha^2 α2值使 h ( x ) + α 2 = 0 h(x) +\alpha^2 = 0 h(x)+α2=0成立,所以将①式改写成如下:
m i n f ( x ) s . t h ( x ) + α 2 = 0 − − − 式② minf(x)\quad s.t\quad h(x) + \alpha^2 =0 \quad ---式② minf(x)s.th(x)+α2=0−−−式②
以上②式变成了等式条件约束优化问题,我们就可以使用拉格朗日乘数法来求解满足等式条件下 f ( x ) f(x) f(x)最小值对应的x值。
通过拉格朗日乘数法,将②式转换为如下:
L ( x , λ , α ) = f ( x ) + λ ( h ( x ) + α 2 ) L(x,\lambda,\alpha) = f(x) + \lambda(h(x) + \alpha^2) L(x,λ,α)=f(x)+λ(h(x)+α2)
但是上式中 λ \lambda λ值必须满足 λ ≥ 0 \lambda \ge 0 λ≥0,由于 L ( x , λ , α ) L(x,\lambda,\alpha) L(x,λ,α)变成了有条件的拉格朗日函数,这里需要求 m i n L ( x , λ , α ) minL(x,\lambda,\alpha) minL(x,λ,α) 对应下的x值 。至于为什么 λ ≥ 0 \lambda \ge 0 λ≥0及为什么计算的是 m i n L ( x , λ , α ) minL(x,\lambda,\alpha) minL(x,λ,α)下对应的x值,这里证明涉及到很多几何性质,这里也不再证明。
所以将上式转换成如下拉格朗日函数:
m i n L ( x , λ , α ) = f ( x ) + λ ( h ( x ) + α 2 ) λ ≥ 0 − − − 式③ minL(x,\lambda,\alpha) = f(x) + \lambda(h(x) + \alpha^2) \quad \lambda \ge 0\quad---式③ minL(x,λ,α)=f(x)+λ(h(x)+α2)λ≥0−−−式③
以上我们可以看到将不等式条件约束优化问题加入“松弛变量”转换成等式条件约束优化问题,使用拉格朗日乘数法进行转换得到 L ( x , λ , α ) L(x,\lambda,\alpha) L(x,λ,α),我们先抛开min,下面我们可以对拉格朗日函数 L ( x , λ , α ) L(x,\lambda,\alpha) L(x,λ,α)对各个未知数 x , λ , α x,\lambda,\alpha x,λ,α进行求导,让对应的导数为零,得到以下联立方程:
{ ∂ L ∂ x = ∂ f ( x ) ∂ x + λ ∂ h ( x ) ∂ x = 0 − − − 式④ ∂ L ∂ λ = h ( x ) + α 2 = 0 − − − 式⑤ ∂ L ∂ α = 2 λ α = 0 − − − 式⑥ λ ≥ 0 − − − 式⑦ \left \{\begin{aligned}&\frac{\partial L}{\partial x} = \frac{\partial f(x)}{\partial x} + \lambda \frac{\partial h(x)}{\partial x} = 0\quad ---式④\\\\&\frac{\partial L}{\partial \lambda} = h(x) + \alpha^2 = 0\quad ---式⑤\\\\&\frac{\partial L}{\partial \alpha} = 2\lambda\alpha = 0\quad---式⑥\\\\&\lambda \ge 0\quad ---式⑦ \end{aligned}\right. ⎩ ⎨ ⎧∂x∂L=∂x∂f(x)+λ∂x∂h(x)=0−−−式④∂λ∂L=h(x)+α2=0−−−式⑤∂α∂L=2λα=0−−−式⑥λ≥0−−−式⑦
从上式⑥式可知 λ α = 0 \lambda\alpha=0 λα=0,我们分两种情况讨论:
- λ = 0 , α ≠ 0 \lambda =0,\alpha \neq 0 λ=0,α=0
由于 λ = 0 \lambda = 0 λ=0,根据③式可知,约束不起作用,根据①式可知 h ( x ) ≤ 0 h(x) \le 0 h(x)≤0。
- λ ≠ 0 , α = 0 \lambda \neq 0,\alpha =0 λ=0,α=0
由于 λ ≠ 0 \lambda \neq 0 λ=0,根据③式可知 λ > 0 \lambda > 0 λ>0。由于 α = 0 \alpha =0 α=0,约束条件起作用,根据⑤式可知, h ( x ) = 0 h(x) = 0 h(x)=0。
综上两个步骤我们可以得到 λ ⋅ h ( x ) = 0 \lambda \cdot h(x) = 0 λ⋅h(x)=0,且在约束条件起作用时, λ > 0 , h ( x ) = 0 \lambda >0,h(x) = 0 λ>0,h(x)=0;约束条件不起作用时, λ = 0 , h ( x ) ≤ 0 \lambda =0,h(x) \le 0 λ=0,h(x)≤0。
上面方程组中的⑥式可以改写成 λ ⋅ h ( x ) = 0 \lambda\cdot h(x) = 0 λ⋅h(x)=0。由于 α 2 ≥ 0 \alpha^2 \ge 0 α2≥0,所以将⑤式也可以改写成 h ( x ) ≤ 0 h(x) \le 0 h(x)≤0,所以上面方程组也可以转换成如下:
{ ∂ L ∂ x = ∂ f ( x ) ∂ x + λ ∂ h ( x ) ∂ x = 0 h ( x ) ≤ 0 λ ⋅ h ( x ) = 0 λ ≥ 0 \left \{\begin{aligned}&\frac{\partial L}{\partial x} = \frac{\partial f(x)}{\partial x} + \lambda \frac{\partial h(x)}{\partial x} = 0\\\\&h(x) \le 0\\\\&\lambda \cdot h(x) =0\\\\&\lambda \ge 0 \end{aligned}\right. ⎩ ⎨ ⎧∂x∂L=∂x∂f(x)+λ∂x∂h(x)=0h(x)≤0λ⋅h(x)=0λ≥0
以上便是不等式约束优化问题的KKT(Karush-Kuhn-Tucker)条件 ,我们回到最开始要处理的问题上,根据③式可知,我们需要找到合适的 x , λ , α x,\lambda,\alpha x,λ,α值使 L ( x , λ , α ) L(x,\lambda,\alpha) L(x,λ,α)最小,但是合适的 x , λ , α x,\lambda,\alpha x,λ,α必须满足KKT条件。
我们对③式的优化问题可以进行优化如下:
m i n L ( x , λ , α ) = f ( x ) + λ ( h ( x ) + α 2 ) λ ≥ 0 − − − 式③ minL(x,\lambda,\alpha) = f(x) + \lambda(h(x) + \alpha^2) \quad \lambda \ge 0\quad---式③ minL(x,λ,α)=f(x)+λ(h(x)+α2)λ≥0−−−式③
m i n L ( x , λ , α ) = f ( x ) + λ ⋅ h ( x ) + λ α 2 minL(x,\lambda,\alpha) = f(x) +\lambda \cdot h(x) +\lambda \alpha^2 minL(x,λ,α)=f(x)+λ⋅h(x)+λα2
由于 α 2 ≥ 0 \alpha^2 \ge 0 α2≥0且 λ ≥ 0 \lambda \ge 0 λ≥0, λ α 2 \lambda \alpha^2 λα2一定大于零,所以进一步可以简化为如下:
m i n L ( x , λ ) = f ( x ) + λ h ( x ) − − − 式⑧ minL(x,\lambda) = f(x) + \lambda h(x) \quad \quad---式⑧ minL(x,λ)=f(x)+λh(x)−−−式⑧
满足最小化⑧式对应的 x , λ x,\lambda x,λ值一定也要满足KKT条件,假设现在我们找到了合适的参数 x x x值使 f ( x ) f(x) f(x)取得最小值P【注意:这里根据①式来说,计算 f ( x ) f(x) f(x)的最小值,这里假设合适参数 x x x值对应的 f ( x ) f(x) f(x) 的值P就是最小值,不存在比这更小的值。 】 ,由于⑧式中 λ h ( x ) \lambda h(x) λh(x)一定小于等于零,所以一定有:
L ( x , λ ) = f ( x ) + λ h ( x ) ≤ P L(x,\lambda) = f(x) + \lambda h(x)\le P L(x,λ)=f(x)+λh(x)≤P
也就是说一定有:
L ( x , λ ) ≤ P L(x,\lambda) \le P L(x,λ)≤P
为了找到最优的 λ \lambda λ值,我们一定想要 L ( x , λ ) L(x,\lambda) L(x,λ)接近P,即找到合适的 λ \lambda λ最大化 L ( x , λ ) L(x,\lambda) L(x,λ),可以写成 max λ L ( x , λ ) \max\limits_{\lambda} L(x,\lambda) λmaxL(x,λ),所以⑧式求解合适的 x , λ x,\lambda x,λ值最终可以转换成如下:
min x max λ L ( x , λ ) s . t λ ≥ 0 − − − 式⑨ \min\limits_{x}\max\limits_{\lambda} L(x,\lambda)\quad s.t\quad \lambda \ge 0\quad ---式⑨ xminλmaxL(x,λ)s.tλ≥0−−−式⑨
3.3、对偶问题
对偶问题是我们定义的一种问题,对于一个不等式约束的原问题:
min x max λ L ( x , λ ) s . t λ ≥ 0 \min\limits_x\max\limits_{\lambda}L(x,\lambda)\quad s.t\quad\lambda \ge 0 xminλmaxL(x,λ)s.tλ≥0
我们定义对偶问题为(对上面方程的求解等效求解下面方程):
max λ min x L ( x , λ ) s . t λ ≥ 0 \max\limits_{\lambda}\min\limits_{x}L(x,\lambda)\quad s.t\quad\lambda \ge 0 λmaxxminL(x,λ)s.tλ≥0
其实就是把min和max对调了一下,当然对应的变量也要变换。
对偶问题有什么好处呢?对于原问题,我们要先求里面的max,再求外面的min。而对于对偶问题,我们可以先求里面的min。有时候,先确定里面关于x的函数最小值,比原问题先求解关于 λ \lambda λ的最大值,要更加容易解。
但是原问题跟对偶问题并不是等价的,这里有一个强对偶性、弱对偶性的概念,弱对偶性是对于所有的对偶问题都有的一个性质。
这里给出一个弱对偶性的推导过程:
max λ min x L ( x , λ ) = min x L ( x , λ ∗ ) ≤ L ( x ∗ , λ ∗ ) ≤ max λ L ( x ∗ , λ ) = min x max λ L ( x , λ ) \max\limits_{\lambda}\min\limits_{x}L(x,\lambda) = \min\limits_xL(x,\lambda^*) \le L(x^*,\lambda^*) \le \max\limits_{\lambda}L(x^*,\lambda)=\min\limits_x\max\limits_{\lambda}L(x,\lambda) λmaxxminL(x,λ)=xminL(x,λ∗)≤L(x∗,λ∗)≤λmaxL(x∗,λ)=xminλmaxL(x,λ)
其中 x ∗ , λ ∗ x^*,\lambda^* x∗,λ∗是函数取最大值最小值的时候对应的最优解,也就是说,原问题始终大于等于对偶问题:
max λ min x L ( x , λ ) ≤ min x max λ L ( x , λ ) \max\limits_{\lambda}\min\limits_{x}L(x,\lambda) \le \min\limits_x\max\limits_{\lambda}L(x,\lambda) λmaxxminL(x,λ)≤xminλmaxL(x,λ)
如果两个问题是强对偶的,那么这两个问题其实是等价的问题:
max λ min x L ( x , λ ) = min x max λ L ( x , λ ) \max\limits_{\lambda}\min\limits_{x}L(x,\lambda) = \min\limits_x\max\limits_{\lambda}L(x,\lambda) λmaxxminL(x,λ)=xminλmaxL(x,λ)
所有的下凸函数都满足强对偶性,也就是说所有下凸函数都满足上式。
4、目标函数优化【硬间隔】
通过2小节【构建SVM目标函数】我们知道SVM目标函数如下:
m i n 1 2 ∣ ∣ w ∣ ∣ s . t y ⋅ ( w T ⋅ x i + b ) ≥ 1 , i = 1 , 2 , ⋯ , n min\frac{1}{2}||w||\quad s.t\quad y\cdot (w^T\cdot x_i +b) \ge 1,\quad i = 1,2,\cdots,n min21∣∣w∣∣s.ty⋅(wT⋅xi+b)≥1,i=1,2,⋯,n
根据拉格朗日乘数法、KKT条件、对偶问题我们可以按照如下步骤来计算SVM目标函数最优的一组w值。
4.1、构造拉格朗日函数
将SVM目标函数转换为如下:
m i n 1 2 ∣ ∣ w ∣ ∣ s . t 1 − y ⋅ ( w T ⋅ x i + b ) ≥ 0 , i = 1 , 2 , ⋯ , n min\frac{1}{2}||w||\quad s.t\quad 1-y\cdot (w^T\cdot x_i +b) \ge 0,\quad i = 1,2,\cdots,n min21∣∣w∣∣s.t1−y⋅(wT⋅xi+b)≥0,i=1,2,⋯,n
根据3.2【KKT条件】中的⑨式构建拉格朗日函数如下:
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 − − − 式 a \min\limits_{w,b}\max\limits_{\lambda}L(w,b,\lambda) = \frac{1}{2}||w||^2 + \sum\limits_{i=1}^n\lambda_i[1-y_i(w^T\cdot x_i +b)] \quad s.t \quad \lambda_i \ge 0\quad ---式a w,bminλmaxL(w,b,λ)=21∣∣w∣∣2+i=1∑nλi[1−yi(wT⋅xi+b)]s.tλi≥0−−−式a
以上不等式转换成拉格朗日函数必须满足KKT条件,详见3.2【KKT条件】,这里满足的KKT条件如下:
{ 1 − y i ( w T ⋅ x i + b ) ≤ 0 λ ( 1 − y i ( w T ⋅ x i + b ) ) = 0 λ ≥ 0 \left\{\begin{aligned}&1-y_i(w^T\cdot x_i + b) \le 0\\\\&\lambda (1-y_i(w^T\cdot x_i + b)) = 0\\\\&\lambda \ge 0\end{aligned}\right. ⎩ ⎨ ⎧1−yi(wT⋅xi+b)≤0λ(1−yi(wT⋅xi+b))=0λ≥0
4.2、对偶转换
由于原始目标函数 1 2 ∣ ∣ w ∣ ∣ \frac{1}{2}||w|| 21∣∣w∣∣是个下凸函数,根据3.3【对偶问题】可知 L ( w , b , λ ) L(w,b,\lambda) L(w,b,λ)一定是强对偶问题,所以可以将a式改写成如下:
max λ min w , b L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 n λ i [ 1 − y i ( w T ⋅ x i + b ) ] s . t λ i ≥ 0 − − − 式 b \max\limits_{\lambda}\min\limits_{w,b}L(w,b,\lambda) = \frac{1}{2}||w||^2 + \sum\limits_{i=1}^n\lambda_i[1-y_i(w^T\cdot x_i +b)] \quad s.t \quad \lambda_i \ge 0\quad ---式b λmaxw,bminL(w,b,λ)=21∣∣w∣∣2+i=1∑nλi[1−yi(wT⋅xi+b)]s.tλi≥0−−−式b
针对b式,我们假设参数 λ \lambda λ固定,使 L ( w , b , λ ) L(w,b,\lambda) L(w,b,λ)对参数w和b进行求导得到如下:
{ ∂ L ∂ w = w − ∑ i = 1 n λ i ⋅ x i ⋅ y i = 0 ∂ L ∂ b = ∑ i = 1 n λ i ⋅ y i = 0 \left\{\begin{aligned}&\frac{\partial L}{\partial w}=w - \sum\limits_{i=1}^n\lambda_i\cdot x_i\cdot y_i = 0\\\\&\frac{\partial L}{\partial b}=\sum\limits_{i=1}^n\lambda_i\cdot y_i = 0\end{aligned}\right. ⎩ ⎨ ⎧∂w∂L=w−i=1∑nλi⋅xi⋅yi=0∂b∂L=i=1∑nλi⋅yi=0
进一步可以得到:
{ ∑ i = 1 n λ i ⋅ x i ⋅ y i = w ∑ i = 1 n λ i ⋅ y i = 0 − − − 式 c \left\{\begin{aligned}&\sum\limits_{i=1}^n\lambda_i\cdot x_i\cdot y_i = w\\\\&\sum\limits_{i=1}^n\lambda_i\cdot y_i = 0\end{aligned}\right.\quad --- 式c ⎩ ⎨ ⎧i=1∑nλi⋅xi⋅yi=wi=1∑nλi⋅yi=0−−−式c
按照解方程组的思想,我们现在将以上计算得到的结果代入到b式中得到:
max λ L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 n λ i [ 1 − y i ( w T ⋅ x i + b ) ] = 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( x i ⋅ x j ) + ∑ i = 1 n λ i − ∑ i = 1 n λ i y i ( ∑ j = 1 n λ j x j y j ⋅ x i + b ) = 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( x i ⋅ x j ) + ∑ i = 1 n λ i − ∑ i = 1 n ∑ j = 1 n λ i y i λ j y j ( x i ⋅ x j ) − ∑ i = 1 n λ i y i b = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( x i ⋅ x j ) s . t ∑ i = 1 n λ i y i = 0 , λ i ≥ 0 \begin{aligned}&\max\limits_{\lambda}L(w,b,\lambda) = \frac{1}{2}||w||^2 +\sum\limits_{i=1}^n\lambda_i[1 - y_i(w^T\cdot x_i + b)]\\\\&=\frac{1}{2}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_i\lambda_j y_i y_j(x_i\cdot x_j) +\sum\limits_{i=1}^n\lambda_i -\sum\limits_{i=1}^n\lambda_iy_i(\sum\limits_{j=1}^n\lambda_jx_jy_j\cdot x_i +b)\\\\&=\frac{1}{2}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_i\lambda_j y_i y_j(x_i\cdot x_j) +\sum\limits_{i=1}^n\lambda_i -\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_iy_i\lambda_jy_j(x_i\cdot x_j)-\sum\limits_{i=1}^n\lambda_i y_i b\\\\&=\sum\limits_{i=1}^n\lambda_i-\frac{1}{2}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_i\lambda_j y_i y_j(x_i\cdot x_j)\quad s.t \quad \sum\limits_{i=1}^n\lambda_iy_i = 0,\lambda_i \ge 0\end{aligned} λmaxL(w,b,λ)=21∣∣w∣∣2+i=1∑nλi[1−yi(wT⋅xi+b)]=21i=1∑nj=1∑nλiλjyiyj(xi⋅xj)+i=1∑nλi−i=1∑nλiyi(j=1∑nλjxjyj⋅xi+b)=21i=1∑nj=1∑nλiλjyiyj(xi⋅xj)+i=1∑nλi−i=1∑nj=1∑nλiyiλjyj(xi⋅xj)−i=1∑nλiyib=i=1∑nλi−21i=1∑nj=1∑nλiλjyiyj(xi⋅xj)s.ti=1∑nλiyi=0,λi≥0
即:
max λ L ( w , b , λ ) = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( x i ⋅ x j ) − − − 式 d s . t ∑ i = 1 n λ i y i = 0 , λ i ≥ 0 \begin{aligned}&\max\limits_{\lambda}L(w,b,\lambda) = \sum\limits_{i=1}^n\lambda_i-\frac{1}{2}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_i\lambda_j y_i y_j(x_i\cdot x_j)\quad---式d\\\\& s.t \quad \sum\limits_{i=1}^n\lambda_iy_i = 0,\lambda_i \ge 0\end{aligned} λmaxL(w,b,λ)=i=1∑nλi−21i=1∑nj=1∑nλiλjyiyj(xi⋅xj)−−−式ds.ti=1∑nλiyi=0,λi≥0
我们可以发现以上公式经过转换只含有 λ \lambda λ的方程求极值问题,但是 λ \lambda λ含有 λ i , λ j , ⋯ \lambda_i,\lambda_j,\cdots λi,λj,⋯这些未知数(注意不是2个),那么我们要求的一组w如何得到呢?只要针对以上公式得到 λ \lambda λ值后,我们可以根据c式进一步求解到对应的一组w值。针对上式求极值问题,我们常用 SMO(Sequential Minimal Optimization) 算法求解 λ i , λ j , ⋯ \lambda_i,\lambda_j,\cdots λi,λj,⋯。
注意:d式中 ( x i ⋅ x j ) (x_i\cdot x_j) (xi⋅xj)代表两个向量的点积,也叫内积,例如: x i = ( x i 1 , x i 2 ) , x j = ( x j 1 , x j 2 ) x_i = (x_{i1},x_{i2}),x_j = (x_{j1},x_{j2}) xi=(xi1,xi2),xj=(xj1,xj2)那么两个向量点积结果为 x i 1 ∗ x j 1 + x i 2 ∗ x j 2 x_{i1} * x_{j1} + x_{i2} * x_{j2} xi1∗xj1+xi2∗xj2。
4.3、SMO算法求解(了解)
SMO(Sequential Minimal Optimization),序列最小优化算法,其核心思想非常简单:每次只优化一个参数,其他参数先固定住,仅求当前这个优化参数的极值。下面我们只说SVM中如何利用SMO算法进行求解最终结果的,这里不再进行公式推导。
max λ L ( w , b , λ ) = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j ( x i ⋅ x j ) − − − 式 d s . t ∑ i = 1 n λ i y i = 0 , λ i ≥ 0 \begin{aligned}&\max\limits_{\lambda}L(w,b,\lambda) = \sum\limits_{i=1}^n\lambda_i-\frac{1}{2}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\lambda_i\lambda_j y_i y_j(x_i\cdot x_j)\quad---式d\\\\& s.t \quad \sum\limits_{i=1}^n\lambda_iy_i = 0,\lambda_i \ge 0\end{aligned} λmaxL(w,b,λ)=i=1∑nλi−21i=1∑nj=1∑nλiλjyiyj(xi⋅xj)−−−式ds.ti=1∑nλiyi=0,λi≥0
我们根据d式可以看到有 λ i , λ j , i = 1 , 2 , ⋯ , n , j = 1 , 2 , ⋯ , n \lambda_i,\lambda_j,i = 1,2,\cdots,n,j = 1,2,\cdots,n λi,λj,i=1,2,⋯,n,j=1,2,⋯,n 很多参数,由于优化目标中含有约束条件: ∑ i = 1 n λ i y i = 0 \sum\limits_{i=1}^n\lambda_iy_i = 0 i=1∑nλiyi=0,此约束条件中 i = 1 , 2 , ⋯ , n i = 1,2,\cdots,n i=1,2,⋯,n, y i y_i yi代表每个样本所属类别-1或者1。
根据SMO算法假设将 λ 3 , λ 4 , ⋯ , λ n \lambda_3,\lambda_4,\cdots,\lambda_n λ3,λ4,⋯,λn参数固定,那么 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2之间的关系也确定了,可以将约束条件: ∑ i = 1 n λ i y i = 0 \sum\limits_{i=1}^n\lambda_iy_i = 0 i=1∑nλiyi=0改写成
λ 1 y + λ 2 y 2 + c = 0 − − − 式 e \lambda_1y_ + \lambda_2y_2 +c = 0 \quad ---式e λ1y+λ2y2+c=0−−−式e
我们可以将上式中c看成是 λ 3 , λ 4 , ⋯ , λ n \lambda_3,\lambda_4,\cdots,\lambda_n λ3,λ4,⋯,λn乘以对应的类别 y y y得到的常数,根据e式我们发现 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2之间有等式关系,即: λ 2 = − c − λ 1 y 1 y 2 \lambda_2 = \frac{-c - \lambda_1 y_1}{y_2} λ2=y2−c−λ1y1,也就是说我们可以使用 λ 1 \lambda_1 λ1的表达式代替 λ 2 \lambda_2 λ2,这样我们就可以将d式看成只含有 λ 1 ≥ 0 \lambda_1 \ge 0 λ1≥0这一个条件下最优化问题,并且我们可以将 λ 2 = − c − λ 1 y 1 y 2 \lambda_2 = \frac{-c - \lambda_1 y_1}{y_2} λ2=y2−c−λ1y1代入到d式,d式中只含有 λ 1 \lambda_1 λ1一个未知数求极值问题,可以对函数进行求导,令导数为零,得到 λ 1 \lambda_1 λ1的值,然后根据 λ 1 \lambda_1 λ1的值计算出 λ 2 \lambda_2 λ2的值。通过以上固定参数方式多次迭代计算得到一组 λ \lambda λ值。
然后对其他的 λ \lambda λ组【 λ 3 , λ 4 \lambda_3,\lambda_4 λ3,λ4】,进行相同操作,多次执行,即可得到全部 λ \lambda λ,for循环迭代优化,即可!
4.4、计算分割线w和b的值
根据4.2中的c式,如下:
{ ∑ i = 1 n λ i ⋅ x i ⋅ y i = w ∑ i = 1 n λ i ⋅ y i = 0 − − − 式 c \left\{\begin{aligned}&\sum\limits_{i=1}^n\lambda_i\cdot x_i\cdot y_i = w\\\\&\sum\limits_{i=1}^n\lambda_i\cdot y_i = 0\end{aligned}\right.\quad --- 式c ⎩ ⎨ ⎧i=1∑nλi⋅xi⋅yi=wi=1∑nλi⋅yi=0−−−式c
我们可以知道获取了一组 λ \lambda λ的值,我们可以得到一组w对应的值。根据4.1中的KKT条件:
{ 1 − y i ( w T ⋅ x i + b ) ≤ 0 λ ( 1 − y i ( w T ⋅ x i + b ) ) = 0 − − − 式 f λ ≥ 0 \left\{\begin{aligned}&1-y_i(w^T\cdot x_i + b) \le 0\\\\&\lambda (1-y_i(w^T\cdot x_i + b)) = 0\quad ---式f\\\\&\lambda \ge 0\end{aligned}\right. ⎩ ⎨ ⎧1−yi(wT⋅xi+b)≤0λ(1−yi(wT⋅xi+b))=0−−−式fλ≥0
根据f式中式可知,当 λ \lambda λ时,一定有$ 1-y_i(w^T\cdot x_i + b) = 0$,对于这样的样本就属于支持向量点,就在分类边界上,我们将对应的w代入到下式中
y i ( w T ⋅ x i + b ) = 1 − − − 式 g y_i(w^T\cdot x_i + b) = 1 \quad ---式g yi(wT⋅xi+b)=1−−−式g
一定可以计算出b的值。我们将g式两边乘以 y i y_i yi,得到
y i 2 ( w T ⋅ x i + b ) = y i y_i^2(w^T\cdot x_i + b) = y_i yi2(wT⋅xi+b)=yi
由于 y i 2 = 1 y_i^2 = 1 yi2=1,所以得到最终b的结果如下:
b = y i − w T ⋅ x i b = y_i - w^T\cdot x_i b=yi−wT⋅xi
假设我们有S个支持向量,以上b的计算可以使用任意一个支持向量代入计算即可,如果数据严格是线性可分的,这些b结果是一致的。对于数据不是严格线性可分的情况,参照后面的软间隔问题,一般我们可以采用一种更健壮的方式,将所有支持向量对应的b都求出,然后将其平均值作为最后的结果,最终b的结果如下:
b = 1 S ∑ i ∈ S ( y i − w T ⋅ x i ) b = \frac{1}{S}\sum\limits_{i \in S}(y_i - w^T \cdot x_i) b=S1i∈S∑(yi−wT⋅xi)
S代表支持向量点的集合,也就是在边界上点的集合。
综上所述,我们可以的到最终的w和b的值如下:
{ w = ∑ i = 1 n λ i ⋅ x i ⋅ y i b = 1 S ∑ i ∈ S ( y i − w T ⋅ x i ) \left\{\begin{aligned}&w = \sum\limits_{i=1}^n\lambda_i\cdot x_i\cdot y_i \\\\&b = \frac{1}{S}\sum\limits_{i \in S}(y_i - w^T \cdot x_i)\end{aligned}\right. ⎩ ⎨ ⎧w=i=1∑nλi⋅xi⋅yib=S1i∈S∑(yi−wT⋅xi)
确定w和b之后,我们就能构造出最大分割超平面: w T ⋅ x + b = 0 w^T\cdot x + b = 0 wT⋅x+b=0,新来样本对应的特征代入后得到的结果如果是大于0那么属于一类,小于0属于另一类。
原理与可视化
# 超平面,怎么找到的
导包
import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
创建数据
X = np.random.randn(3000,2) # 训练数据y = [1 if i > 0 else 0 for i in X[:,0] * X[:,1]]plt.scatter(X[:,0],X[:,1],c = y)
<matplotlib.collections.PathCollection at 0x189e97eb760>
建模学习
svc = SVC(kernel='poly',degree=2)# 高斯核函数,数据变换,变形,升维
svc.fit(X,y)
svc.score(X,y)
0.9943333333333333
创建预测数据
a = [2,3,5]
b = [1,4,7,9]print(a,b)
[2, 3, 5] [1, 4, 7, 9]
A,B = np.meshgrid(a,b)
print(A)
print('---------')
print(B)
plt.scatter(A,B)
[[2 3 5][2 3 5][2 3 5][2 3 5]]
---------
[[1 1 1][4 4 4][7 7 7][9 9 9]]<matplotlib.collections.PathCollection at 0x189e9270400>
f1 = np.linspace(-3,3,200)
f2 = np.linspace(-3,3,180)F1,F2 = np.meshgrid(f1,f2) # 网格交叉
X_test = np.column_stack([F1.ravel(),F2.reshape(-1)])plt.scatter(X_test[:,0],X_test[:,1])
<matplotlib.collections.PathCollection at 0x189ea04bb80>
算法预测
# 算法给我们的预测的类别
y_pred = svc.predict(X_test)plt.scatter(X_test[:,0],X_test[:,1],c = y_pred)
<matplotlib.collections.PathCollection at 0x189e98b30a0>
算法原理可视化【超平面】
d = svc.decision_function(X_test)
d
array([102.28708056, 101.26529785, 100.24339038, ..., 100.24339038,101.26529785, 102.28708056])
d.min()
-103.5053953169917
绘制轮廓线
plt.figure(figsize=(6,6))
plt.contour(F1,F2,d.reshape(180,200))# 等高线
<matplotlib.contour.QuadContourSet at 0x189eb1e1b50>
轮廓面
plt.figure(figsize=(6,6))
plt.contourf(F1,F2,d.reshape(180,200))
<matplotlib.contour.QuadContourSet at 0x189ed0713d0>
3D显示距离
plt.figure(figsize=(12,9))
ax = plt.subplot(111,projection = '3d')ax.contourf(F1,F2,d.reshape(-1,200))
ax.view_init(50,-30)
相关文章:
【机器学习】SVM支持向量机(一)
介绍 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点,并且尽可能地最大化离该超平面最近的数据点(支持向量…...
无需配置设备,借助GitHub快速编译项目并直接运行!
引言 你是否曾经有过类似的烦恼,发现了一个有趣的项目,想要测试一下,但是自己的设备没有对应的开发环境或者受制于自己的设备,不想或者不能去配置对应的开发环境,应该怎么办呢?这种情况下,其实…...
【C#联合halcon实现绘制ROI功能】
前言 C#联合halcon实现绘制ROI功能: C#联合Halcon,使用HDrawingObject、HDrawingObjectXld,绘制矩形、方向矩形、圆形、椭圆、自定义ROI。支持拖动、重设大小、选中,右键复制、粘贴、删除功能。 运行结果 代码 代码结构 MainFo…...
语言模型的革命:大型概念模型(LCM)的崛起
在人工智能领域,Meta最近推出的一项重大突破正在引起研究人员和开发者的广泛关注:大型概念模型(Large Concept Models,简称LCM)。这一创新彻底改变了我们对语言模型的理解,并为未来AI技术的进展指明了新的方…...
在C#中获取程序的命令行参数
实现此目的的一种方法是重写程序的Main方法并赋予其一个字符串数组参数,如下面的代码所示。 static void Main(string[] args) {foreach (string arg in args){lstArguments.Items.Add(arg);} } 这种方法是从 C 编程语言继承而来的。 我更喜欢下面的方法…...
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
全文链接:https://tecdat.cn/?p38667 摘要:在母婴暴露于空气污染对儿童健康影响的研究中,常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型(DLNM)是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...
小程序基础 —— 08 文件和目录结构
文件和目录结构 一个完整的小程序项目由两部分组成:主体文件、页面文件: 主体文件:全局文件,能够作用于整个小程序,影响小程序的每个页面,主体文件必须放到项目的根目录下; 主体文件由三部分组…...
bishengjdk-8
title: 深入探索 BishengJDK-8:技术魅力与优势尽显 date: 2024-12-29 category: blog tags:- BishengJDK-8- Java 开发- 性能优化- 技术剖析 sig: BishengJDK archives: 2024-12 author:- way_back summary: BishengJDK-8 作为一款备受瞩目的 JDK 版本,以…...
Android9.x SurfaceView源码分析
前言 本文是继Android 深入理解SurfaceView再次对SurfaceView进行源码分析。 看了下代码,上篇文章是基于Android7.x的,本篇基于Android9.x再次进行分析, Android从7.0开始支持SurfaceView动画,并建议7.0之后使用SurfaceView替代TextureView,这里主要在Android9.0上分析Su…...
分布式 IO 模块助力冲压机械臂产线实现智能控制
在当今制造业蓬勃发展的浪潮中,冲压机械臂产线的智能化控制已然成为提升生产效率、保障产品质量以及增强企业竞争力的关键所在。而分布式 IO 模块的应用,正如同为这条产线注入了一股强大的智能动力,开启了全新的高效生产篇章。 传统挑战 冲压…...
解决VMware的ubuntu22虚拟机没有网络
解决步骤 1.在 Windows 系统中,按 “WinR” 键,输入 “services.msc” 并回车,在服务列表中找到 “VMware DHCP Service” 和 “VMware NAT Service”,确保这两个服务已启动,若未启动则右键点击选择 “启动”…...
Linux arm 编译安装glibc-2.29
重要的话说三遍: !!!!!不要轻易自己去安装glibc!!!!! !!!!!不要轻易自己去安装glibc&a…...
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
介绍 安装自己的linux-server,可以作为学习使用,web方式访问,基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …...
linux 7.6安装mysql 8.0步骤如下
linux 7.6安装mysql 8.0步骤如下: 注意:在导入密钥的时候这个不行,可更换为 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023...
meshy的文本到3d的使用
Meshy官方网站: 中文官网: Meshy官网中文站 编辑 Opens in a new window 编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…...
抓取手机HCI日志
荣耀手机 1、打开开发者模式 2、开启HCI、ADB调试 3、开启AP LOG 拨号界面输入*##2846579##* 4、蓝牙配对 5、抓取log adb pull /data/log/bt ./...
如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈
如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈 h5如何转小程序 如果当年你们开发网站是用的h5但是没有开发小程序,也没有使用uniapp这样的混开框架,但是目前根据业务需…...
2024:踏平坎坷成大道,斗罢艰险又出发!
一、开篇 12月今年最后一个月了,相逢的人已走散,Q4的OKR已经定型了,很平淡无味、闲的无聊,提前写个年终总结吧。25年,再过一个月就35岁了,一个人来北京也已经11年了。年近末尾,思绪良多。回顾过…...
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
文章目录 一、Qt For Android运行示例二、个人理解及情况解析三、配置Android相关配置项3.1 安装简述3.2 安装Qt1.安装Qt第一步:启动Qt安装包程序2.Qt账号(注册)登录3.了解Qt开源使用义务4.指定Qt安装目录5.选择Qt安装内容6.接受“许可协议”…...
LLaMA详解
LLaMA 进化史 大规模语言模型(Large Language Model, LLM)的快速发展正在以前所未有的速度推动人工智能(AI)技术的进步。 作为这一领域的先行者, Meta在其LLaMA(Large Language Model Meta AI)系列模型上取得了一系列重大突破。 近日, Meta官方正式宣布推出LLaMA-3, 作为继LL…...
【学生管理系统】权限管理之用户管理
目录 6. 权限管理 6.1 环境搭建 6.1.1 数据库 6.1.2 后端环境 6.2 用户管理 6.2.1 查询所有用户(关联角色) 6.2.2 核心1:给用户授予角色 6. 权限管理 6.1 环境搭建 6.1.1 数据库 权限管理的5张表的关系 添加4张表 # 权限表&…...
基于Java+Springboot+Vue开发的旅游景区管理系统,实习作品
项目简介 该项目是基于JavaSpringbootVue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅…...
人工智能及深度学习的一些题目
1、一个含有2个隐藏层的多层感知机(MLP),神经元个数都为20,输入和输出节点分别由8和5个节点,这个网络有多少权重值? 答:在MLP中,权重是连接神经元的参数,每个连接都有一…...
JavaFX FXML模式下的布局
常见布局方式概述 在 JavaFX FXML 模式下,有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件,以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点:BorderPane 将空间划分为五个区域&…...
在 Windows 11 下的 WSL - Ubuntu 24.04 中安装 CUDA 的记录
#记录工作 以下是基于CUDA官网给定命令在 Windows 11 下的 WSL - Ubuntu 24.04 中安装 CUDA 的记录: 一、准备工作 确保你的 Windows 11 系统已经成功启用 WSL 功能,并且已经安装了 Ubuntu 24.04 操作系统。同时,确保系统处于联网状态&#…...
Qt 12.28 day3
作业: 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…...
AISuite:提供了统一的跨 LLM API的开源 Python 库
1. 简介: AISuite是一个开源的Python库,旨在提供一个统一的接口来调用不同的大型语言模型(LLM)API。这个工具由吴恩达(Andrew Ng)领导开发,目的是简化AI模型的调用过程,使得开发者能…...
springMVC-请求响应
springmvc——一 站式web框架,核心是处理http请求响应。 前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服…...
【代码分析】Unet-Pytorch
1:unet_parts.py 主要包含: 【1】double conv,双层卷积 【2】down,下采样 【3】up,上采样 【4】out conv,输出卷积 """ Parts of the U-Net model """import torch im…...
uni-app开发-识图小程序-个人中心页面
目录 一:功能描述 二:代码实现 一:功能描述 个人中心中心主要包含用户登录信息,退出登录,图像识别记录,分类识别记录,分享记录以及小程序介绍信息。用户登录状态下可以看到图形识别记录,分类识别记录和分享记录,未登录状态只能看到介绍信息,点击未登录文字会触发…...
C++小游戏
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 设计一个桌面游戏是一个有趣且富有挑战性的项目。下面是一个简单的C桌面游戏的设计思路和示例代码。我们将创建一个简单的“猜数字”游戏,玩家需要在有限的尝试次数内猜测一个随机生成的数字。 游戏…...
Flutter封装一个三方ViewPager学习
Flutter如何实现一个增强的 PageView,支持自定义页面切换动画。 前置知识点学习 CrossAxisAlignment CrossAxisAlignment 是 Flutter 中用于控制布局子组件在交叉轴(cross axis)方向上的对齐方式的一个枚举类。它主要在 Flex 布局模型中使…...
【算法】复杂性理论初步
六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P,则存在确定性多项式时间的图灵机 M M M,使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…...
vscode实用插件(持续更新)
目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比,方便代码评审!解决了为了一个问题而多次commit,导致代码不好评审,即不晓得和远程分支相比࿰…...
使用Lodash工具库的orderby和sortby进行排序的区别
简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序,并为每个属性指定排序方向(升序或降序)。默认所有值为升序排,指定为"desc" 降序,…...
胡闹厨房练习(三)
ScriptableObject 一、初步了解 1、实质:是一种特殊类型的Unity对象, 2、作用:用于存储大量数据,而不必依附于游戏场景中的某个GameObject。 3、特点: 可以在不增加场景中对象数量的情况下,管理和存储复杂的数据结构、配置信息、游戏状态等。 4、适用:非常适合用来…...
Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档
目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试? 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...
算法进阶:贪心算法
贪心算法是一种简单而直观的算法思想,它在每一步选择中都采取在当前状态下最优的选择,以期望最终得到全局最优解。贪心算法通常适用于一些具有最优子结构的问题,即问题的最优解可以通过一系列局部最优解的选择得到。 贪心算法的基本思路是&a…...
深度学习笔记(6)——循环神经网络RNN
循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) htfW(ht−1,xt) 一般来说 h t t a n h ( W h h h t − 1 W x h x t ) h_ttanh(W_{hh}h_{t-1}W_{xh}x_t) httanh(Whhht−1Wxhxt…...
电商项目高级篇07-redisson分布式锁
redisson分布式锁 1、引入maven依赖2、config类3、可重入锁设计 1、引入maven依赖 <!--引入redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></depend…...
STM32中断详解
STM32中断详解 NVIC 中断系统中断向量表相关寄存器中断优先级中断配置 外部中断实验EXTI框图外部中断/事件线映射中断步骤初始化代码实现 定时器中断通用定时器相关功能标号1:时钟源标号 2:控制器标号 3:时基单元 代码实现 NVIC 中断系统 STM…...
KNN分类算法 HNUST【数据分析技术】(2025)
1.理论知识 KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想: 对于任意n维输入向量,分别对应于特征…...
【Win11】安装 VMware17 和 Ubuntu
【Win11】安装 VMware17 和 Ubuntu 15 版本和 Win11 家庭版间的兼容应该有 BUG,请直接跳至【VMware 17】 安装【VMware 15】 本来是按如下资源链接安装的,但发现 15 版本和 Win11 家庭版间的兼容应该有 BUG,在安装并关闭 Hyper-Vÿ…...
Jmeter快速入门
目录 1.安装Jmeter 1.1.下载 1.2.解压 1.3.运行 2.快速入门 2.1.设置中文语言 2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载,地址…...
Android Studio2024版本安装环境SDK、Gradle配置
一、软件版本,安装包附上 👉android-studio-2024.1.2.12-windows.exe👈 👉百度网盘Android Studio安装包👈 (若下载连链接失效可去百度网盘链接下载) 二、软件安装过程 三、准备运行…...
嵌入式单片机窗口看门狗控制与实现
窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示...
[单master节点k8s部署]43.全链路监控(二)
部署pinpoint服务端 这里安装的是pinpoint-docker,可以从GitHub - pinpoint-apm/pinpoint-docker: Officix 下载。通过readme可以看到,该项目提供的镜像: Pinpoint-Web ServerPinpoint-CollectorPinpoint-AgentPinpoint-FlinkPinpoint-Hba…...
Apache Doris 创始人:何为“现代化”的数据仓库?
在 12 月 14 日的 Doris Summit Asia 2024 上,Apache Doris 创始人 & PMC 成员马如悦在开场演讲中,围绕“现代化数据仓库”这一主题,指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“…...
json的作用?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁、易读、易于解析和生成等特点,在前后端数据交互、配置文件、数据存储等多个领域发挥着重要作用,以下是具体介绍: JSON 的作用 数据…...
ChatGPT是如何生成长文的
说实话,现在我们对chatGPT的最深的印象就是他是一个各方面知识都比较全面的机器助手,我们的问题他都能生成答案,不过大家发现没有,它生成相对应的长文的时候,都是一个词一个词蹦出来的,有的时候是一个个词组…...